[petsc-users] Additiional DoF per cell

Matthew Knepley knepley at gmail.com
Wed May 6 09:06:05 CDT 2026


Okay, this is a problem with specifying the space I believe. You want a
discontinuous space for pressure.

Here is what I get

Discrete System with 2 fields
    cell total dim 11 total comp 3
  Field Q1 FEM 2 components (implicit) (Nq 4 Nqc 1) 1-jet
    PetscFE Object: Q1 (mech_) 1 MPI process
      type: vector
      Vector Finite Element in 2 dimensions with 2 components
      PetscSpace Object: Q1 (mech_) 1 MPI process
        type: sum
        Space in 2 variables with 2 components, size 8
        Sum space of 2 concatenated subspaces (all identical)
          PetscSpace Object: Q1 (mech_sumcomp_) 1 MPI process
            type: tensor
            Space in 2 variables with 1 components, size 4
            Tensor space of 2 subspaces (all identical)
              PetscSpace Object: sum component tensor component
(mech_sumcomp_tensorcomp_) 1 MPI process
                type: poly
                Space in 1 variables with 1 components, size 2
                Polynomial space of degree 1
      PetscDualSpace Object: Q1 (mech_) 1 MPI process
        type: sum
        Dual space with 2 components, size 8
        Sum dual space of 2 concatenated subspaces (all identical)
          PetscDualSpace Object: Q1 1 MPI process
            type: lagrange
            Dual space with 1 components, size 4
            Continuous tensor Lagrange dual space
        Quadrature on a quadrilateral of order 3 on 4 points (dim 2)
  Field Q1 FEM 1 component  (implicit) (Nq 4 Nqc 1) 1-jet
    PetscFE Object: Q1 (pres_) 1 MPI process
      type: basic
      Basic Finite Element in 2 dimensions with 1 components
      PetscSpace Object: Q1 (pres_) 1 MPI process
        type: poly
        Space in 2 variables with 1 components, size 3
        Polynomial space of degree 1
      PetscDualSpace Object: Q1 (pres_) 1 MPI process
        type: lagrange
        Dual space with 1 components, size 3
        Discontinuous Lagrange dual space
        Quadrature on a quadrilateral of order 3 on 4 points (dim 2)
  Weak Form System with 2 fields

I have attached the code I used.

  Thanks,

      Matt

On Wed, May 6, 2026 at 9:32 AM Noam T. <dontbugthedevs at proton.me> wrote:

