[petsc-users] Question about DMPLEX/P4EST with different Sections

Berend van Wachem berend.vanwachem at ovgu.de
Thu Mar 19 08:59:32 CDT 2020


Dear Matt,

I haven't been able to progress further with changing the Section of a 
P4EST DM.  Therefore, what do you think of the following strategy:

1. Create the DMPlex versions of dmIn and dmOut from the subsequent 
P4EST DM's
2. Create the appropriate sections onto the DMPlex versions of dmIn and 
dmOut
3. Get the star forests and ChildIDs
4. Use the functions  DMPlexTransferVecTree_Interpolate and 
DMPlexTransferVecTree_Inject with the DMPlex dms, star forest and ChildIDs

Do you think this is a viable strategy? I'd like your opinion before I 
start on this journey ...

Thanks and my best wishes in these difficult times,

Berend.


On 2020-03-13 14:50, Matthew Knepley wrote:
> On Fri, Mar 13, 2020 at 9:45 AM Berend van Wachem 
> <berend.vanwachem at ovgu.de <mailto:berend.vanwachem at ovgu.de>> wrote:
> 
>     Dear Matt,
> 
>     Thanks for your response. My understanding of the DM and DMClone is the
>     same - and I have tested this with a DMPLEX DM without problems.
> 
>     However, for some reason, I cannot change/set the section of a P4EST
>     dm.
>     In the attached example code, I get an error in line 140, where I
>     try to
>     create a new section from the cloned P4EST DM. Is it not possible to
>     create/set a section on a P4EST DM? Or maybe I am doing something else
>     wrong? Do you suggest a workaround?
> 
> 
> Ah, I see. Let me check your example.
> 
> Toby, is this the way p4est acts right now?
> 
>    Thanks,
> 
>       Matt
> 
>     Many thanks, Berend.
> 
> 
>     On 2020-03-13 00:19, Matthew Knepley wrote:
>      > On Thu, Mar 12, 2020 at 7:40 AM Berend van Wachem
>      > <berend.vanwachem at ovgu.de <mailto:berend.vanwachem at ovgu.de>
>     <mailto:berend.vanwachem at ovgu.de <mailto:berend.vanwachem at ovgu.de>>>
>     wrote:
>      >
>      >     Dear All,
>      >
>      >     I have started to use DMPLEX with P4EST for a computational fluid
>      >     dynamics application. I am solving a coupled system of 4
>     discretised
>      >     equations (for 3 velocity components and one pressure) on a mesh.
>      >     However, next to these 4 variables, I also have a few single
>     field
>      >     variables (such as density and viscosity) defined over the mesh,
>      >     which I
>      >     don't solve for (they should not be part of the matrix with
>     unknowns).
>      >     Most of these variables are at the cell centers, but in a few
>     cases, it
>      >     want to define them at cell faces.
>      >
>      >     With just DMPLEX, I solve this by:
>      >
>      >     DMPlexCreateMesh, so I get an initial DM
>      >     DMPlexCreateSection, indicating the need for 4 variables
>      >     DMSetLocalSection
>      >     DMCreateGlobalVector (and Matrix), so I get an Unknown
>     vector, a RHS
>      >     vector, and a matrix for the 4 variables.
>      >
>      >     To get a vector for a single variable at the cell center or
>     the cell
>      >     face, I clone the original DM, I define a new Section on it,
>     and then
>      >     create the vector from that which I need (e.g. for density,
>      >     viscosity or
>      >     a velocity at the cell face).
>      >
>      >     Then I loop over the mesh, and with MatSetValuesLocal, I set the
>      >     coefficients. After that, I solve the system for multiple
>     timesteps
>      >     (sequential solves) and get the solution vector with the 4
>     variables
>      >     after each solve.
>      >
>      >     So-far, this works fine with DMPLEX. However, now I want to
>     use P4EST,
>      >     and I have difficulty defining a variable vector other than the
>      >     original 4.
>      >
>      >     I have changed the code structure:
>      >
>      >     DMPlexCreateMesh, so I get an initial DM
>      >     DMPlexCreateSection, indicating the need for 4 variables
>      >     DMSetLocalSection
>      >     DMForestSetBaseDM(DM, DMForest) to create a DMForest
>      >     DMCreateGlobalVector (and Matrix), so I get a Unknown vector,
>     a RHS
>      >     vector, and a matrix for the 4 variables
>      >
>      >     then I perform multiple time-steps,
>      >         DMForestTemplate(DMForest ->  DMForestPost)
>      >         Adapt DMForestPost
>      >         DMCreateGlovalVector(DMForestPost, RefinedUnknownVector)
>      >         DMForestTransferVec(UnknownVector , RefinedUnknownVector)
>      >         DMForestPost -> DMForest
>      >     and then DMConvert(DMForest,DMPLEX,DM)
>      >     and I can solve the system as usual. That also seems to work.
>      >
>      >     But my conceptual question: how can I convert the other variable
>      >     vectors
>      >     (obtained with a different section on the same DM) such as
>     density and
>      >     viscosity and faceVelocity within this framework?
>      >
>      >
>      > Here is my current thinking about DMs. A DM is a function space
>      > overlaying a topology. Much to my dismay, we
>      > do not have a topology object, so it hides inside DM. DMClone()
>     creates
>      > a shallow copy of the topology. We use
>      > this to have any number of data layouts through PetscSection, laying
>      > over the same underlying topology.
>      >
>      > So for each layout you have, make a separate clone. Then things like
>      > TransferVec() will respond to the layout in
>      > that clone. Certainly it works this way in Plex. I admit to not
>     having
>      > tried this for TransferVec(), but let me know if
>      > you have any problems.
>      >
>      > BTW, I usually use a dm for the solution, which I give to the
>     solver,
>      > say SNESSetDM(snes, dm), and then clone
>      > it as dmAux which has the layout for all the auxiliary fields
>     that are
>      > not involved in the solve. The Plex examples
>      > all use this form.
>      >
>      >    Thanks,
>      >
>      >       Matt
>      >
>      >     The DMForest has the same Section as the original DM and will
>     thus have
>      >     the space for exactly 4 variables per cell. I tried pushing
>     another
>      >     section on the DMForest and DMForestPost, but that does not
>     seem to
>      >     work. Please find attached a working example with code to do
>     this,
>      >     but I
>      >     get the error:
>      >
>      >     PETSC ERROR: PetscSectionGetChart() line 513 in
>      >   
>       /usr/local/petsc-3.12.4/src/vec/is/section/interface/section.c Wrong
>      >     type of object: Parameter # 1
>      >
>      >     So, I is there a way to DMForestTransferVec my other vectors
>     from one
>      >     DMForest to DMForestPost. How can I do this?
>      >
>      >     Many thanks for your help!
>      >
>      >     Best wishes, Berend.
>      >
>      >
>      >
>      > --
>      > 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/>


More information about the petsc-users mailing list