2 minute read

공학도를 위한 창의적컴퓨팅에서 진행한 Paraview 실습 내용들

기본적인 makevtu

def makevtu(filename, node, element):
    a = open(filename, 'w')
    # 기본문장
    a.write('# vtk DataFile Version 3.0\n')
    a.write('test\n')
    a.write('ASCII\n')
    a.write('DATASET UNSTRUCTURED_GRID\n')

    # 꼭짓점 좌표 입력
    a.write('POINTS '+str(len(node))+' float\n')   
    for i in range(len(node)):
        a.write(str(node[i][0])+ ' ' + str(node[i][1])+ ' '+str(node[i][2])+'\n')
    
    # 도형을 정의
    a.write('CELLS '+str(len(element))+' '+str(len(element)*4)+'\n')    
    for i in range(len(element)):
        a.write('3 '+str(element[i][0])+' '+str(element[i][1])+ ' '+str(element[i][2])+'\n')
    
    #도형의 형태를 정의
    a.write('CELL_TYPES '+str(len(element))+'\n')    
    for i in range(len(element)):
        a.write('5\n')

    a.close()

행렬의 곱 - 이게 makevtu보다 위에 가야할 수도

def matrixvec(mat, vec):
    # mat: 2차 리스트
    # vec: 1차 리스트
    # c = mat * vec # 얘는 1차 리스트로 나와야함
    c = []
    for i in range(len(mat)):
        c.append(0)
        for j in range(len(vec)):
            c[i] += mat[i][j] * vec[j]
    return c

txt 파일 읽어와서 node, element 추가

a = open('input.txt', 'r')
node_num = int(a.readline().split(' ')[1])
dummy = a.readline() # 쓸데없지만 다음거 읽으려고 읽어옴

node = []
for i in range(node_num):
    b = a.readline().split(',')
    node.append([float(b[1]), float(b[2]), 0])

element_num = int(a.readline().split(' ')[1])
dummy = a.readline()

element = []
for i in range(element_num):
    b = a.readline().split(',')
    element.append([int(b[1])-1, int(b[2])-1, int(b[3])-1]) # 번호는 파일의 node_num이므로 idx로 볼려면 -1해야함

a.close()

도형들

정육면체

node=[[0,0,0],[1,0,0],[1,1,0],[0,1,0],[0,0,1],[1,0,1],[1,1,1],[0,1,1]]
element=[[4,1,0],[5,1,4],[5,2,1],[5,6,2],[7,6,2],[7,2,3],[4,7,3],[4,3,0],[7,6,5],[7,5,4],[3,2,1],[3,1,0]]

makevtu('cubit.vtu',node,element)

div = 100
r =1
theta = (360/div)*math.pi/180

node = [[0,0,0]]
for i in range(div):
    node.append([r*math.cos(i*theta),r*math.sin(i*theta),0])

element = []
for i in range(1,div+1):
    if(i==div):
        element.append([0,i,1])
    else:
        element.append([0,i,i+1])

makevtu('circle.vtu', node, element)

반구

div = 100
r = 1
div_z = 100
theta = (360/div)*(math.pi/180)

node = []
element = []

for j in range(div_z+1): # node
    ri = (r**2-(j*r/div_z)**2)**0.5
    for i in range(div):
        node.append([ri*math.cos(i*theta), ri*math.sin(i*theta), j*r/div_z])

for j in range(div_z): # element
    for i in range(div-1):
        element.append([i+div*j, i+div*(j+1), i+div*j+1])
    element.append([div*(j+1)-1, div-1+div*(j+1), div*j])

    for i in range(div-1):
        element.append([i+div*j+1, i+div*(j+1), i+div*(j+1)+1])
    element.append([div*j, div-1+div*(j+1), div*(j+1)])

makevtu('bt.vtu',node,element)

구 - 미완성

div = 10
r = 1
div_z = 10
theta = (360/div)*(math.pi/180)

node = []
element = []

