"""Some operations for functions defined on a square-grid.
"""
from ddg.math import euclidean2d
[docs]def dual_vertex_star(f, n1, n2):
O = f(n1, n2)
A = f(n1 + 1, n2)
B = f(n1 + 1, n2 + 1)
C = f(n1, n2 + 1)
D = f(n1 - 1, n2 + 1)
E = f(n1 - 1, n2)
F = f(n1 - 1, n2 - 1)
G = f(n1, n2 - 1)
H = f(n1 + 1, n2 - 1)
Os, As, Bs, Cs = euclidean2d.dual_quadrilateral(O, A, B, C)
O2, C2, D2, E2 = euclidean2d.dual_quadrilateral(O, C, D, E)
t2 = np.dot(Cs, C2) / np.linalg.norm(C2) ** 2
Ds = t2 * D2
Es = t2 * E2
O3, E3, F3, G3 = euclidean2d.dual_quadrilateral(O, E, F, G)
t3 = np.dot(Es, E3) / np.linalg.norm(E3) ** 2
Fs = t3 * F3
Gs = t3 * G3
O4, G4, H4, A4 = euclidean2d.dual_quadrilateral(O, G, H, A)
t4 = np.dot(Gs, G4) / np.linalg.norm(G4) ** 2
Hs = t4 * H4
return (Os, As, Bs, Cs, Ds, Es, Fs, Gs, Hs)
[docs]def isotherm_test(f, n1, n2):
O = f(n1, n2)
A = f(n1 + 1, n2)
B = f(n1 + 1, n2 + 1)
C = f(n1, n2 + 1)
D = f(n1 - 1, n2 + 1)
E = f(n1 - 1, n2)
F = f(n1 - 1, n2 - 1)
G = f(n1, n2 - 1)
H = f(n1 + 1, n2 - 1)
Os, As, Bs, Cs, Ds, Es, Fs, Gs, Hs = euclidean2d.dual_vertex_star(f, n1, n2)
return (
np.dot(B - O, Cs - As)
+ np.dot(D - O, Es - Cs)
+ np.dot(F - O, Gs - Es)
+ np.dot(H - O, As - Gs)
)
[docs]def Koenigs_face_norm(f, n1, n2):
A = f(n1, n2)
B = f(n1 + 1, n2)
C = f(n1 + 1, n2 + 1)
D = f(n1, n2 + 1)
return (euclidean2d.diagonals_intersection(A, B, C, D), np.cross(B - A, D - A))
[docs]def Koenigs_vertex_norm(f, n1, n2):
O = f(n1, n2)
A = f(n1 + 1, n2)
B = f(n1 + 1, n2 + 1)
C = f(n1, n2 + 1)
D = f(n1 - 1, n2 + 1)
E = f(n1 - 1, n2)
F = f(n1 - 1, n2 - 1)
G = f(n1, n2 - 1)
H = f(n1 + 1, n2 - 1)
M1 = euclidean2d.diagonals_intersection(O, A, B, C)
M2 = euclidean2d.diagonals_intersection(O, C, D, E)
M3 = euclidean2d.diagonals_intersection(O, E, F, G)
M4 = euclidean2d.diagonals_intersection(O, G, H, A)
return (O, np.cross(M4 - M3, M2 - M3))
[docs]def Koenigs_face_norm_coplanar_test(f, n1, n2):
a1, v1 = Koenigs_face_norm(f, n1, n2)
a2, v2 = Koenigs_face_norm(f, n1 - 1, n2)
a3, v3 = Koenigs_face_norm(f, n1 - 1, n2 - 1)
a4, v4 = Koenigs_face_norm(f, n1, n2 - 1)
return (
euclidean2d.distance_lines(a1, v1, a2, v2),
euclidean2d.distance_lines(a2, v2, a3, v3),
euclidean2d.distance_lines(a3, v3, a4, v4),
euclidean2d.distance_lines(a4, v4, a1, v1),
)
[docs]def Koenigs_vertex_norm_coplanar_test(f, n1, n2):
a1, v1 = Koenigs_vertex_norm(f, n1, n2)
a2, v2 = Koenigs_vertex_norm(f, n1 + 1, n2)
a3, v3 = Koenigs_vertex_norm(f, n1 + 1, n2 + 1)
a4, v4 = Koenigs_vertex_norm(f, n1, n2 + 1)
return (
euclidean2d.distance_lines(a1, v1, a2, v2),
euclidean2d.distance_lines(a2, v2, a3, v3),
euclidean2d.distance_lines(a3, v3, a4, v4),
euclidean2d.distance_lines(a4, v4, a1, v1),
)