게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
심심해서 써보는 해석 이야기 (4) -해석 설정
게시물ID : science_66429짧은주소 복사하기
작성자 : 심심한3인
추천 : 2
조회수 : 239회
댓글수 : 0개
등록시간 : 2017/11/30 16:44:15

1.4   해석 단계

해석 단계는 이전 단계에서 구현된 값들(형상, physics, mesh)을 실질적으로 계산하여 주어진 지배식을 푸는 단계이다.


사실 이 해석 단계는 굉장히 정리하기 어려운 내용 중 하나입니다. 해석 종류마다, 툴마다 사용하는 method가 다르기 때문에 이 모든 것에 대하여 정리하기도 어렵습니다. 그렇기에 이 장에서는 기본적인 해석 종류 몇 가지와 방법 몇 가지만을 간략하게 정의해보도록 하겠습니다.

 

우선 해석의 타입.

해석의 타입은 해석하는 방식이라기 보다는 어떤 해석을 할 것인가를 의미합니다. 해석 타입의 종류는 많지만 가장 대표적인 해석 타입은 하기와 같습니다.


Stationary : 정상상태 해석, 시간에 따른 변화율이 없는 안정화된 상태를 보기 위한 해석

Time Dependent : 과도해석, 시간에 따라 변화하는 과정을 보기 위한 해석


이외에도 주파수 해석인 Frequency 해석이나, 고유진동수 해석인 Eigenfrequency 해석 등 다양한 해석들이 있으며, 이러한 해석들에서 파생된 해석 타입들도 굉장히 많습니다.

 

우선 정상상태 해석에 대해 일부 설명 드리면, 정상상태란 위에서 적은 것과 같이 시간에 따른 변화율이 없는 안정화된 상태를 의미합니다. 어떤 조건들(physics)에 대하여 시간이 충분히 흘렀을 때, 더 이상 시간에 따라 상태 값들이 변화하지 않으면 이를 정상상태라 하며, 경우에 따라 정상 상태는 존재하지 않을 수 있습니다.


과도해석은 시간에 따라 현상이 변화하는 과정을 보기 위한 해석입니다. 당연히 시간에 대한 도함수를 풀게 되며, 정상상태가 있는 상태라면, 충분히 많은 시간이 지나면 정상상태에 도달하게 될 수 있습니다.


간단한 예로 작은 사각형이 닫힌계에서 한쪽 면에 대해 계속해서 특정 온도를 부여해 주고, 반대쪽에서는 heat flux에 의해 특정한 값으로 에너지가 빠져나간다고 하면, 이 경우에는 사각형 전체에 대하여 적정한 온도분포를 가진 정상상태의 해가 존재하게 됩니다.하지만 위 예에서 온도를 부여한 조건에 대해 온도가 특정온도가 아닌 섭동 형태의 온도가 부여되게 된다면 어떻게 될까요? 당연히 이 경우 정상상태 해는 존재하지 않습니다. 이런 경우에 해를 구하기 위해서는 섭동 해석을 하시거나, 시간해석을 구하셔야 합니다.


굳이 이 경우가 아니더라도, 난류영역에 대한 해석이거나, 상황에 따라 시간에 따라 상태 값이 계속 변화는 경우는 정상상태 해가 존재하지 않을 수 있으니 이 점에 대한 주의 바랍니다.


이 부분에 대해 하나의 팁을 드리자면, 해석자가 구하고자 하는 해석 타입이 정상상태의 해라면, 초기 조건을 정상상태와 유사한 상태로 두시거나, 시간해석을 일부 진행 한 후에 그 값을 초기값으로 사용하면 좀 더 빠르게 정상상태에 도달할 수 있습니다. 혹은 이러한 방법을 이용한 다른 방법을 이용할 수도 있겠지요(이를 테면 Pseudo time stepping 기법과 같이요).


이렇게 해석하고자 하는 해석 타입을 정했다면, 이 타입을 어떻게 해석해야 하는지를 정해야 합니다. 쉽게 말해 해석 타입이 우리의 목표점이라면, 어떤 방법을 통해 목표점으로 갈 것인지를 정하는 것이 이 단계입니다.

 

어떤 도구로 해석할 것인가.

이 단계는 지원하는 코드나, 상용 툴마다 다를 수 있으나 일반적으로 다음과 같은 방법 중 하나를 사용합니다.


단일소켓 단일 코어 사용: 이 방법은 cpu로 연산하는 방법이며, cpu의 소켓 하나를 이용해서 전체 수식을 계산합니다. 당연히 시간이 많이 걸립니다.

단일소켓 다중 코어 사용: 주로 OpenMP기법으로 사용되는 이 방법은, 한 소켓 내의 cpu를 이용해서 cpu 내의 다중 코어를 이용한 계산입니다. 일반적으로 전자에 비해 속도가 빠르다는 장점이 있습니다.

다중소켓 다중 코어 사용: 주로 MPI를 통해 구성된 코드에서 사용하고, 2개이상의 cpu를 이용하여 계산합니다. 워크스테이션 등이 이런 방법을 쓰며, 우리가 흔히 말하는 클러스터를 이용해 병렬처리로 계산하기도 합니다.

