Код: Выделить всё
import numpy as np
from skimage import measure
import trimesh as tm
def gyroid(x, y, z, f, l, a):
f_x, f_y, f_z = f
l_x, l_y, l_z = l
a_x, a_y, a_z = a
X = 2 * np.pi * f_x / l_x * (x - a_x)
Y = 2 * np.pi * f_y / l_y * (y - a_y)
Z = 2 * np.pi * f_z / l_z * (z - a_z)
return (np.cos(X) * np.sin(Y) + np.cos(Y) * np.sin(Z) + np.cos(Z) * np.sin(X))
def grid(p, voxPerP, padVox, l):
p_x, p_y, p_z = p
N_x = int(p_x * voxPerP) + 2 * padVox * 0
N_y = int(p_y * voxPerP) + 2 * padVox * 0
N_z = int(p_z * voxPerP) + 2 * padVox * 0
l_x, l_y, l_z = l
x, y, z = np.meshgrid(np.linspace(0, l_x * p_x, N_x), np.linspace(0, l_y * p_y, N_y), np.linspace(0, l_z * p_z, N_z), indexing='ij')
surface = gyroid(x, y, z, f, l, a).astype(np.float32)
h_x = l_x * p_x / (N_x - 1)
h_y = l_y * p_y / (N_y - 1)
h_z = l_z * p_z / (N_z - 1)
return surface, (h_x, h_y, h_z), (x, y, z)
def meshing(surface, spacing, C):
vertex_1, face_1, vertexNormal_1, \_ = measure.marching_cubes(surface, level = C, spacing = spacing, allow_degenerate = False)
vertex_2, face_2, vertexNormal_2, \_ = measure.marching_cubes(surface, level = - C, spacing = spacing, allow_degenerate = False)
mesh_1 = tm.Trimesh(vertices = vertex_1, faces = face_1, vertex_normals = vertexNormal_1, process = True)
mesh_2 = tm.Trimesh(vertices = vertex_2, faces = face_2, vertex_normals = vertexNormal_2, process = True)
return mesh_1, mesh_2
def export(mesh, path):
mesh.export(path)
if __name__ == "__main__":
#f_i ∈ {1, 2, 3, 4}, height × length × width = 7.2 × 3.6 × 3.6, a_i ∈ \[0, 0.8\] × 1.25π / L_i, C ∈ \[0.24, 1\], t = 1 (conservative)
f = (2, 4, 4)
l = (7.2, 3.6, 3.6)
a = (0.7062, 0, 0)
C = 0.24
#The single unit cell is to be observed therefore repeated one time, resolution may be lowered, additional part can be removed.
p = (1, 1, 1)
voxPerP = 200
padVox = 1
surface, spacing, _ = grid(p, voxPerP, padVox, l)
mesh_1, mesh_2 = meshing(surface, spacing, C)
export(mesh_1, "gyroid_1.stl")
export(mesh_2, "gyroid_2.stl")
print("Finished.")
В этом коде я стремлюсь создать одну элементарную ячейку для HEX-сердечника гироида, частота, длина и значения изменения формы которого определяются, а затем сформировать общую часть теплопередачи, которая будет скопирована (TPMS). Знайте, что все они установлены на 1, так как для быстроты я буду анализировать один модуль в ANSYS Fluent.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -generator