parent
2767a75a1b
commit
a23167c57d
5 changed files with 151 additions and 14 deletions
@ -0,0 +1,106 @@ |
|||||||
|
|
||||||
|
from sympy import sqrt, symbols, factorial, IndexedBase, Symbol |
||||||
|
|
||||||
|
p = IndexedBase("p") |
||||||
|
h = Symbol("h") |
||||||
|
|
||||||
|
def taylor(a, b, c): |
||||||
|
n = 4 |
||||||
|
derivatives = [0] * n |
||||||
|
steps = [0] * n |
||||||
|
|
||||||
|
result = p |
||||||
|
|
||||||
|
for order in range(1, n+1): |
||||||
|
for i in range(0, 3**order): |
||||||
|
for j in range(0, order): |
||||||
|
derivatives[j] = int((i / (3**(order-1-j))) % 3 + 1) |
||||||
|
step = [a, b, c][derivatives[j] - 1] |
||||||
|
steps[j] = step |
||||||
|
|
||||||
|
total_step = 1 |
||||||
|
symbol_name = "" |
||||||
|
for j in range(0, order): |
||||||
|
total_step *= (steps[j] * h) |
||||||
|
component = derivatives[j] - 1 |
||||||
|
symbol_name += ["x", "y", "z"][component] |
||||||
|
|
||||||
|
result += (1 / factorial(order)) * total_step * Symbol(symbol_name) |
||||||
|
return result; |
||||||
|
|
||||||
|
def expand_laplacian(face, corner): |
||||||
|
# Note: Any linear combination of the face and corner coefficients will |
||||||
|
# produce a valid discretized Laplacian, except for when normalization == 0 |
||||||
|
center = face * 4 + corner * 4 |
||||||
|
normalization = face + 2 * corner |
||||||
|
|
||||||
|
expr = ( |
||||||
|
- center * taylor(0, 0, 0) |
||||||
|
|
||||||
|
+ face * taylor( 1, 0, 0) |
||||||
|
+ face * taylor(-1, 0, 0) |
||||||
|
+ face * taylor( 0, -1, 0) |
||||||
|
+ face * taylor( 0, 1, 0) |
||||||
|
|
||||||
|
+ corner * taylor( 1, 1, 0) |
||||||
|
+ corner * taylor( 1, -1, 0) |
||||||
|
+ corner * taylor(-1, 1, 0) |
||||||
|
+ corner * taylor(-1, -1, 0) |
||||||
|
|
||||||
|
) / (normalization*h*h) |
||||||
|
|
||||||
|
print("Laplacian:") |
||||||
|
print("\tCenter: {:+d}".format(-center)) |
||||||
|
print("\tFace: {:+d}".format(face)) |
||||||
|
print("\tCorner: {:+d}".format(corner)) |
||||||
|
print("\tNormalization: {:+d}".format(normalization)) |
||||||
|
print("\tExpansion: {}".format(expr.simplify())) |
||||||
|
print() |
||||||
|
|
||||||
|
return expr |
||||||
|
|
||||||
|
#a = expand_laplacian(1, 0) |
||||||
|
#b = expand_laplacian(0, 1) |
||||||
|
#c = expand_laplacian(1, 1) |
||||||
|
#d = expand_laplacian(2, 1) |
||||||
|
#e = expand_laplacian(1, 2) |
||||||
|
|
||||||
|
expr_colocated = ( |
||||||
|
-4*taylor(0, 0, 0) |
||||||
|
+1*taylor(-2, 0, 0) |
||||||
|
+1*taylor(+2, 0, 0) |
||||||
|
+1*taylor(0, -2, 0) |
||||||
|
+1*taylor(0, +2, 0) |
||||||
|
) / (4*h*h) |
||||||
|
|
||||||
|
expr_wide = ( |
||||||
|
-8*taylor(0, 0, 0) |
||||||
|
+1*taylor(-1, 0, 0) |
||||||
|
+1*taylor(+1, 0, 0) |
||||||
|
+1*taylor(0, -1, 0) |
||||||
|
+1*taylor(0, +1, 0) |
||||||
|
+1*taylor(-1,-1, 0) |
||||||
|
+1*taylor(+1,+1, 0) |
||||||
|
+1*taylor(+1, -1, 0) |
||||||
|
+1*taylor(-1, +1, 0) |
||||||
|
) / (3*h*h) |
||||||
|
|
||||||
|
expr_vertex = ( |
||||||
|
-4*taylor(0, 0, 0) |
||||||
|
+1*taylor(-1,-1, 0) |
||||||
|
+1*taylor(+1,+1, 0) |
||||||
|
+1*taylor(+1, -1, 0) |
||||||
|
+1*taylor(-1, +1, 0) |
||||||
|
) / (2*h*h) |
||||||
|
|
||||||
|
expr_mac = ( |
||||||
|
-4*taylor(0, 0, 0) |
||||||
|
+1*taylor(-1, 0, 0) |
||||||
|
+1*taylor(+1, 0, 0) |
||||||
|
+1*taylor(0, -1, 0) |
||||||
|
+1*taylor(0, +1, 0) |
||||||
|
) / (h*h) |
||||||
|
|
||||||
|
print((expr_colocated - expr_mac).simplify()) |
||||||
|
print((expr_colocated - expr_wide).simplify()) |
||||||
|
print((expr_colocated - expr_vertex).simplify()) |
||||||
@ -0,0 +1,14 @@ |
|||||||
|
#version 300 es |
||||||
|
|
||||||
|
precision highp float; |
||||||
|
|
||||||
|
in vec2 pos; |
||||||
|
out vec2 texCoord; |
||||||
|
|
||||||
|
uniform mat4 mvp; |
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
texCoord = 0.5*(pos + vec2(1,1)); |
||||||
|
gl_Position = mvp * vec4(pos, 0, 1); |
||||||
|
} |
||||||
Loading…
Reference in new issue