2017년 12월 15일 금요일

외부에서 생성한 그물망(mesh) 정보를 매스매티카에서 불러올 수 없겠느냐는 의뢰를 받았다. 의뢰자가 보낸 그물망 파일을 살펴보니, 다음의 세 단락으로 구성되어 있다.

% Coordinates
8.9230056E-8             -1.1747189E-8            
8.737304E-8              -1.2470854E-8


% Elements (triangular)
2         3         5         
4         5         8  


% Data
0.0                      
0.0


각 노드의 좌표, 그 좌표로 구성된 삼각형 요소, 그리고 각 노드의 계산 값으로 구성된 세 단락으로 구성되어 있으며, 각 단락은 %로 시작하는 줄로 구분된 걸 알 수 있다. 이걸 어떻게 불러들여야 하나? 먼저, STL 형식으로 불러들이려고 했지만, 실패. STL 형식은 3차원 데이터만 다루도록 되어있나 본데, 이건 2차원 그물망이라서 그런가보다.

구글 검색에도 딱히 걸리는 게 없다. 조금 당황했지만, 다행히 Wolfram Documentation Center의 문서 중에서 쓸만한 예제를 찾았다. 먼저 검색해본 건, 실제 그물망 정보를 담고 있는 ElementMesh 함수이다. 이 함수는 Property가 많아서 직접 만들어주는 건 어렵겠다 싶어서 살펴보던 중에 찾은 건, ElementMesh를 생성해주는 ToElementMesh 함수이다. 드디어 이 함수의 예제 중에서 적합한 예제를 찾았다.



각 노드의 좌표와 삼각형 요소 정보만으로 ElementMesh를 만들어주니까, 필요한 정보는 다 있다. 그물망에 관한 함수를 다루려면 FEM 꾸러미를 불러와야 한다.


그럼, 이제 그물망 파일을 어떻게 불러들일 것인가? 다른 언어처럼 한 줄씩 읽어들여서 구문분석(parsing)을 돌리는 건 좀 Wolfram 언어답지 않고 말이지. 먼저 그물망 정보를 Table 형식으로 불러와 보자.


2차원 리스트로 잘 불러왔군. 다행히도 각 단락의 열 길이가 다르다는 걸 이용하면 쉽게 각 단락을 구분할 수 있다. 2열로 구성된 부분만 노드의 좌표를 나타내고 있으므로 {_,_} 패턴을 이용해서 해당 부분만 골라낼 수 있다.


여기서 단락 구분 겸 메타데이터로 쓰이는 “%”로 시작하는 줄을 간단히 빼버리는 방법도 있겠지만, 패턴 검사를 이용하면 조금 더 우아하게 처리할 수 있다. 열의 첫 번째 원소가 “%”인 것들은 빼고 골라내자.



삼각형 요소도 똑같은 방식으로 골라낼 수 있다. 삼각형 단락은 3열로 이루어져 있으므로, {_,_,_}패턴을 이용해서 골라낼 수 있다. 결과는 ToMeshElement의 “MeshElement” 옵션의 형식을 참고해서 결과 형식을 맞춰주면 된다.


모든 준비는 끝났고, 이재 ToElementMesh 함수를 이용해서 ElementMesh를 생성하면 된다.



ElementMesh는 제대로 생성이 되었다. 그물망의 품질이 떨어진다는 경고의 원인을 잘 모르겠지만, 아마도 그물망 좌표의 유효자리수가 문제가 아닐까 한다. 그럼, 매스매티카가 불러들인 그물망을 확인해보자.


내가 할 일은 여기까지인 것 같다. 결과를 송부하고 잠이나 자야겠다.