Skip to content

Commit

Permalink
Implement polynomial and Lagrange degrees for elements (#275)
Browse files Browse the repository at this point in the history
* changes

* Adding degree functions

* degress of more elements

* implement more degrees

* ruff

* more degrees

* transition degrees

* ruff

* typing

* update some last_updated

* fixes

* ruff
  • Loading branch information
mscroggs authored Sep 27, 2024
1 parent 567497e commit 9d053d6
Show file tree
Hide file tree
Showing 54 changed files with 1,569 additions and 22 deletions.
1 change: 1 addition & 0 deletions CHANGELOG_SINCE_LAST_VERSION.md
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
- Corrected polyset for Arnold-Winther element
- Added sub- and superdegree functions
1 change: 1 addition & 0 deletions demo/custom_element.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def __init__(self, reference, order):
min_order = 1
max_order = 1
continuity = "L2"
value_type = "scalar"
mapping = "identity"


Expand Down
17 changes: 17 additions & 0 deletions symfem/elements/abf.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,25 @@ def init_kwargs(self) -> typing.Dict[str, typing.Any]:
"""
return {"variant": self.variant}

@property
def lagrange_subdegree(self) -> int:
return self.order

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order + 2

@property
def polynomial_subdegree(self) -> int:
return self.order

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order * 2 + 2

names = ["Arnold-Boffi-Falk", "ABF"]
references = ["quadrilateral"]
min_order = 0
continuity = "H(div)"
value_type = "vector"
last_updated = "2023.06"
20 changes: 20 additions & 0 deletions symfem/elements/ac.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,28 @@ def init_kwargs(self) -> typing.Dict[str, typing.Any]:
"""
return {"variant": self.variant}

@property
def lagrange_subdegree(self) -> int:
if self.order < 2:
return self.order
else:
return self.order // 2

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order + 1

@property
def polynomial_subdegree(self) -> int:
return self.order

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order + 1

names = ["Arbogast-Correa", "AC", "AC full", "Arbogast-Correa full"]
references = ["quadrilateral"]
min_order = 0
continuity = "H(div)"
value_type = "vector"
last_updated = "2023.06"
17 changes: 17 additions & 0 deletions symfem/elements/alfeld_sorokina.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,26 @@ def __init__(self, reference: Reference, order: int):

super().__init__(reference, order, poly, dofs, reference.tdim, 1)

@property
def lagrange_subdegree(self) -> int:
raise NotImplementedError()

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
raise NotImplementedError()

@property
def polynomial_subdegree(self) -> int:
raise NotImplementedError()

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
raise NotImplementedError()

names = ["Alfeld-Sorokina", "AS"]
references = ["triangle"]
min_order = 2
max_order = 2
continuity = "C0"
value_type = "scalar macro"
last_updated = "2023.05"
17 changes: 17 additions & 0 deletions symfem/elements/argyris.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,26 @@ def __init__(self, reference: Reference, order: int):

super().__init__(reference, order, poly, dofs, reference.tdim, 1)

@property
def lagrange_subdegree(self) -> int:
return self.order

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order

@property
def polynomial_subdegree(self) -> int:
return self.order

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order

names = ["Argyris"]
references = ["triangle"]
min_order = 5
max_order = 5
continuity = "L2"
value_type = "scalar"
last_updated = "2023.05"
34 changes: 34 additions & 0 deletions symfem/elements/aw.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,27 @@ def init_kwargs(self) -> typing.Dict[str, typing.Any]:
"""
return {"variant": self.variant}

@property
def lagrange_subdegree(self) -> int:
return self.order - 1

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order

@property
def polynomial_subdegree(self) -> int:
return self.order - 1

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order

names = ["Arnold-Winther", "AW", "conforming Arnold-Winther"]
references = ["triangle"]
min_order = 3
continuity = "integral inner H(div)"
value_type = "symmetric matrix"
last_updated = "2024.09"


Expand Down Expand Up @@ -216,9 +233,26 @@ def init_kwargs(self) -> typing.Dict[str, typing.Any]:
"""
return {"variant": self.variant}

@property
def lagrange_subdegree(self) -> int:
return self.order - 1

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order

@property
def polynomial_subdegree(self) -> int:
return self.order - 1

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order

names = ["nonconforming Arnold-Winther", "nonconforming AW"]
references = ["triangle"]
min_order = 2
max_order = 2
continuity = "integral inner H(div)"
value_type = "symmetric matrix"
last_updated = "2023.06"
17 changes: 17 additions & 0 deletions symfem/elements/bddm.py → symfem/elements/bddf.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,25 @@ def init_kwargs(self) -> typing.Dict[str, typing.Any]:
"""
return {"variant": self.variant}

@property
def lagrange_subdegree(self) -> int:
return self.order // 3

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order + 1

@property
def polynomial_subdegree(self) -> int:
return self.order

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order + 1

names = ["Brezzi-Douglas-Duran-Fortin", "BDDF"]
references = ["hexahedron"]
min_order = 1
continuity = "H(div)"
value_type = "vector"
last_updated = "2023.06"
20 changes: 20 additions & 0 deletions symfem/elements/bdfm.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,28 @@ def init_kwargs(self) -> typing.Dict[str, typing.Any]:
"""
return {"variant": self.variant}

@property
def lagrange_subdegree(self) -> int:
if self.reference.name in ["triangle", "tetrahedron"]:
return self.order - 1
else:
return self.order // self.reference.tdim

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order

@property
def polynomial_subdegree(self) -> int:
return self.order - 1

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order

names = ["Brezzi-Douglas-Fortin-Marini", "BDFM"]
references = ["triangle", "quadrilateral", "hexahedron", "tetrahedron"]
min_order = 1
continuity = "H(div)"
value_type = "vector"
last_updated = "2023.06"
17 changes: 17 additions & 0 deletions symfem/elements/bdm.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,25 @@ def init_kwargs(self) -> typing.Dict[str, typing.Any]:
"""
return {"variant": self.variant}

@property
def lagrange_subdegree(self) -> int:
return self.order

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order

@property
def polynomial_subdegree(self) -> int:
return self.order

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order

names = ["Brezzi-Douglas-Marini", "BDM", "N2div"]
references = ["triangle", "tetrahedron"]
min_order = 1
continuity = "H(div)"
value_type = "vector"
last_updated = "2023.06"
17 changes: 17 additions & 0 deletions symfem/elements/bell.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,26 @@ def init_kwargs(self) -> typing.Dict[str, typing.Any]:
"""
return {"variant": self.variant}

@property
def lagrange_subdegree(self) -> int:
return 4

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return 5

@property
def polynomial_subdegree(self) -> int:
return 4

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return 5

names = ["Bell"]
references = ["triangle"]
min_order = 5
max_order = 5
continuity = "C1"
value_type = "scalar"
last_updated = "2023.05"
18 changes: 17 additions & 1 deletion symfem/elements/bernardi_raugel.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,28 @@ def __init__(self, reference: Reference, order: int):
reference, x[i], p.dofs[0], entity=(3, 0), mapping="contravariant"
)
)