GPU 사용: 이 방법은 CPU가 아닌 그래픽 카드에 장착된 GPU를 이용하여 해석을 수행하며, cpu에 비해 계산속도가 빠르다는 장점이 있습니다.


위에 언급한 내용 중 다중 코어나 다중 소켓 사용은 일반적으로 빠르지만, 그렇다고 항상 빨라지는 것은 아니라는 점을 주의해주시기 바랍니다. 일반적으로 병렬처리를 통한 계산은 geometry상에서 공간을 분할하여 풀거나, 각각의 cpu가 서로 다른 dependent variable을 푸는 방식 등이 있는데, 매우 간단한 문제의 경우 오히려 성능 저하를 야기할 수도 있습니다. 쉽게 말하면 1+1을 푸는데 이를 분할해서 푸는 터에 소켓간 값을 주고받는 시간이 계산시간보다 많이 걸리게 되는 것이죠. 따라서 이러한 병렬처리는 무거운 문제일수록 유용하다는 점을 기억하시면 좋을 듯 합니다.

 

다음 단계는 직접적인 method 부분입니다. 사실 이 부분에 대해서는 제가 언급하기 까다롭습니다. 앞서 말했듯이 저는 특정 코드를 사용하고 있는 터라, 전체 method에 대해 알지 못하니까요. 그렇기에 method설정은 넘어가고 대신 method이전에 제가 사용하고 있는 툴에서 기본적인 해석을 하는 방식 중 몇 개를 말씀 드릴까 합니다.

 

Fully Coupled Segregated 방식 / Direct Iterative방식

제가 사용하고 있는 툴은(많은 툴이 그렇겠지만) 복합 문제에 대한 행렬을 푸는 방식을 채택하고 있습니다. 따라서 해석을 구성하는 지배식이 커질수록 행렬은 거대해지기 마련입니다. 이 경우 이 행렬을 풀 때 기본적으로 두 가지 방법을 사용합니다.

Fully Coupled : 모든 dependent variable을 한꺼번에 푸는 방식으로 대형행렬연산을 수행합니다. 이 경우 행렬을 묶어서 풀기 때문에 수렴성이 높다는 장점을 갖고 있으며, 해석이 가벼운 경우에는 해가 빨리 수렴될 수 있습니다.

Segregated : dependent variable을 단계로 나누어 풉니다. 즉 대형 행렬을 분산하여 해석하는 방식입니다. 당연히 리소스가 적다는 장점이 있으나, 강한 결합 문제의 경우에는 수렴에 문제가 있을 수 있습니다. 다만 행렬 사이즈가 커지게 되면 큰 하나의 행렬을 푸는 것보다 작은 여러 개의 행렬을 푸는 시간의 합이 줄어들 수 있으므로, 대형 행렬 연산 시 해석 시간이 빨라질 수 있습니다


예를 들어 열 유동을 풀게 된다면 우리가 구할 일반적인 Dependent variable은 속도와 관련된 u, 압력과 관련된 p, 온도와 관련된 T가 되게 됩니다. u,p,T를 한번에 푼다면 이는 Fully coupled가 될 것이고, u,p를 한번에 풀고 T를 나누어 풀면 이는 2 step을 가진 segregated방식이 되는 것입니다.


또한 이렇게 나누어진 행렬은 Direct 방식이나 Interative방식으로 또 나누어 풀게 되는데, Direct방식은 행렬을 직접 연산하는 것이고, Iterative 방식의 경우 반복법을 통해 해를 점차 수렴해 나가는 방법입니다. 역시 Direct방식은 LU분해를 통해 직접 연산을 수행하기에 리소스가 많이 드는 대신 수렴성이 좋고, iterative 방식은 행렬자체를 직접연산하는 방식이 아니기 때문에 리소스를 적게 먹는 대신 수렴성이 다소 떨어질 수 있다는 단점이 있습니다. 시간의 경우 초기값이나, 지배방정식의 컨디션에 따라 달라질 수 있으므로 어느 것이 빠르다 라고 함부로 이야기 하기는 어렵습니다. (만 일반적인 경우라면 direct방식이 빠른 편입니다.)


여기서 더 나아가게 되면, 반복법의 경우, 잔차를 이용하여 해석을 하게 되는데, 잔차 해석을 위한 전처리로써 Preconditioner가 필요합니다. 즉 최소점을 구하기 위한 반복법은 최초값에서부터 시작하여 축방향으로 움직인 후 축방향에서 최소값으로 이동하는 것을 반복하는데, 이러한 경우 조건수가 큰 경우에는 수렴이 되지 않는 ill-condition을 갖게 되며 이러한 조건 수를 향상시키는 방법이 preconditioner라고 이해하시면 되겠습니다.


사실 direct방법이나 iterative방식에는 LU분해를 하거나 잔차를 구하기 위한 많은 method들이 존재하며 Preconditioner역시 다양하지만 이 부분은 결국 행렬의 풀이 방식에 따른 것이고, 워낙 많은 method가 존재하기에 후에 기회가 되면 설명 드리도록 하겠습니다.

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호