On Sun, May 14, 2023 at 12:27 PM Zongze Yang <[email protected]> wrote:
On Sun, 14 May 2023 at 23:54, Matthew Knepley <[email protected]> wrote:
On Sun, May 14, 2023 at 9:21 AM Zongze Yang <[email protected]> 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 <[email protected]> wrote:
On Sat, May 13, 2023 at 6:08 AM Zongze Yang <[email protected]> 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 <[email protected]> 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 <[email protected]> 于2022年6月18日周六 20:02写道:
On Sat, Jun 18, 2022 at 2:16 AM Zongze Yang <[email protected]> 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 <[email protected]> 于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 <[email protected]> 于2022年6月17日周五 01:11写道:
On Thu, Jun 16, 2022 at 12:06 PM Zongze Yang < [email protected]> wrote:
在 2022年6月16日,23:22,Matthew Knepley <[email protected]> 写道:
On Thu, Jun 16, 2022 at 11:11 AM Zongze Yang < [email protected]> 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/>