<p class="MsoListParagraph" style="margin-left:38pt;text-indent:-18pt;"><b><span lang="en-us">1.4<span style="font-size:7pt;line-height:normal;font-family:'Times New Roman';"> </span></span>해석 단계</b><span lang="en-us"></span></p><p></p> <p class="MsoNormal">해석 단계는 이전 단계에서 구현된 값들<span lang="en-us">(</span>형상<span lang="en-us">, physics, mesh)</span>을 실질적으로 계산하여 주어진 지배식을 푸는 단계이다<span lang="en-us">.</span></p> <p class="MsoNormal"><span lang="en-us"><br></span></p> <p class="MsoNormal">사실 이 해석 단계는 굉장히 정리하기 어려운 내용 중 하나입니다<span lang="en-us">. </span>해석 종류마다<span lang="en-us">, </span>툴마다 사용하는 <span lang="en-us">method</span>가 다르기 때문에 이 모든 것에 대하여 정리하기도 어렵습니다<span lang="en-us">. </span>그렇기에 이 장에서는 기본적인 해석 종류 몇 가지와 방법 몇 가지만을 간략하게 정의해보도록 하겠습니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><span style="font-size:9pt;"> </span></p> <p class="MsoNormal"><b>우선 해석의 타입</b><span lang="en-us"><b>.</b></span></p><p></p> <p class="MsoNormal">해석의 타입은 해석하는 방식이라기 보다는 어떤 해석을 할 것인가를 의미합니다<span lang="en-us">. </span>해석 타입의 종류는 많지만 가장 대표적인 해석 타입은 하기와 같습니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><span lang="en-us"><br></span></p> <p class="MsoNormal"><b><span lang="en-us">Stationary : </span>정상상태 해석<span lang="en-us">, </span>시간에 따른 변화율이 없는 안정화된 상태를 보기 위한 해석</b></p> <p class="MsoNormal"><b><span lang="en-us">Time Dependent : </span>과도해석<span lang="en-us">, </span>시간에 따라 변화하는 과정을 보기 위한 해석</b><span lang="en-us"></span></p><p></p> <p class="MsoNormal"><span style="font-size:9pt;"><br></span></p> <p class="MsoNormal"><span style="font-size:9pt;">이외에도 주파수 해석인 </span><span lang="en-us" style="font-size:9pt;">Frequency </span><span style="font-size:9pt;">해석이나</span><span lang="en-us" style="font-size:9pt;">, </span><span style="font-size:9pt;">고유진동수 해석인 </span><span lang="en-us" style="font-size:9pt;">Eigenfrequency </span><span style="font-size:9pt;">해석 등 다양한 해석들이 있으며</span><span lang="en-us" style="font-size:9pt;">, </span><span style="font-size:9pt;">이러한 해석들에서 파생된 해석 타입들도 굉장히 많습니다</span><span lang="en-us" style="font-size:9pt;">.</span></p> <p class="MsoNormal"><span lang="en-us"> </span></p> <p class="MsoNormal">우선 정상상태 해석에 대해 일부 설명 드리면<span lang="en-us">, </span>정상상태란 위에서 적은 것과 같이 시간에 따른 변화율이 없는 안정화된 상태를 의미합니다<span lang="en-us">. </span>어떤 조건들<span lang="en-us">(physics)</span>에 대하여 시간이 충분히 흘렀을 때<span lang="en-us">, </span>더 이상 시간에 따라 상태 값들이 변화하지 않으면 이를 정상상태라 하며<span lang="en-us">, </span>경우에 따라 정상 상태는 존재하지 않을 수 있습니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><span lang="en-us"><br></span></p> <p class="MsoNormal">과도해석은 시간에 따라 현상이 변화하는 과정을 보기 위한 해석입니다<span lang="en-us">. </span>당연히 시간에 대한 도함수를 풀게 되며<span lang="en-us">, </span>정상상태가 있는 상태라면<span lang="en-us">, </span>충분히 많은 시간이 지나면 정상상태에 도달하게 될 수 있습니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><span lang="en-us"><br></span></p> <p class="MsoNormal">간단한 예로 작은 사각형이 닫힌계에서 한쪽 면에 대해 계속해서 특정 온도를 부여해 주고<span lang="en-us">, </span>반대쪽에서는 <span lang="en-us">heat flux</span>에 의해 특정한 값으로 에너지가 빠져나간다고 하면<span lang="en-us">, </span>이 경우에는 사각형 전체에 대하여 적정한 온도분포를 가진 정상상태의 해가 존재하게 됩니다.<span style="font-size:9pt;">하지만 위 예에서 온도를 부여한 조건에 대해 온도가 특정온도가 아닌 섭동 형태의 온도가 부여되게 된다면 어떻게 될까요</span><span lang="en-us" style="font-size:9pt;">? </span><span style="font-size:9pt;">당연히 이 경우 정상상태 해는 존재하지 않습니다</span><span lang="en-us" style="font-size:9pt;">. </span><span style="font-size:9pt;">이런 경우에 해를 구하기 위해서는 섭동 해석을 하시거나</span><span lang="en-us" style="font-size:9pt;">, </span><span style="font-size:9pt;">시간해석을 구하셔야 합니다</span><span lang="en-us" style="font-size:9pt;">.</span></p> <p class="MsoNormal"><span lang="en-us" style="font-size:9pt;"><br></span></p> <p class="MsoNormal">굳이 이 경우가 아니더라도<span lang="en-us">, </span>난류영역에 대한 해석이거나<span lang="en-us">, </span>상황에 따라 시간에 따라 상태 값이 계속 변화는 경우는 정상상태 해가 존재하지 않을 수 있으니 이 점에 대한 주의 바랍니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><span lang="en-us"><br></span></p> <p class="MsoNormal">이 부분에 대해 하나의 팁을 드리자면<span lang="en-us">, </span>해석자가 구하고자 하는 해석 타입이 정상상태의 해라면<span lang="en-us">, </span>초기 조건을 정상상태와 유사한 상태로 두시거나<span lang="en-us">, </span>시간해석을 일부 진행 한 후에 그 값을 초기값으로 사용하면 좀 더 빠르게 정상상태에 도달할 수 있습니다<span lang="en-us">. </span>혹은 이러한 방법을 이용한 다른 방법을 이용할 수도 있겠지요<span lang="en-us">(</span>이를 테면 <span lang="en-us">Pseudo time stepping </span>기법과 같이요<span lang="en-us">).</span></p> <p class="MsoNormal"><span lang="en-us"><br></span></p> <p class="MsoNormal">이렇게 해석하고자 하는 해석 타입을 정했다면<span lang="en-us">, </span>이 타입을 어떻게 해석해야 하는지를 정해야 합니다<span lang="en-us">. </span>쉽게 말해 해석 타입이 우리의 목표점이라면<span lang="en-us">, </span>어떤 방법을 통해 목표점으로 갈 것인지를 정하는 것이 이 단계입니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><span lang="en-us"> </span></p> <p class="MsoNormal"><b>어떤 도구로 해석할 것인가</b><span lang="en-us"><b>.</b></span></p><p></p> <p class="MsoNormal">이 단계는 지원하는 코드나<span lang="en-us">, </span>상용 툴마다 다를 수 있으나 일반적으로 다음과 같은 방법 중 하나를 사용합니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><b><br></b></p> <p class="MsoNormal"><b>단일소켓 단일 코어 사용<span lang="en-us">: </span>이 방법은 <span lang="en-us">cpu</span>로 연산하는 방법이며<span lang="en-us">, cpu</span>의 소켓 하나를 이용해서 전체 수식을 계산합니다<span lang="en-us">. </span>당연히 시간이 많이 걸립니다<span lang="en-us">.</span></b></p><p><b></b></p><b></b> <p class="MsoNormal"><b>단일소켓 다중 코어 사용<span lang="en-us">: </span>주로 <span lang="en-us">OpenMP</span>기법으로 사용되는 이 방법은<span lang="en-us">, </span>한 소켓 내의 <span lang="en-us">cpu</span>를 이용해서 <span lang="en-us">cpu </span>내의 다중 코어를 이용한 계산입니다<span lang="en-us">. </span>일반적으로 전자에 비해 속도가 빠르다는 장점이 있습니다<span lang="en-us">.</span></b></p><p><b></b></p><b></b> <p class="MsoNormal"><b>다중소켓 다중 코어 사용<span lang="en-us">: </span>주로 <span lang="en-us">MPI</span>를 통해 구성된 코드에서 사용하고<span lang="en-us">, 2</span>개이상의 <span lang="en-us">cpu</span>를 이용하여 계산합니다<span lang="en-us">. </span>워크스테이션 등이 이런 방법을 쓰며<span lang="en-us">, </span>우리가 흔히 말하는 클러스터를 이용해 병렬처리로 계산하기도 합니다<span lang="en-us">.</span></b></p><p><b></b></p><b></b> <p class="MsoNormal"><b><span lang="en-us">GPU </span>사용<span lang="en-us">: </span>이 방법은 <span lang="en-us">CPU</span>가 아닌 그래픽 카드에 장착된 <span lang="en-us">GPU</span>를 이용하여 해석을 수행하며<span lang="en-us">, cpu</span>에 비해 계산속도가 빠르다는 장점이 있습니다</b><span lang="en-us"><b>.</b></span></p><p></p> <p class="MsoNormal"><br></p> <p class="MsoNormal">위에 언급한 내용 중 다중 코어나 다중 소켓 사용은 일반적으로 빠르지만<span lang="en-us">, </span>그렇다고 항상 빨라지는 것은 아니라는 점을 주의해주시기 바랍니다<span lang="en-us">. </span>일반적으로 병렬처리를 통한 계산은 <span lang="en-us">geometry</span>상에서 공간을 분할하여 풀거나<span lang="en-us">, </span>각각의 <span lang="en-us">cpu</span>가 서로 다른 <span lang="en-us">dependent variable</span>을 푸는 방식 등이 있는데<span lang="en-us">, </span>매우 간단한 문제의 경우 오히려 성능 저하를 야기할 수도 있습니다<span lang="en-us">. </span>쉽게 말하면 <span lang="en-us">1+1</span>을 푸는데 이를 분할해서 푸는 터에 소켓간 값을 주고받는 시간이 계산시간보다 많이 걸리게 되는 것이죠<span lang="en-us">. </span>따라서 이러한 병렬처리는 무거운 문제일수록 유용하다는 점을 기억하시면 좋을 듯 합니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><span lang="en-us"> </span></p> <p class="MsoNormal">다음 단계는 직접적인 <span lang="en-us">method </span>부분입니다<span lang="en-us">. </span>사실 이 부분에 대해서는 제가 언급하기 까다롭습니다<span lang="en-us">. </span>앞서 말했듯이 저는 특정 코드를 사용하고 있는 터라<span lang="en-us">, </span>전체 <span lang="en-us">method</span>에 대해 알지 못하니까요<span lang="en-us">. </span>그렇기에 <span lang="en-us">method</span>설정은 넘어가고 대신 <span lang="en-us">method</span>이전에 제가 사용하고 있는 툴에서 기본적인 해석을 하는 방식 중 몇 개를 말씀 드릴까 합니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><span lang="en-us"> </span></p> <p class="MsoNormal"><b><span lang="en-us">Fully Coupled </span>와 <span lang="en-us">Segregated </span>방식 <span lang="en-us">/ Direct </span>와 <span lang="en-us">Iterative</span>방식</b><span lang="en-us"></span></p><p></p> <p class="MsoNormal">제가 사용하고 있는 툴은<span lang="en-us">(</span>많은 툴이 그렇겠지만<span lang="en-us">) </span>복합 문제에 대한 행렬을 푸는 방식을 채택하고 있습니다<span lang="en-us">. </span>따라서 해석을 구성하는 지배식이 커질수록 행렬은 거대해지기 마련입니다<span lang="en-us">. </span>이 경우 이 행렬을 풀 때 기본적으로 두 가지 방법을 사용합니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><b><span lang="en-us">Fully Coupled : </span>모든 <span lang="en-us">dependent variable</span>을 한꺼번에 푸는 방식으로 대형행렬연산을 수행합니다<span lang="en-us">. </span>이 경우 행렬을 묶어서 풀기 때문에 수렴성이 높다는 장점을 갖고 있으며<span lang="en-us">, </span>해석이 가벼운 경우에는 해가 빨리 수렴될 수 있습니다<span lang="en-us">.</span></b></p><p><b></b></p><b></b> <p class="MsoNormal"><b><span lang="en-us">Segregated : dependent variable</span>을 단계로 나누어 풉니다<span lang="en-us">. </span>즉 대형 행렬을 분산하여 해석하는 방식입니다<span lang="en-us">. </span>당연히 리소스가 적다는 장점이 있으나<span lang="en-us">, </span>강한 결합 문제의 경우에는 수렴에 문제가 있을 수 있습니다<span lang="en-us">. </span>다만 행렬 사이즈가 커지게 되면 큰 하나의 행렬을 푸는 것보다 작은 여러 개의 행렬을 푸는 시간의 합이 줄어들 수 있으므로<span lang="en-us">, </span>대형 행렬 연산 시 해석 시간이 빨라질 수 있습니다<span lang="en-us">. </span></b></p> <p class="MsoNormal"><br></p> <p class="MsoNormal">예를 들어 열 유동을 풀게 된다면 우리가 구할 일반적인 <span lang="en-us">Dependent variable</span>은 속도와 관련된 <span lang="en-us">u, </span>압력과 관련된 <span lang="en-us">p, </span>온도와 관련된 <span lang="en-us">T</span>가 되게 됩니다<span lang="en-us">. u,p,T</span>를 한번에 푼다면 이는 <span lang="en-us">Fully coupled</span>가 될 것이고<span lang="en-us">, u,p</span>를 한번에 풀고 <span lang="en-us">T</span>를 나누어 풀면 이는 <span lang="en-us">2 step</span>을 가진 <span lang="en-us">segregated</span>방식이 되는 것입니다<span lang="en-us">. </span></p><p></p> <p class="MsoNormal"><span lang="en-us"><br></span></p> <p class="MsoNormal">또한 이렇게 나누어진 행렬은 <span lang="en-us">Direct </span>방식이나 <span lang="en-us">Interative</span>방식으로 또 나누어 풀게 되는데<span lang="en-us">, Direct</span>방식은 행렬을 직접 연산하는 것이고<span lang="en-us">, Iterative </span>방식의 경우 반복법을 통해 해를 점차 수렴해 나가는 방법입니다<span lang="en-us">. </span>역시 <span lang="en-us">Direct</span>방식은 <span lang="en-us">LU</span>분해를 통해 직접 연산을 수행하기에 리소스가 많이 드는 대신 수렴성이 좋고<span lang="en-us">, iterative </span>방식은 행렬자체를 직접연산하는 방식이 아니기 때문에 리소스를 적게 먹는 대신 수렴성이 다소 떨어질 수 있다는 단점이 있습니다<span lang="en-us">. </span>시간의 경우 초기값이나<span lang="en-us">, </span>지배방정식의 컨디션에 따라 달라질 수 있으므로 어느 것이 빠르다 라고 함부로 이야기 하기는 어렵습니다<span lang="en-us">. (</span>만 일반적인 경우라면 <span lang="en-us">direct</span>방식이 빠른 편입니다<span lang="en-us">.) </span></p><p></p> <p class="MsoNormal"><span lang="en-us"><br></span></p> <p class="MsoNormal">여기서 더 나아가게 되면<span lang="en-us">, </span>반복법의 경우<span lang="en-us">, </span>잔차를 이용하여 해석을 하게 되는데<span lang="en-us">, </span>잔차 해석을 위한 전처리로써 <span lang="en-us">Preconditioner</span>가 필요합니다<span lang="en-us">. </span>즉 최소점을 구하기 위한 반복법은 최초값에서부터 시작하여 축방향으로 움직인 후 축방향에서 최소값으로 이동하는 것을 반복하는데<span lang="en-us">, </span>이러한 경우 조건수가 큰 경우에는 수렴이 되지 않는 <span lang="en-us">ill-condition</span>을 갖게 되며 이러한 조건 수를 향상시키는 방법이 <span lang="en-us">preconditioner</span>라고 이해하시면 되겠습니다<span lang="en-us">.</span></p><p></p> <p class="MsoNormal"><span lang="en-us"><br></span></p> <p class="MsoNormal">사실 <span lang="en-us">direct</span>방법이나 <span lang="en-us">iterative</span>방식에는 <span lang="en-us">LU</span>분해를 하거나 잔차를 구하기 위한 많은 <span lang="en-us">method</span>들이 존재하며 <span lang="en-us">Preconditioner</span>역시 다양하지만 이 부분은 결국 행렬의 풀이 방식에 따른 것이고<span lang="en-us">, </span>워낙 많은 <span lang="en-us">method</span>가 존재하기에 후에 기회가 되면 설명 드리도록 하겠습니다<span lang="en-us">.</span></p><p></p>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.