super().__init__(reference, order, poly, dofs, reference.tdim, reference.tdim)

@property
def lagrange_subdegree(self) -> int:
return self.order

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order + self.reference.tdim - 1

@property
def polynomial_subdegree(self) -> int:
return self.order

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order + self.reference.tdim - 1

names = ["Bernardi-Raugel"]
references = ["triangle", "tetrahedron"]
min_order = 1
max_order = {"triangle": 1, "tetrahedron": 2}
continuity = "H(div)"
value_type = "vector"
last_updated = "2023.06"
17 changes: 17 additions & 0 deletions symfem/elements/bernstein.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,8 +234,25 @@ def index(x: int, y: int = 0, z: int = 0) -> int:

super().__init__(reference, order, poly, dofs, reference.tdim, 1)

@property
def lagrange_subdegree(self) -> int:
return self.order

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order

@property
def polynomial_subdegree(self) -> int:
return self.order

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order

names = ["Bernstein", "Bernstein-Bezier"]
references = ["interval", "triangle", "tetrahedron"]
min_order = 0
continuity = "C0"
value_type = "scalar"
last_updated = "2023.05"
17 changes: 17 additions & 0 deletions symfem/elements/bfs.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,27 @@ def __init__(self, reference: Reference, order: int):
poly += quolynomial_set_1d(reference.tdim, order)
super().__init__(reference, order, poly, dofs, reference.tdim, 1)

@property
def lagrange_subdegree(self) -> int:
return self.order

@property
def lagrange_superdegree(self) -> typing.Optional[int]:
return self.order

@property
def polynomial_subdegree(self) -> int:
return self.order

@property
def polynomial_superdegree(self) -> typing.Optional[int]:
return self.order * 2

names = ["Bogner-Fox-Schmit", "BFS"]
references = ["quadrilateral"]
min_order = 3
max_order = 3
continuity = "C0"
# continuity = "C1"
value_type = "scalar"
last_updated = "2023.05"
Loading

0 comments on commit 9d053d6

Please sign in to comment.