Skip to content

Commit b85a2ef

Browse files
authored
Add stiffness matrix demo (#94)
* Add stiffness matrix demo * flake
1 parent 1d73c37 commit b85a2ef

File tree

5 files changed

+66
-0
lines changed

5 files changed

+66
-0
lines changed

demo/stiffness_matrix.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import symfem
2+
from symfem.core.vectors import vdot
3+
from symfem.core.calculus import grad
4+
5+
matrix = [[0 for i in range(4)] for j in range(4)]
6+
7+
vertices = [(0, 0), (1, 0), (0, 1), (1, 1)]
8+
triangles = [[0, 1, 2], [1, 3, 2]]
9+
10+
element = symfem.create_element("triangle", "Lagrange", 1)
11+
for triangle in triangles:
12+
vs = [vertices[i] for i in triangle]
13+
ref = symfem.create_reference("triangle", vertices=vs)
14+
basis = element.map_to_cell(vs)
15+
for test_i, test_f in zip(triangle, basis):
16+
for trial_i, trial_f in zip(triangle, basis):
17+
integrand = vdot(grad(test_f, 2), grad(trial_f, 2))
18+
matrix[test_i][trial_i] += ref.integral(integrand)
19+
20+
print(matrix)

docs/demos/custom_element.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,8 @@
22
Defining a custom element
33
#########################
44

5+
This demo shows how a custom element with custom functionals can be
6+
defined in Symfem.
7+
58
.. literalinclude:: ../../demo/custom_element.py
69
:language: Python

docs/demos/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ Symfem demos
55
.. toctree::
66
:titlesonly:
77

8+
stiffness_matrix
89
custom_element
910

docs/demos/stiffness_matrix.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
############################
2+
Computing a stiffness matrix
3+
############################
4+
5+
This demo shows how a stiffness matrix over a simple mesh can be
6+
computed using Symfem.
7+
8+
.. literalinclude:: ../../demo/stiffness_matrix.py
9+
:language: Python

test/test_stiffness_matrix.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import symfem
2+
import sympy
3+
from symfem.core.vectors import vdot
4+
from symfem.core.calculus import grad
5+
6+
7+
def test_stiffness_matrix():
8+
vertices = [(0, 0), (1, 0), (0, 1), (1, 1)]
9+
triangles = [[0, 1, 2], [1, 3, 2]]
10+
11+
matrix = [[0 for i in vertices] for j in vertices]
12+
13+
element = symfem.create_element("triangle", "Lagrange", 1)
14+
for triangle in triangles:
15+
vs = [vertices[i] for i in triangle]
16+
ref = symfem.create_reference("triangle", vertices=vs)
17+
basis = element.map_to_cell(vs)
18+
for test_i, test_f in zip(triangle, basis):
19+
for trial_i, trial_f in zip(triangle, basis):
20+
integrand = vdot(grad(test_f, 2), grad(trial_f, 2))
21+
matrix[test_i][trial_i] += ref.integral(integrand)
22+
23+
half = sympy.Rational(1, 2)
24+
actual_matrix = [
25+
[1, -half, -half, 0],
26+
[-half, 1, 0, -half],
27+
[-half, 0, 1, -half],
28+
[0, -half, -half, 1]
29+
]
30+
31+
for row1, row2 in zip(matrix, actual_matrix):
32+
for i, j in zip(row1, row2):
33+
assert i == j

0 commit comments

Comments
 (0)