for j in range(div_z+1): # node
    ri = (r**2-(j*r/div_z)**2)**0.5
    for i in range(div):
        node.append([ri*math.cos(i*theta), ri*math.sin(i*theta), j*r/div_z])
for j in range(0,div_z): # node -z
    ri = (r**2-(j*r/div_z)**2)**0.5
    for i in range(div):
        node.append([ri*math.cos(i*theta), ri*math.sin(i*theta), -1*j*r/div_z])
for i in range(div): 
    ri=0
    node.append([ri*math.cos(i*theta), ri*math.sin(i*theta), -1*r])

for j in range(div_z*2): # element
    for i in range(div-1):
        element.append([i+div*j, i+div*(j+1), i+div*j+1])
    element.append([div*(j+1)-1, div-1+div*(j+1), div*j])

    for i in range(div-1):
        element.append([i+div*j+1, i+div*(j+1), i+div*(j+1)+1])
    element.append([div*j, div-1+div*(j+1), div*(j+1)])

makevtu('sphere.vtu',node,element)

애니메이션(움직이게)

파일명에 넘버링이 되어있으면 동영상이라고 인식

makevtu('simul0.vtu',points,cell) 
makevtu('simul1.vtu',points,cell) 
makevtu('simul2.vtu',points,cell)

평행이동

# [점의 좌표 이동, 모양 바뀜]
node[0][0] += 0.1 

# [전체가 수평이동, 이건 x축방향으로]
for j in range(20):
    for i in range(len(node)):
        node[i][0] += 0.1
    makevtu('simul'+str(j)+'.vtu',node,element)

회전

# [30도 회전]
theta = 30 * math.pi / 180
# rotate matrix define
rot = [
    [math.cos(theta),-1*math.sin(theta),0],
    [math.sin(theta),math.cos(theta),0],
    [0,0,1]
]
makevtu('rotri0.vtu',node,element)
for i in range(len(node)):
    node[i] = matrixvec(rot, node[i])
makevtu('rotri1.vtu',node,element)

# [1도씩 360도 회전]
makevtu('rotri0.vtu',node,element)
for j in range(1,361):
    theta = 1 * math.pi / 180
    # rotate matrix define
    rot = [
        [math.cos(theta),-1*math.sin(theta),0],
        [math.sin(theta),math.cos(theta),0],
        [0,0,1]
    ]
    for i in range(len(node)):
        node[i] = matrixvec(rot, node[i])
    makevtu('rotri'+str(j)+'.vtu',node,element)

(1, 0, 0)을 축으로 회전

# [1도씩 360도 회전] - 회전 후 x좌표 +1해서 (1,0,0)을 축으로 도는 것 처럼
makevtu('rotri0.vtu',node,element)
for j in range(1,361):
    theta = 1 * math.pi / 180
    # rotate matrix define
    rot = [
        [math.cos(theta),-1*math.sin(theta),0],
        [math.sin(theta),math.cos(theta),0],
        [0,0,1]
    ]

    for i in range(len(node)):
        node[i] = matrixvec(rot, node[i])
    for i in range(len(node)):
        node[i][0] += 1
    makevtu('rotri'+str(j)+'.vtu',node,element)
    for i in range(len(node)):
        node[i][0] -= 1

3차원 회전 - x축을 축으로 회전

# rotate matrix define
theta = 1 * math.pi / 180
rotx = [
    [1,0,0],
    [0,math.cos(theta),-1*math.sin(theta)],
    [0,math.sin(theta),math.cos(theta)]
    ]
roty = [
    [math.cos(theta),0,math.sin(theta)],
    [0,1,0],
    [-1*math.sin(theta),0,math.cos(theta)]
    ]
rotz = [
    [math.cos(theta),-1*math.sin(theta),0],
    [math.sin(theta),math.cos(theta),0],
    [0,0,1]
    ]

makevtu('rotri0.vtu',node,element)
for j in range(1,361):    
    for i in range(len(node)):
        node[i] = matrixvec(rotx, node[i])
    makevtu('rotri'+str(j)+'.vtu',node,element)