Before running this example, you must install
Basix.UFL:
pip3 install git+https://github.com/FEniCS/basix fenics-ufl
This element can then be created with the following lines of Python:
import basix
import basix.ufl
import numpy as np
# Create Kong-Mulder-Veldhuizen degree 1 on a triangle
e = basix.ufl.custom_element(
basix.CellType.triangle,
(),
np.array([[0.7071067811865475, -5.551115123125783e-17, -1.6653345369377348e-16], [0.23570226039551584, -0.08333333333333334, 0.14433756729740632], [0.2357022603955158, 0.16666666666666657, -6.245004513516506e-17]], dtype=np.float64),
[[np.array([[0.0, 0.0]], dtype=np.float64), np.array([[1.0, 0.0]], dtype=np.float64), np.array([[0.0, 1.0]], dtype=np.float64)], [np.empty((0, 2), dtype=np.float64), np.empty((0, 2), dtype=np.float64), np.empty((0, 2), dtype=np.float64)], [np.empty((0, 2), dtype=np.float64)], []],
[[np.array([[[[0.16666666666666666]]]], dtype=np.float64), np.array([[[[0.16666666666666666]]]], dtype=np.float64), np.array([[[[0.16666666666666666]]]], dtype=np.float64)], [np.empty((0, 1, 0, 1), dtype=np.float64), np.empty((0, 1, 0, 1), dtype=np.float64), np.empty((0, 1, 0, 1), dtype=np.float64)], [np.empty((0, 1, 0, 1), dtype=np.float64)], []],
0,
basix.MapType.identity,
basix.SobolevSpace.H1,
False,
-1,
1,
basix.PolysetType.standard, dtype=np.float64
)
# Create Kong-Mulder-Veldhuizen degree 2 on a triangle
e = basix.ufl.custom_element(
basix.CellType.triangle,
(),
np.array([[0.7071067811865489, -3.608224830031759e-16, -5.967448757360216e-16, 3.434752482434078e-15, -4.926614671774132e-16, 2.67841304690819e-15, -3.2335245592207684e-15, 3.191891195797325e-16, 7.896461262646426e-15, 4.649058915617843e-16], [0.23570226039551628, -0.08333333333333401, 0.14433756729740724, 1.40989650510015e-15, 3.0357660829594124e-16, 6.557254739192331e-16, -1.7403613272737317e-15, 7.485331798839923e-16, 2.4060614611798314e-15, 1.0174153186603974e-15], [0.11785113019775828, -0.06666666666666712, 0.11547005383792579, 0.01360827634879615, -0.023570226039551643, 0.030429030972509735, -9.993633524885137e-16, 5.049671618351237e-16, 1.0830908652587068e-15, 6.541533807691291e-16], [0.23570226039551628, 0.1666666666666677, -2.0469737016526324e-16, 7.667477763817487e-16, -2.255140518769849e-16, 1.349614864309956e-15, 1.4051260155412137e-16, 5.898059818321144e-17, 3.226585665316861e-15, 1.6306400674181987e-16], [0.05892556509887893, 0.016666666666666784, 0.028867513459481495, -0.020412414523193062, 0.02357022603955198, 3.8510861166685117e-16, -1.0592655225183378e-16, 2.205267218835516e-16, 8.020927672047762e-16, 3.2482697087665713e-16], [0.1178511301977583, 0.1333333333333341, -7.632783294297951e-17, 0.04082482904638698, -1.0495077029659683e-16, 5.872038966181492e-16, 3.616898447411643e-16, 5.204170427930421e-18, 1.6705387073656652e-15, 5.941427905220564e-17], [0.011785113019775728, -8.00276728565863e-18, -1.5829351718288365e-17, -0.004860098695998325, -1.3769367590565906e-17, -0.004347004424644148, 0.0016835875742536631, 8.023096076392733e-18, -0.003764616262105151, 1.0950441942103595e-17]], dtype=np.float64),
[[np.array([[0.0, 0.0]], dtype=np.float64), np.array([[1.0, 0.0]], dtype=np.float64), np.array([[0.0, 1.0]], dtype=np.float64)], [np.array([[0.5, 0.5]], dtype=np.float64), np.array([[0.0, 0.5]], dtype=np.float64), np.array([[0.5, 0.0]], dtype=np.float64)], [np.array([[0.3333333333333333, 0.3333333333333333]], dtype=np.float64)], []],
[[np.array([[[[0.025]]]], dtype=np.float64), np.array([[[[0.025]]]], dtype=np.float64), np.array([[[[0.025]]]], dtype=np.float64)], [np.array([[[[0.06666666666666667]]]], dtype=np.float64), np.array([[[[0.06666666666666667]]]], dtype=np.float64), np.array([[[[0.06666666666666667]]]], dtype=np.float64)], [np.array([[[[0.225]]]], dtype=np.float64)], []],
0,
basix.MapType.identity,
basix.SobolevSpace.H1,
False,
-1,
3,
basix.PolysetType.standard, dtype=np.float64
)
# Create Kong-Mulder-Veldhuizen degree 1 on a tetrahedron
e = basix.ufl.custom_element(
basix.CellType.tetrahedron,
(),
np.array([[0.40824829046386296, 9.71445146547012e-16, 1.457167719820518e-15, 2.4147350785597155e-15], [0.10206207261596595, -0.026352313834736255, -0.03726779962499613, 0.06454972243679089], [0.10206207261596595, -0.026352313834736255, 0.07453559924999337, 6.071532165918825e-16], [0.10206207261596595, 0.07905694150420975, 3.712308238590367e-16, 6.071532165918825e-16]], dtype=np.float64),
[[np.array([[0.0, 0.0, 0.0]], dtype=np.float64), np.array([[1.0, 0.0, 0.0]], dtype=np.float64), np.array([[0.0, 1.0, 0.0]], dtype=np.float64), np.array([[0.0, 0.0, 1.0]], dtype=np.float64)], [np.empty((0, 3), dtype=np.float64), np.empty((0, 3), dtype=np.float64), np.empty((0, 3), dtype=np.float64), np.empty((0, 3), dtype=np.float64), np.empty((0, 3), dtype=np.float64), np.empty((0, 3), dtype=np.float64)], [np.empty((0, 3), dtype=np.float64), np.empty((0, 3), dtype=np.float64), np.empty((0, 3), dtype=np.float64), np.empty((0, 3), dtype=np.float64)], [np.empty((0, 3), dtype=np.float64)]],
[[np.array([[[[0.041666666666666664]]]], dtype=np.float64), np.array([[[[0.041666666666666664]]]], dtype=np.float64), np.array([[[[0.041666666666666664]]]], dtype=np.float64), np.array([[[[0.041666666666666664]]]], dtype=np.float64)], [np.empty((0, 1, 0, 1), dtype=np.float64), np.empty((0, 1, 0, 1), dtype=np.float64), np.empty((0, 1, 0, 1), dtype=np.float64), np.empty((0, 1, 0, 1), dtype=np.float64), np.empty((0, 1, 0, 1), dtype=np.float64), np.empty((0, 1, 0, 1), dtype=np.float64)], [np.empty((0, 1, 0, 1), dtype=np.float64), np.empty((0, 1, 0, 1), dtype=np.float64), np.empty((0, 1, 0, 1), dtype=np.float64), np.empty((0, 1, 0, 1), dtype=np.float64)], [np.empty((0, 1, 0, 1), dtype=np.float64)]],
0,
basix.MapType.identity,
basix.SobolevSpace.H1,
False,
-1,
1,
basix.PolysetType.standard, dtype=np.float64
)