>
> Field p FEM 3 components (implicit) (Nq 4 Nqc 1) 1-jet
>
>
> 1. Why does pressure have 3 components in 2D?
>
>
> I used nc = 3 when calling PetscFECreateDefault() for the pressure field.
> Confusion between wanting 3 addditional DoF and components.
>
> With nc = 1 the closure size is 18 instead.
>
> 2. Did you look at the incompressible example SNES ex69? It sets up this
> exact element.
>
>
> I changed some of my code following the example and got rid of some
> errors. But I'll have a more thorough look again.
>
> 3. Please send me that code that sets up your DM. It sounds like somehow
> you have a copy of your fields.
>
> Thanks,
>
>
> For reference, -ds_view with only one (displacements) fields shows:
>
> ---
> Discrete System with 1 fields
>     cell total dim 8 total comp 2
>   Field u FEM 2 components (implicit) (Nq 4 Nqc 1) 1-jet
>     PetscFE Object: u (disp_) 1 MPI process
>       type: vector
>       Vector Finite Element in 2 dimensions with 2 components
>       PetscSpace Object: Q1 (disp_) 1 MPI process
>         type: sum
>         Space in 2 variables with 2 components, size 8
>         Sum space of 2 concatenated subspaces (all identical)
>           PetscSpace Object: Q1 (disp_sumcomp_) 1 MPI process
>             type: tensor
>             Space in 2 variables with 1 components, size 4
>             Tensor space of 2 subspaces (all identical)
>               PetscSpace Object: sum component tensor component
> (disp_sumcomp_tensorcomp_) 1 MPI process
>                 type: poly
>                 Space in 1 variables with 1 components, size 2
>                 Polynomial space of degree 1
>       PetscDualSpace Object: Q1 (disp_) 1 MPI process
>         type: sum
>         Dual space with 2 components, size 8
>         Sum dual space of 2 concatenated subspaces (all identical)
>           PetscDualSpace Object: Q1 1 MPI process
>             type: lagrange
>             Dual space with 1 components, size 4
>             Continuous tensor Lagrange dual space
>         Quadrature on a quadrilateral of order 3 on 4 points (dim 2)
>   Weak Form System with 1 fields
> ---
>
> and -dm_view
>
> ---
> DM Object: 1 MPI process
>   type: plex
> DM_0x55c117db1b00_2 in 2 dimensions:
>   Number of 0-cells per rank: 4
>   Number of 1-cells per rank: 4
>   Number of 2-cells per rank: 1
> Labels:
>   celltype: 3 strata with value/size (0 (4), 1 (4), 4 (1))
>   depth: 3 strata with value/size (0 (4), 1 (4), 2 (1))
>   Cell Sets: 1 strata with value/size (1 (1))
>   surf: 1 strata with value/size (1 (1))
>   Face Sets: 2 strata with value/size (2 (1), 3 (1))
>   edge_right: 1 strata with value/size (3 (1))
>   edge_left: 1 strata with value/size (2 (1))
>   Vertex Sets: 4 strata with value/size (4 (1), 5 (1), 6 (1), 7 (1))
>   P1: 1 strata with value/size (4 (1))
>   P2: 1 strata with value/size (5 (1))
>   P3: 1 strata with value/size (6 (1))
>   P4: 1 strata with value/size (7 (1))
> Field u:
>   adjacency FEM
> /// With the second field, the two lines below are added
> Field p:
>   adjacency FEM
> ---
>
> DM set up
>
>   DM :: dm_mesh
>   PetscFE :: u_FE, p_FE
>   PetscInt :: dim, dim_u_FE, tdim
>   PetscDS :: dm_ds
>
>
>   DMCreate(PETSC_COMM_WORLD, dm_mesh)
>   DMSetType(dm_mesh, DMPLEX)
>   DMGetDimension(dm_mesh, dim)    // dim = 2
>   DMSetFromOptions(dm_mesh)     // this was called twice by mistake, now
> removed; no changes that I can see
>
>   -- using flags
>
>  -dm_plex_filename QUAD1.msh
>  -dm_plex_interpolate 1
>  -dm_plex_gmsh_use_generic
>  -dm_plex_gmsh_use_regions
>  -dm_plex_gmsh_multiple_tags
>  -dm_plex_gmsh_mark_vertices
>
>   -- some operations with labels
>
>   // u field
>   PetscFECreateDefault(PETSC_COMM_SELF, dim, dim, PETSC_FALSE, "mech_",
> PETSC_DETERMINE, u_FE)
>   PetscFEGetDimension(u_FE, dim_u_FE)   // dim_u_FE = 8
>   DMAddField(dm_mesh, NULL, (PetscObject)u_FE)
>
>   // p field
>   PetscFECreateDefault(PETSC_COMM_SELF, dim , 1, PETSC_FALSE, "pres_",
> PETSC_DETERMINE, p_FE)
>   PetscFEGetDimension(p_FE, dim_p_FE)   // dim_p_FE = 1
>   DMAddField(dm_mesh, NULL, (PetscObject)p_FE)
>
>   DMCreateDS(dm_mesh)
>   DMGetDS(dm_mesh, dm_DS)
>   PetscDSGetTotalDimension(dm_DS, tdim) // tdim
>
>   with flags
>
>     -disp_petscdualspace_lagrange_node_type equispaced
>     -disp_petscdualspace_lagrange_node_endpoints 1
>
>
> I believe these are all the DM related calls.
>
> Thanks,
> Noam
>
> On Wednesday, May 6th, 2026 at 11:39 AM, Matthew Knepley <
> knepley at gmail.com> wrote:
>
> On Wed, May 6, 2026 at 6:56 AM Noam T. <dontbugthedevs at proton.me> wrote:
>
>> Hello,
>>
>> That is wrong. Are you sure about 22?
>>
>>
>> That's what I get, from the argument "csize" in DMPlexGetVecClosure().
>>
>> Here's the output of PetscDSView:
>>
>> Discrete System with 2 fields
>> cell total dim 11 total comp 5
>> Field u FEM 2 components (implicit) (Nq 4 Nqc 1) 1-jet
>> PetscFE Object: u (mech_) 1 MPI process
>> type: vector
>> Vector Finite Element in 2 dimensions with 2 components
>> PetscSpace Object: Q1 (mech_) 1 MPI process
>> type: sum
>> Space in 2 variables with 2 components, size 8
>> Sum space of 2 concatenated subspaces (all identical)
>> PetscSpace Object: Q1 (mech_sumcomp_) 1 MPI process
>> type: tensor
>> Space in 2 variables with 1 components, size 4
>> Tensor space of 2 subspaces (all identical)
>> PetscSpace Object: sum component tensor component
>> (mech_sumcomp_tensorcomp_) 1 MPI process
>> type: poly
>> Space in 1 variables with 1 components, size 2
>> Polynomial space of degree 1
>> PetscDualSpace Object: Q1 (mech_) 1 MPI process
>> type: sum
>> Dual space with 2 components, size 8
>> Sum dual space of 2 concatenated subspaces (all identical)
>> PetscDualSpace Object: Q1 1 MPI process
>> type: lagrange
>> Dual space with 1 components, size 4
>> Continuous tensor Lagrange dual space
>> Quadrature on a quadrilateral of order 3 on 4 points (dim 2)
>> Field p FEM 3 components (implicit) (Nq 4 Nqc 1) 1-jet
>>
>
> 1. Why does pressure have 3 components in 2D?
>
>> PetscFE Object: p (pres_) 1 MPI process
>> type: vector
>> Vector Finite Element in 2 dimensions with 3 components
>> PetscSpace Object: Q0 (pres_) 1 MPI process
>> type: sum
>> Space in 2 variables with 3 components, size 3
>> Sum space of 3 concatenated subspaces (all identical)
>> PetscSpace Object: Q0 (pres_sumcomp_) 1 MPI process
>> type: tensor
>> Space in 2 variables with 1 components, size 1
>> Tensor space of 2 subspaces (all identical)
>> PetscSpace Object: sum component tensor component
>> (pres_sumcomp_tensorcomp_) 1 MPI process
>> type: poly
>> Space in 1 variables with 1 components, size 1
>> Polynomial space of degree 0
>> PetscDualSpace Object: Q0 (pres_) 1 MPI process
>> type: sum
>> Dual space with 3 components, size 3
>> Sum dual space of 3 concatenated subspaces (all identical)
>> PetscDualSpace Object: Q0 1 MPI process
>> type: lagrange
>> Dual space with 1 components, size 1
>> Discontinuous tensor Lagrange dual space
>> Quadrature on a quadrilateral of order 3 on 4 points (dim 2)
>> Weak Form System with 2 fields
>>
>> using as the second field (dim = 2, nc = 3, prefix = "pres") and setting
>> the FE object name to "p".
>>
>> The entry "cell total dim 10" agrees with the output of
>> PetscFEGetTotalDimension(); "comp = 5" I assume is 2 (u) + 3 (p)
>>
>> However, the closure of a Vec is still 22.
>>
>
> 2. Did you look at the incompressible example SNES ex69? It sets up this
> exact element.
>
> 3. Please send me that code that sets up your DM. It sounds like somehow
> you have a copy of your fields.
>
> Thanks,
>
> Matt
>
>> On Tuesday, May 5th, 2026 at 1:58 PM, Matthew Knepley <knepley at gmail.com>
>> wrote:
>>
>> On Tue, May 5, 2026 at 9:06 AM Noam T. via petsc-users <
>> petsc-users at mcs.anl.gov> wrote:
>>
>>> Hello,
>>>
>>> I am trying to work with a "mixed" FE discretization, where besides the
>>> usual displacements DoF in nodes, there is an additional field (e.g.
>>> pressure) that is also part of the system. This additional field has a
>>> certain number of additional dof : p0, p1, p2...
>>>
>>> Looking at example 77 (
>>> https://urldefense.us/v3/__https://petsc.org/release/src/snes/tutorials/ex77.c.html__;!!G_uCfscf7eWS!cTGCzVKs6o_ZRihhznX93v3GQiChyo6en4Q9X0s7_oXupwu9NuNR1rte2V1LNFwYnm57xjj2xq4ScOVT8s3N$ 
>>> <https://urldefense.us/v3/__https://petsc.org/release/src/snes/tutorials/ex77.c.html__;!!G_uCfscf7eWS!aZNOxZZeoHYqe6lRZV0wHMVVTu3YIEfc1Sr-dca7xiGVfG3enULFD4_g6_fxWIa7A_Cu9LcXU-MuxRj4sOwDRyWqvsdGdrEd$>)
>>> this seems to be handled with an additional field, added to the DM. I've
>>> tried so, but then I am getting from the DM arrays whose size/contents are
>>> not what I expected.
>>>
>>> For example, a four-noded Q1 element (PetscFE created with a 2x2 Gauss
>>> rule for quadrature), with just one field, a call to DMPlexGetVecClosure()
>>> gives me an array with 8 entries (say, the coordinates of the initial
>>> mesh): x = x0, y0, .... x3, y3
>>>
>>> Then add the new field:
>>>
>>> PetscFECreateDefault(..., nc = 3, ..., p_FE) /* not sure about the value
>>> of nc here */
>>> DMAddField(dm, ..., p_FE)
>>>
>>> The total dimension, from PetscDSGetTotalDimension(), is now 11 (8 +
>>> 3). This results in a closure of size 22.
>>>
>>
>> That is wrong. Are you sure about 22?
>>
>>> However, what I am looking for is a closure of size 8 + 3 i.e. the
>>> original 8 DoF at the nodes, plus exactly 3 DoF (for the cell, so to speak)
>>> p0, p1, p2, so that in a system with "block" matrices of the form
>>>
>>> [K_uu, K_up | K_pu, K_pp] { u | p } = RHS
>>>
>>> the unknowns {p} has size 3 per cell. Is this possible? I tried some
>>> combinations of dim / nc for the new PetscFE, but when creating the DM
>>> section I get errors e.g.
>>>
>>
>> This is what you should get. I definitely have examples that do this. For
>> example, here is Q1-P0 (I think that is what you are suggesting) for
>> incompressible Stokes
>>
>>
>> https://urldefense.us/v3/__https://gitlab.com/petsc/petsc/-/blob/main/src/snes/tutorials/ex69.c?ref_type=heads*L3454__;Iw!!G_uCfscf7eWS!cTGCzVKs6o_ZRihhznX93v3GQiChyo6en4Q9X0s7_oXupwu9NuNR1rte2V1LNFwYnm57xjj2xq4ScAQm-Ely$ 
>>
>> Thanks,
>>
>> Matt
>>
>>> "point X has a number of DoF not divisible by 2 field components"
>>>
>>> Is this a hint that I should have 3 x dim new DoF, and simply not deal
>>> with entries that I don't need? Or I am not setting up the section properly
>>> (works with just one field)?
>>>
>>> Thank you,
>>> Noam.
>>>
>>
>>
>> --
>> 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://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!cTGCzVKs6o_ZRihhznX93v3GQiChyo6en4Q9X0s7_oXupwu9NuNR1rte2V1LNFwYnm57xjj2xq4ScB-eeU3l$ 
>> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!cTGCzVKs6o_ZRihhznX93v3GQiChyo6en4Q9X0s7_oXupwu9NuNR1rte2V1LNFwYnm57xjj2xq4ScFd_-t7Y$ >
>>
>>
>>
>
> --
> 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://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!cTGCzVKs6o_ZRihhznX93v3GQiChyo6en4Q9X0s7_oXupwu9NuNR1rte2V1LNFwYnm57xjj2xq4ScB-eeU3l$ 
> <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!cTGCzVKs6o_ZRihhznX93v3GQiChyo6en4Q9X0s7_oXupwu9NuNR1rte2V1LNFwYnm57xjj2xq4ScFd_-t7Y$ >
>
>
>

-- 
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://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!cTGCzVKs6o_ZRihhznX93v3GQiChyo6en4Q9X0s7_oXupwu9NuNR1rte2V1LNFwYnm57xjj2xq4ScB-eeU3l$  <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!cTGCzVKs6o_ZRihhznX93v3GQiChyo6en4Q9X0s7_oXupwu9NuNR1rte2V1LNFwYnm57xjj2xq4ScFd_-t7Y$ >
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20260506/af015460/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ex94.c
Type: application/octet-stream
Size: 1527 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20260506/af015460/attachment-0001.obj>


More information about the petsc-users mailing list