[petsc-users] How to find the map between the high order coordinates of DMPlex and vertex numbering?

Zongze Yang yangzongze at gmail.com
Sun May 14 18:23:47 CDT 2023


Could you try to project the coordinates into the continuity space by
enabling the option
`-dm_plex_gmsh_project_petscdualspace_lagrange_continuity true`?

Best wishes,
Zongze


On Mon, 15 May 2023 at 04:24, Matthew Knepley <knepley at gmail.com> wrote:

> On Sun, May 14, 2023 at 12:27 PM Zongze Yang <yangzongze at gmail.com> wrote:
>
>>
>>
>>
>> On Sun, 14 May 2023 at 23:54, Matthew Knepley <knepley at gmail.com> wrote:
>>
>>> On Sun, May 14, 2023 at 9:21 AM Zongze Yang <yangzongze at gmail.com>
>>> wrote:
>>>
>>>> Hi, Matt,
>>>>
>>>> The issue has been resolved while testing on the latest version of
>>>> PETSc. It seems that the problem has been fixed in the following merge
>>>> request:  https://gitlab.com/petsc/petsc/-/merge_requests/5970
>>>>
>>>
>>> No problem. Glad it is working.
>>>
>>>
>>>> I sincerely apologize for any inconvenience caused by my previous
>>>> message. However, I would like to provide you with additional information
>>>> regarding the test files. Attached to this email, you will find two Gmsh
>>>> files: "square_2rd.msh" and "square_3rd.msh." These files contain
>>>> high-order triangulated mesh data for the unit square.
>>>>
>>>> ```
>>>> $ ./ex33 -coord_space 0 -dm_plex_filename square_2rd.msh
>>>> -dm_plex_gmsh_project
>>>> -dm_plex_gmsh_project_petscdualspace_lagrange_continuity true
>>>> -dm_plex_gmsh_project_fe_view -volume 1
>>>> PetscFE Object: P2 1 MPI process
>>>>   type: basic
>>>>   Basic Finite Element in 2 dimensions with 2 components
>>>>   PetscSpace Object: P2 1 MPI process
>>>>     type: sum
>>>>     Space in 2 variables with 2 components, size 12
>>>>     Sum space of 2 concatenated subspaces (all identical)
>>>>       PetscSpace Object: sum component (sumcomp_) 1 MPI process
>>>>         type: poly
>>>>         Space in 2 variables with 1 components, size 6
>>>>         Polynomial space of degree 2
>>>>   PetscDualSpace Object: P2 1 MPI process
>>>>     type: lagrange
>>>>     Dual space with 2 components, size 12
>>>>     Continuous Lagrange dual space
>>>>     Quadrature on a triangle of order 5 on 9 points (dim 2)
>>>> Volume: 1.
>>>> $ ./ex33 -coord_space 0 -dm_plex_filename square_3rd.msh
>>>> -dm_plex_gmsh_project
>>>> -dm_plex_gmsh_project_petscdualspace_lagrange_continuity true
>>>> -dm_plex_gmsh_project_fe_view -volume 1
>>>> PetscFE Object: P3 1 MPI process
>>>>   type: basic
>>>>   Basic Finite Element in 2 dimensions with 2 components
>>>>   PetscSpace Object: P3 1 MPI process
>>>>     type: sum
>>>>     Space in 2 variables with 2 components, size 20
>>>>     Sum space of 2 concatenated subspaces (all identical)
>>>>       PetscSpace Object: sum component (sumcomp_) 1 MPI process
>>>>         type: poly
>>>>         Space in 2 variables with 1 components, size 10
>>>>         Polynomial space of degree 3
>>>>   PetscDualSpace Object: P3 1 MPI process
>>>>     type: lagrange
>>>>     Dual space with 2 components, size 20
>>>>     Continuous Lagrange dual space
>>>>     Quadrature on a triangle of order 7 on 16 points (dim 2)
>>>> Volume: 1.
>>>> ```
>>>>
>>>> Thank you for your attention and understanding. I apologize once again
>>>> for my previous oversight.
>>>>
>>>
>>> Great! If you make an MR for this, you will be included on the next list
>>> of PETSc contributors. Otherwise, I can do it.
>>>
>>>
>> I appreciate your offer to handle the MR. Please go ahead and take care
>> of it. Thank you!
>>
>
> I have created the MR with your tests. They are working for me:
>
>   https://gitlab.com/petsc/petsc/-/merge_requests/6463
>
>   Thanks,
>
>      Matt
>
>
>> Best Wishes,
>> Zongze
>>
>>
>>>   Thanks,
>>>
>>>      Matt
>>>
>>>
>>>> Best wishes,
>>>> Zongze
>>>>
>>>>
>>>> On Sun, 14 May 2023 at 16:44, Matthew Knepley <knepley at gmail.com>
>>>> wrote:
>>>>
>>>>> On Sat, May 13, 2023 at 6:08 AM Zongze Yang <yangzongze at gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Hi, Matt,
>>>>>>
>>>>>> There seem to be ongoing issues with projecting high-order
>>>>>> coordinates from a gmsh file to other spaces. I would like to inquire
>>>>>> whether there are any plans to resolve this problem.
>>>>>>
>>>>>> Thank you for your attention to this matter.
>>>>>>
>>>>>
>>>>> Yes, I will look at it. The important thing is to have a good test.
>>>>> Here are the higher order geometry tests
>>>>>
>>>>>
>>>>> https://gitlab.com/petsc/petsc/-/blob/main/src/dm/impls/plex/tests/ex33.c
>>>>>
>>>>> I take shapes with known volume, mesh them with higher order geometry,
>>>>> and look at the convergence to the true volume. Could you add a GMsh test,
>>>>> meaning the .msh file and known volume, and I will fix it?
>>>>>
>>>>>   Thanks,
>>>>>
>>>>>      Matt
>>>>>
>>>>>
>>>>>>
>>>>>> Best wishes,
>>>>>> Zongze
>>>>>>
>>>>>>
>>>>>> On Sat, 18 Jun 2022 at 20:31, Zongze Yang <yangzongze at gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Thank you for your reply. May I ask for some references on the order
>>>>>>> of the dofs on PETSc's FE Space (especially high order elements)?
>>>>>>>
>>>>>>> Thanks,
>>>>>>>
>>>>>>>  Zongze
>>>>>>>
>>>>>>> Matthew Knepley <knepley at gmail.com> 于2022年6月18日周六 20:02写道:
>>>>>>>
>>>>>>>> On Sat, Jun 18, 2022 at 2:16 AM Zongze Yang <yangzongze at gmail.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> In order to check if I made mistakes in the python code, I try to
>>>>>>>>> use c code to show the issue on DMProjectCoordinates. The code and mesh
>>>>>>>>> file is attached.
>>>>>>>>> If the code is correct, there must be something wrong with
>>>>>>>>> `DMProjectCoordinates` or `DMPlexCreateGmshFromFile` for high-order mesh.
>>>>>>>>>
>>>>>>>>
>>>>>>>> Something is definitely wrong with high order, periodic simplices
>>>>>>>> from Gmsh. We had not tested that case. I am at a conference and cannot
>>>>>>>> look at it for a week.
>>>>>>>> My suspicion is that the space we make when reading in the Gmsh
>>>>>>>> coordinates does not match the values (wrong order).
>>>>>>>>
>>>>>>>>   Thanks,
>>>>>>>>
>>>>>>>>     Matt
>>>>>>>>
>>>>>>>>
>>>>>>>>> The command and the output are listed below: (Obviously the
>>>>>>>>> bounding box is changed.)
>>>>>>>>> ```
>>>>>>>>> $ ./test_gmsh_load_2rd -filename cube-p2.msh -old_fe_view
>>>>>>>>> -new_fe_view
>>>>>>>>> Old Bounding Box:
>>>>>>>>>   0: lo = 0. hi = 1.
>>>>>>>>>   1: lo = 0. hi = 1.
>>>>>>>>>   2: lo = 0. hi = 1.
>>>>>>>>> PetscFE Object: OldCoordinatesFE 1 MPI processes
>>>>>>>>>   type: basic
>>>>>>>>>   Basic Finite Element in 3 dimensions with 3 components
>>>>>>>>>   PetscSpace Object: P2 1 MPI processes
>>>>>>>>>     type: sum
>>>>>>>>>     Space in 3 variables with 3 components, size 30
>>>>>>>>>     Sum space of 3 concatenated subspaces (all identical)
>>>>>>>>>       PetscSpace Object: sum component (sumcomp_) 1 MPI processes
>>>>>>>>>         type: poly
>>>>>>>>>         Space in 3 variables with 1 components, size 10
>>>>>>>>>         Polynomial space of degree 2
>>>>>>>>>   PetscDualSpace Object: P2 1 MPI processes
>>>>>>>>>     type: lagrange
>>>>>>>>>     Dual space with 3 components, size 30
>>>>>>>>>     Discontinuous Lagrange dual space
>>>>>>>>>     Quadrature of order 5 on 27 points (dim 3)
>>>>>>>>> PetscFE Object: NewCoordinatesFE 1 MPI processes
>>>>>>>>>   type: basic
>>>>>>>>>   Basic Finite Element in 3 dimensions with 3 components
>>>>>>>>>   PetscSpace Object: P2 1 MPI processes
>>>>>>>>>     type: sum
>>>>>>>>>     Space in 3 variables with 3 components, size 30
>>>>>>>>>     Sum space of 3 concatenated subspaces (all identical)
>>>>>>>>>       PetscSpace Object: sum component (sumcomp_) 1 MPI processes
>>>>>>>>>         type: poly
>>>>>>>>>         Space in 3 variables with 1 components, size 10
>>>>>>>>>         Polynomial space of degree 2
>>>>>>>>>   PetscDualSpace Object: P2 1 MPI processes
>>>>>>>>>     type: lagrange
>>>>>>>>>     Dual space with 3 components, size 30
>>>>>>>>>     Continuous Lagrange dual space
>>>>>>>>>     Quadrature of order 5 on 27 points (dim 3)
>>>>>>>>> New Bounding Box:
>>>>>>>>>   0: lo = 2.5624e-17 hi = 8.
>>>>>>>>>   1: lo = -9.23372e-17 hi = 7.
>>>>>>>>>   2: lo = 2.72091e-17 hi = 8.5
>>>>>>>>> ```
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Zongze
>>>>>>>>>
>>>>>>>>> Zongze Yang <yangzongze at gmail.com> 于2022年6月17日周五 14:54写道:
>>>>>>>>>
>>>>>>>>>> I tried the projection operation. However, it seems that the
>>>>>>>>>> projection gives the wrong solution. After projection, the bounding box is
>>>>>>>>>> changed! See logs below.
>>>>>>>>>>
>>>>>>>>>> First, I patch the petsc4py by adding `DMProjectCoordinates`:
>>>>>>>>>> ```
>>>>>>>>>> diff --git a/src/binding/petsc4py/src/PETSc/DM.pyx
>>>>>>>>>> b/src/binding/petsc4py/src/PETSc/DM.pyx
>>>>>>>>>> index d8a58d183a..dbcdb280f1 100644
>>>>>>>>>> --- a/src/binding/petsc4py/src/PETSc/DM.pyx
>>>>>>>>>> +++ b/src/binding/petsc4py/src/PETSc/DM.pyx
>>>>>>>>>> @@ -307,6 +307,12 @@ cdef class DM(Object):
>>>>>>>>>>          PetscINCREF(c.obj)
>>>>>>>>>>          return c
>>>>>>>>>>
>>>>>>>>>> +    def projectCoordinates(self, FE fe=None):
>>>>>>>>>> +        if fe is None:
>>>>>>>>>> +            CHKERR( DMProjectCoordinates(self.dm, NULL) )
>>>>>>>>>> +        else:
>>>>>>>>>> +            CHKERR( DMProjectCoordinates(self.dm, fe.fe) )
>>>>>>>>>> +
>>>>>>>>>>      def getBoundingBox(self):
>>>>>>>>>>          cdef PetscInt i,dim=0
>>>>>>>>>>          CHKERR( DMGetCoordinateDim(self.dm, &dim) )
>>>>>>>>>> diff --git a/src/binding/petsc4py/src/PETSc/petscdm.pxi
>>>>>>>>>> b/src/binding/petsc4py/src/PETSc/petscdm.pxi
>>>>>>>>>> index 514b6fa472..c778e39884 100644
>>>>>>>>>> --- a/src/binding/petsc4py/src/PETSc/petscdm.pxi
>>>>>>>>>> +++ b/src/binding/petsc4py/src/PETSc/petscdm.pxi
>>>>>>>>>> @@ -90,6 +90,7 @@ cdef extern from * nogil:
>>>>>>>>>>      int DMGetCoordinateDim(PetscDM,PetscInt*)
>>>>>>>>>>      int DMSetCoordinateDim(PetscDM,PetscInt)
>>>>>>>>>>      int DMLocalizeCoordinates(PetscDM)
>>>>>>>>>> +    int DMProjectCoordinates(PetscDM, PetscFE)
>>>>>>>>>>
>>>>>>>>>>      int
>>>>>>>>>> DMCreateInterpolation(PetscDM,PetscDM,PetscMat*,PetscVec*)
>>>>>>>>>>      int DMCreateInjection(PetscDM,PetscDM,PetscMat*)
>>>>>>>>>> ```
>>>>>>>>>>
>>>>>>>>>> Then in python, I load a mesh and project the coordinates to P2:
>>>>>>>>>> ```
>>>>>>>>>> import firedrake as fd
>>>>>>>>>> from firedrake.petsc import PETSc
>>>>>>>>>>
>>>>>>>>>> # plex = fd.mesh._from_gmsh('test-fd-load-p2.msh')
>>>>>>>>>> plex = fd.mesh._from_gmsh('test-fd-load-p2-rect.msh')
>>>>>>>>>> print('old bbox:', plex.getBoundingBox())
>>>>>>>>>>
>>>>>>>>>> dim = plex.getDimension()
>>>>>>>>>> #                                 (dim,  nc, isSimplex, k,
>>>>>>>>>>    qorder, comm=None)
>>>>>>>>>> fe_new = PETSc.FE().createLagrange(dim, dim,      True, 2,
>>>>>>>>>> PETSc.DETERMINE)
>>>>>>>>>> plex.projectCoordinates(fe_new)
>>>>>>>>>> fe_new.view()
>>>>>>>>>>
>>>>>>>>>> print('new bbox:', plex.getBoundingBox())
>>>>>>>>>> ```
>>>>>>>>>>
>>>>>>>>>> The output is (The bounding box is changed!)
>>>>>>>>>> ```
>>>>>>>>>>
>>>>>>>>>> old bbox: ((0.0, 1.0), (0.0, 1.0), (0.0, 1.0))
>>>>>>>>>> PetscFE Object: P2 1 MPI processes
>>>>>>>>>>   type: basic
>>>>>>>>>>   Basic Finite Element in 3 dimensions with 3 components
>>>>>>>>>>   PetscSpace Object: P2 1 MPI processes
>>>>>>>>>>     type: sum
>>>>>>>>>>     Space in 3 variables with 3 components, size 30
>>>>>>>>>>     Sum space of 3 concatenated subspaces (all identical)
>>>>>>>>>>       PetscSpace Object: sum component (sumcomp_) 1 MPI processes
>>>>>>>>>>         type: poly
>>>>>>>>>>         Space in 3 variables with 1 components, size 10
>>>>>>>>>>         Polynomial space of degree 2
>>>>>>>>>>   PetscDualSpace Object: P2 1 MPI processes
>>>>>>>>>>     type: lagrange
>>>>>>>>>>     Dual space with 3 components, size 30
>>>>>>>>>>     Continuous Lagrange dual space
>>>>>>>>>>     Quadrature of order 5 on 27 points (dim 3)
>>>>>>>>>> new bbox: ((-6.530133708576188e-17, 36.30670832662781), (-3.899962995254311e-17, 36.2406171632539), (-8.8036464152166e-17, 36.111577025012224))
>>>>>>>>>>
>>>>>>>>>> ```
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> By the way, for the original DG coordinates, where can I find the relation of the closure and the order of the dofs for the cell?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Thanks!
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>   Zongze
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Matthew Knepley <knepley at gmail.com> 于2022年6月17日周五 01:11写道:
>>>>>>>>>>
>>>>>>>>>>> On Thu, Jun 16, 2022 at 12:06 PM Zongze Yang <
>>>>>>>>>>> yangzongze at gmail.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> 在 2022年6月16日,23:22,Matthew Knepley <knepley at gmail.com> 写道:
>>>>>>>>>>>>
>>>>>>>>>>>> 
>>>>>>>>>>>> On Thu, Jun 16, 2022 at 11:11 AM Zongze Yang <
>>>>>>>>>>>> yangzongze at gmail.com> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Hi, if I load a `gmsh` file with second-order elements, the
>>>>>>>>>>>>> coordinates will be stored in a DG-P2 space. After obtaining the
>>>>>>>>>>>>> coordinates of a cell, how can I map the coordinates to vertex and edge?
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> By default, they are stored as P2, not DG.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> I checked the coordinates vector, and found the dogs only
>>>>>>>>>>>> defined on cell other than vertex and edge, so I said they are stored as DG.
>>>>>>>>>>>> Then the function DMPlexVecGetClosure
>>>>>>>>>>>> <https://petsc.org/main/docs/manualpages/DMPLEX/DMPlexVecGetClosure/> seems return
>>>>>>>>>>>> the coordinates in lex order.
>>>>>>>>>>>>
>>>>>>>>>>>> Some code in reading gmsh file reads that
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> 1756:     if (isSimplex) continuity = PETSC_FALSE
>>>>>>>>>>>> <https://petsc.org/main/docs/manualpages/Sys/PETSC_FALSE/>; /*
>>>>>>>>>>>> XXX FIXME Requires DMPlexSetClosurePermutationLexicographic() */
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> 1758:     GmshCreateFE(comm, NULL, isSimplex, continuity,
>>>>>>>>>>>> nodeType, dim, coordDim, order, &fe)
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> The continuity is set to false for simplex.
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Oh, yes. That needs to be fixed. For now, you can just project
>>>>>>>>>>> it to P2 if you want using
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> https://petsc.org/main/docs/manualpages/DM/DMProjectCoordinates/
>>>>>>>>>>>
>>>>>>>>>>>   Thanks,
>>>>>>>>>>>
>>>>>>>>>>>      Matt
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>> Thanks,
>>>>>>>>>>>> Zongze
>>>>>>>>>>>>
>>>>>>>>>>>> You can ask for the coordinates of a vertex or an edge directly
>>>>>>>>>>>> using
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> https://petsc.org/main/docs/manualpages/DMPLEX/DMPlexPointLocalRead/
>>>>>>>>>>>>
>>>>>>>>>>>> by giving the vertex or edge point. You can get all the
>>>>>>>>>>>> coordinates on a cell, in the closure order, using
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> https://petsc.org/main/docs/manualpages/DMPLEX/DMPlexVecGetClosure/
>>>>>>>>>>>>
>>>>>>>>>>>>   Thanks,
>>>>>>>>>>>>
>>>>>>>>>>>>      Matt
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>> Below is some code load the gmsh file, I want to know the
>>>>>>>>>>>>> relation between `cl` and `cell_coords`.
>>>>>>>>>>>>>
>>>>>>>>>>>>> ```
>>>>>>>>>>>>> import firedrake as fd
>>>>>>>>>>>>> import numpy as np
>>>>>>>>>>>>>
>>>>>>>>>>>>> # Load gmsh file (2rd)
>>>>>>>>>>>>> plex = fd.mesh._from_gmsh('test-fd-load-p2-rect.msh')
>>>>>>>>>>>>>
>>>>>>>>>>>>> cs, ce = plex.getHeightStratum(0)
>>>>>>>>>>>>>
>>>>>>>>>>>>> cdm = plex.getCoordinateDM()
>>>>>>>>>>>>> csec = dm.getCoordinateSection()
>>>>>>>>>>>>> coords_gvec = dm.getCoordinates()
>>>>>>>>>>>>>
>>>>>>>>>>>>> for i in range(cs, ce):
>>>>>>>>>>>>>     cell_coords = cdm.getVecClosure(csec, coords_gvec, i)
>>>>>>>>>>>>>     print(f'coordinates for cell {i}
>>>>>>>>>>>>> :\n{cell_coords.reshape([-1, 3])}')
>>>>>>>>>>>>>     cl = dm.getTransitiveClosure(i)
>>>>>>>>>>>>>     print('closure:', cl)
>>>>>>>>>>>>>     break
>>>>>>>>>>>>> ```
>>>>>>>>>>>>>
>>>>>>>>>>>>> Best wishes,
>>>>>>>>>>>>> Zongze
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> 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/>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> 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/>
>>>>>
>>>>
>>>
>>> --
>>> 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-users/attachments/20230515/3ecc31ed/attachment-0001.html>


More information about the petsc-users mailing list