2015년 5월 21일 목요일

GPG > DraftSight > FreeCAD > GMSH > ELMER > PARAVIEW 작업 흐름 강좌 (개정판)



초보자에게 간명하게 전체 작업 흐름을 파악할 수 있도록 하기 위해서 만든 자료이다.

작업 목표는 기어 이빨을 하나 설계해서, 그것의 굽힘응력을 보는 것이다.

기존의 예제와 달리 다음 몇가지 조건을 준수하였다.


1. Freeware 및 OpenSource 소프트웨어만을 사용한다.  유료 소프트웨어는 전혀 사용하지 않는다.

2. 기어 이빨은 실제 사용 가능한 수준의 엄밀성을 가지도록 설계한다.
    (실제 인볼류트 곡선 함수 및 트로코이드 필렛을 적용한 모델을 설계 사용)

3. 매쉬 작업은 충분히 세밀하게 하고, 특히 관심부위를 조밀하게 생성한다.

4. 여러개의 프레임을 얻어내어 동영상을 만든다.


기어 이빨의 작도를 위해서는 FreeCAD의 옵션으로 들어있거나 제공되는 매크로를 사용해도 되지만, 검토해 보니까 정밀도가 낮고 제대로 된 인볼류트 함수를 사용한 것이 아니라서 제외하였다.


 
 GPG, DraftSight로 기어 이빨 형상 설계


 
 FreeCAD로 3D 모델링


GMSH로 매쉬 작업


ELMER로 해석
PARAVIEW로 결과확인 및 동영상 만들기


최종 결과물



100 프레임으로 다시 퀄리티를 높여 만든 동영상 결과물






네이버까페 오로카 운영자 표윤석씨 강의를 듣다 (ROS 관련)




2011년도에 이런 글을 kldp에 쓴 적이 있는데...

Dymaxion.Kim: 로봇용 소프트웨어 플랫폼 최신 동향 관련

그전부터 주시하던 ROS 및 로봇 미들웨어 동향 관련한 글이다.


이후 국내에서도 결국 ROS가 힘을 쓰기 시작하려고 하는 경향이 생겼다.

이런 흐름을 주도한 것은 유진로봇 쪽이 가장 활발했는데,

듣기로는 그 회사의 개발자 중에서 ROS 전담 개발자가 있다고 한다.

현명한 전략이었다.


내가 재직하는 회사에서는 오픈소스 개념을 이야기하면 비현실적이라고 핀잔 듣는 분위기였으나 오히려 오픈소스화 함으로써 마케팅 효과가 크게 일어난 경우의 좋은 증거가 된다.

내가 보는 세상과 나를 업무적으로 통제하는 사람의 세상이 너무 다르니, 이런 저런 방해를 받아 아무것도 못하고 3년을 그냥 허송해 버린 듯 해서 심히 괴롭다.  한 사람 겨우 극복하면 어디서 듣도보도 못한 사람이 또 나타나 차례대로 방해하는 식이니 원.

아무튼 ...


네이버까페 오로카( http://cafe.naver.com/openrt ) 운영을 열심히 하는 표윤석씨가 우리 회사에 와서 ROS 소개 강의를 2시간 동안 해 줬는데 인상깊게 잘 들었다.

(이 까페에 내가 언제 가입했나 보니 2014년이구낭..  활동은 안하고 그냥 눈팅만 좀 하려고 한건데, 상당히 정성들인 양질의 컨텐츠가 많아서 그냥 눈팅만 하기가 미안할 지경이다.)

열정이 있고 젊음이 느껴져서 더 좋았던 것 같다.

표윤석씨는 예전에 광운대 학생 시절에도 동아리 활동으로 대회 나가기도 하는 등 꽤 잘 검색되던 사람이라서 그 존재는 오래전부터 인지하고 있었는데, 잘 성장해서 지금은 일본에서 로봇 소프트웨어 쪽으로 전공해서 박사과정 밟고 있는 모양이다.



ROS에 관한 기본 개념이나 학계/업계 동향 같은 이야기는 전부 다 아는 것들이라 별로 인상적이지는 않았지만, 최근의 ROS 완성 정도를 확인할 수 있었던 기회였던 것 같다.

개인적인 의견으로, ROS는 아직 아카데믹한 성격이 더 강한 상태이기 때문에 실제 서비스용 로봇의 주력 프레임웍으로 쓰기에는 신뢰성에서 문제가 있다고 본다.

또 요구 시스템 사양이 높기 때문에 (우분투 서버 위에 이것저것 막 올려야 되고, 기본적으로 리얼타임이 아니라서 리얼타임 흉내라도 내려면 일단 수행속도가 나와야 되니..)  로봇에 이걸 사용하려면 로봇 자체가 꽤 중량급이 된다.

즉 좋은 도구나 라이브러리가 많이 있고, 여러 제품들이 지원되니까, 이를 돌려주는 소프트웨어 코딩 생산성이 비약적으로 높아지는 장점이 있는 대신, 시스템이 너무 무겁다는 단점이 있다.

경량화하기 위해 소스나 패키지를 건드리기 시작하면 꽤 골치아플 것이다.


대신 내가 추구하는 방향은 엄청나게 저렴한 시스템이어야 하기 때문에, 사실 ROS는 안 맞는다고 봐도 될 것 이다.  다만 클라우드화된 메인 로봇 통제 서버의 미들웨어로 ROS를 사용하면 적절하겠다 싶다.즉 로봇 클라이언트 단에 ROS를 넣을 게 아니고, 서버 단에다가 심어넣고 돌려야 적절하지 않나 하는 것이다.


로봇 클라이언트 단에 심어넣을 것은 ROS가 아니고 Node.js라고 본다...

(내 의견과 동일한 의견을 가진 개발자가 존재할지 궁금하다.)


이와 관련한 꽤 자세한 제안을 작년에 회사에다 했지만, 역시나 기술동향에 깜깜한 사람들이 그 의미를 충분히 이해하지 못하였고, 감정싸움에 사내 정치놀음에 매몰된 잘못된 사람들과 회사가 방향을 잃어가면서 내가 더이상 어떻게 기여할 방법을 찾지 못했다.

소프트웨어 쪽에다가 설계자가 뭐라 할 입장도 못되고 해서...
그냥 손 놓고 보고 있는 중이다.

아무튼 그쪽은 내가 뭐라 해서 일이 될 분위기는 아니니 일단 신경 끄고 내 쪽만 신경쓰자.
일단은.  망하면 망하게 한 사람이 책임 지겠지.



오늘 표윤석씨의 설명을 통해 몇가지 알아낸 사항은 다음과 같다.


(1) ROS에 심어넣어진 FK,IK 쪽은 유럽의 Orocos인데, 실제 이것을 활용한 결과를 보니 IK 동작중 Singular Point 근방에서 매우 심하게 발산한다.  표윤석씨 말로는 파라미터 설정 잘 하면 잡을 수 있을 거라고는 하는데, 발산 양태를 보면 영락없이 Jacobian Transpose 방법을 쓴 것 같은데 정말 그렇다면 발산 진동을 직접 잡을 방법은 없을 것이다.  결론적으로 IK 쪽이 상당히 허접하게 들어가 있다는 것이 확인되었다.

우리 회사에서 기존에 개발된 IK 알고리즘은 상당히 안정적인데 개발자가 다 퇴사해버린 상태라 사실상 기술 망실 상태나 마찬가지.  코딩으로 구현해서 ROS에 심어넣어 주면 꽤 쓸만한 기여가 될 수 있을 것이다.
내가 핵심 Theory를 이해하고 있기는 하지만, 코딩을 직접 할 수는 없고....
관심있는 개발자가 있다면 Notation을 줘서 패키지화 할 수 있을 것 같은데....
주변에 쓸만한 개발자가 잘 눈에 안띈다는게 함정이다.


(2) ROS에는 아직 Dynamics가 제대로 들어가 있지 못한 듯 하다.   물론 Orocos를 품었으니 Command 상태로는 사용할 수 있겠지만, 다른 GUI나 도구들과 제대로 연계된 상태가 아닌 듯 하다.  또한 IK가 허접하니 역동역학도 믿을만 할지 모르겠다.

ROS를 산업표준으로 만들기 위한 메이저 산업용 로봇 매니퓰레이터 제조사들이 이미 컨소시움을 구성해서 개발을 지원중이라고 하는데...
그 회사들이 자사의 핵심 기술을 오픈소스에다가 그대로 풀어넣을리 없고 그냥 개발자들 돈이나 좀 쥐어줘서 오픈소스 생태계 형성해 주는 수준 같다.

결론적으로 아직 ROS상의 오픈소스 수준은 메이저 업체들이 보유한 기술과 격차가 크다.



우리나라 OPROS, 일본의 OpenRTM은 둘 다 안습이니 그냥 넘어가자..
어디서나 그렇지만 이쪽 분야도 결국 정치하는 놈들이 문제다.



2015년 5월 19일 화요일

Test for Cloud CAE Simscale.com




서비스에 Academic으로 일단 가입했다.
그냥 Free로 가입하면 Contact 해석은 불가능한 것 같다.
다행히 학생이 아닌데도 가입을 받아준다.

이 서비스는 간단히 말해
여러가지 오픈소스 CAE 솔버들을 이용해서
자신들의 서버에 설치해 두고
강력해진 JavaScript의 힘을 이용하여
웹브라우저용 UI를 제공하는
클라우드 CAE 서비스이다.

오픈소스 솔버들을 갖다 썼으니
클라우드 서비스 프론트엔드 쪽에만 
소수의 인원으로 집중 개발이 가능했다.

매커니즘 쪽에는 일단 Calculix 및 Code-Aster가 셋팅되어 있다.
CFD 쪽에는 OpenFOAM 및 SU2 등이 셋팅되어 있다.

포스트 단은 웹버전 ParaView 오픈소스를 갖다 붙여 놨다.
아무래도 기능이 좀 미약하다보니, 
결과파일은 VTK 형태로 다운로드 받을 수 있게 해 놨다.

프리프로세서 단은 아래와 같다.


여기서 매쉬 만들기 및 초기조건 경계조건 주기 등등이 모두 처리된다.
이 UI에서 감탄한 부분은,
CFD에서 로터 블레이드 해석이 가능하도록 매쉬 영역 지정 가능하도록 되어 있다는 점과
FEM에서 Contact 지정이 편리하도록 구성되어 있느 부분이었다.

3D 뷰어 속도는 조금 굼뜬 면이 있었는데,
며칠전에 새로 업데이트 되었길래 다시 보니
반응 속도가 크게 개선되었다.
서피스 지정해 주고 할 때 장애를 거의 느낄 수 없었다.


매쉬 생성시에는 이렇게 관심 부위를 더 조밀하게 해 주는
Refinement 정도는 가능하게 해 놨다.
물론 CFD에 대비해서는 경계층 영역 지정도 가능하게 해 놨다.

본 케이스에서는, Code-Aster를 사용하도록 지정했고
Contact 해석은 일단 되도록 해 보기 위해서
Penalty Method로 하였다.
Friction은 0이다.
또 간소하게 하기 위해 일단 Static으로 했다.


해석 도중에는 위와 같이 log를 확인하면서 진행 상황을 볼 수 있다.
Code-Aster이다 보니 프랑스어의 압박이 심하다.


처음에 매쉬를 너무 조밀하게 해서 대규모 해석을 시도 해 봤었는데
계속 실패했다.
메모리 부족, 저장공간 부족, 지정해 놓은 해석 시간 초과 등의 이유였다.
Academic 가입시에 별다른 자원의 제한이 없다고 생각했는데
대규모 해석이 어렵도록 이리저리 막아놓긴 했나보다...

제대로 쓰려면 돈을 내라는 이야기.

아무튼 매쉬를 전체적으로 크게 성글게 만들고 일단 돌려 봤다.
결과는 아래와 같다.

아직 브라우저로 띄우는 화면에서는 충분한 정보가 나오지는 않는다.
일단 그림 예쁘게 띄워준다 정도의 기능만 구현되어 있다.








이제 결과 파일을 다운로드 받아다가 PC에 설치되어 있는 Paraview로 본다.






이렇게 나오는데...
Code-Aster가 만들어주는 응력 정보에는
신기하게도 VonMises Stress 대신
Cauchy Stress가 들어있다.

어느쪽이든 간에 항복점을 판단하는데는 문제가 없을 것이다.

아무튼 사용 소감은....
무료 계정으로는 그냥 간단한 연습 정도는 가능하지만
프로페셔널하게 쓰려면 확실히 돈을 내야 겠구나 싶다.

다만 32개 CPU Core를 쓸 수 있다는 건 확실히 큰 잇점이다.
여기서 해 본 Contact 해석만 해도
나의 PC에서 돌렸을 경우에는 1시간 정도 걸렸을지도 모른다.


가격 정책을 보니깐...
1사람이 1년에 200유로 즉 대충 250만원 정도 내라고 되어있다.

이 가격은
기존 다른 상용 해석툴의 최초 구매 이후
매년 유지보수 비용으로 지불하는 비용의
최소 1/3 이하 가격이다.

가격적으로 경쟁력이 있다는 소리다.

이렇게 낮은 가격으로 서비스 가능한 이유는
당연히 오픈소스 솔버 및 매쉬 생서기들의 존재 때문이다.
그거 개발하는데 아무 자원도 안 들어갔으니
매우 저렴하게 서비스 가능하다.

비슷한 수준의 솔버를 직접 개발해야 했다면
최소 100~200명의 석박사급 개발자들이
풀타임으로 수년~10여년간 피말려 가면서 개발해야 했을 것이다.


우리나라 슈퍼컴퓨터 실태를 보면
원격으로 범용 솔버 사용 서비스를 제공은 해 주지만
실제로 사용 가능한 사람은 매우 제한적이다.
전문적인 코딩 및 해석이 가능한 엔지니어들만이 다룰 수 있다.

Simscale이 중소기업 및 초보자,학생들을 타겟으로 하여
최초의 CAE 클라우드 서비스로 시작했지만,
이와 비슷한 다른 서비스들이 우후죽순으로 생겨날 지도 모른다.
져럼하게 클러스터 컴퓨팅 자원을 제공할 수 있다면
수익성이 있을 테니깐.





2015년 5월 17일 일요일

Julia Lang의 놀라운 점들




Julia를 조금 들여다 보면서 몇가지 특징들을 보고 깜짝 놀랐다.
속도가 빠르다던지, 문법이 쉽다던지 따위의 차원이 아니고,
세심하게 사용자(User)를 배려한 깨알같은 특성들 때문이다.

이런 것들은 수치해석 분야를 제대로 해 본,
뭔가 '아는 사람'이 아니면 생각도 못할 특징들 같다.
도저히 오픈소스 프로젝트라고 믿어지지 않을 만큼
사용자를 배려한 세심함이
이 언어의 완성도를 크게 끌어올려주는 것 같다.


그 첫번째 특징은...

유니코드로 코딩하는 것이 가능하도록 처음부터 만들어져 있다는 것이다.
사실 Python 같은 것은 90년대에 처음 개발된 것이라
유니코드 쪽은 나중에 부랴부랴 갖다붙인 거라서
셋팅해주는 것도 참 어렵다.
헌데 Julia는 그냥 막 써도 된다.
변수 이름을 한글로 써도 되고, 그리스어로 써도 된다.
심지어 LaTex 문법으로 변수 이름을 써도 된다.


두번째 특징은...

정말 깨알같은데, 곱셈 연산자를 생략해도 된다는 것이다.
예를 들어 "3*a^2+2*a-1" 이라는 계산식을 쓴다고 치면
Julia에서는 "3a^2+2a-1" 이라고 써도 아무일 없이 그냥 계산된다.
에러메시지 따위는 없다.
물론 이런 식으로 쓰는 습관을 들여 버리면
프로그래머로서는 안좋은 습관이 되겠지만,
전문적인 소프트웨어 공학자가 아닌
그냥 일반적인 다른 분야의 엔지니어라면
이렇게 되도록 해 주는게 맞을 것이다.
사실 이거 보고 거의 경악을 금치 못했다.
이렇게 깨알같다니...


세번째 특징은...

외부 패키지를 불러쓸 때,
import 라던가 include 같은 단어 대신에 using 이라는 단어를 쓴다.
그냥 단어가 다를 뿐인데 뭔 의미가 있겠냐 싶지만...
using 이라는 단어를 쓰니까 일단 뭔가 진입장벽이 엄청 낮게 느껴진다.
컴퓨터에게 명령하는 느낌이 아니고 살살 부탁하는 느낌.
굉장히 심리적인 것 같은데,
아무튼 단어 자체가 아주 마음에 들었다.


네번째 특징은...

어떤 글자를 프린트할 때 println() 함수를 쓰는데,
이 함수가 재밌다.
C의 printf()함수와는 차이가 있다.
일단 "\n" 따위는 쓰지 않는다.
이걸 아예 안 쓰니 훨씬 가독성이 좋다.
쓰레기 치워버린 느낌.
게다가 문자열 중간에 변수값을 삽입해 줄 때도 더 간단하다.
C에서는
printf("변수값은 %f2.5 이다.\n", a);
이런 식으로 써 줘야 할텐데...
Julia에서는
println("변수값은 ", a, "이다.")
라는 식으로 그냥 줄줄 써 주니깐 잘 된다.
이런게 소프트웨어 공학적으로는 별 의미 없을지 몰라도,
사용자 입장에서는 상당히 좋은 것 같다.


다섯번째 특징은....

한 줄 끝나고 나서 세미콜론(;) 기호를 안 써줘도 된다.
뭐 써 줘도 아무 상관 없지만, 안 써줘도 아무 소리 안한다.
특히 한국사람한테는 세미콜론 같은 기호는
문화적으로 별로 익숙하지가 않아서 더 와닿는 것 같다.
어떤 커뮤니티에서 봤는데 어떤 미국 사람이 
"빌어먹을 f**king 세미콜론 안 써도 되니까 정말 살 것 같다"
라고까지 표현한 코멘트도 봤다.


여섯번째 특징은....

for 같은 루프를 마음껏 돌려도 아무도 뭐라 안한다.
특히 Matlab 같은데서는 루프 쓰면 큰일 날 것 처럼 가르치다 보니...
(Matlab에서는 루프 쓰면 속도가 엄청 떨어지니깐)
하지만 Julia는 속도가 원체 빵빵하다 보니 
루프를 마음껏 쓰라고 오히려 권장하는 분위기인 것 같다.
아 물론 Matlab 처럼 벡터로 써도 되고...


일곱번째 특징은....

역시 깨알같은 건데,
주석문을 아무데나 갖다붙여도 에러메시지 따위는 내뿜지 않는다.
예를 들어 C에서,

printf(a, %길이
b, %면적
c %체적);

이딴 식으로 쓰면 그냥 에러난다.
하지만 Julia에서는

println(a, # 길이
b, # 면적
c # 체적
)

이딴식으로 써 놔도 아무 상관없다.
뭐랄까 모호성(Ambiguity)가 있어도 적당히 알아먹는다는 느낌이다.


코딩 문법 같은걸로 걸기적거리지 않고,
컴퓨터공학적인 문제에 발목잡히지 않고,
그냥 해결해야 할 문제에만 집중할 수 있도록
장애 없이 줄줄 써나가면
답이 나오도록 하는 목적에 충실하다.





Julia Code : COMBI REDUCER with Planetary & Harmonic Drive v05


MIT에서 만든 Julia Language에 대해서 관심을 계속 가지고 있었는데, 이제 v0.3 이상으로 올라가면서 꽤 쓸만해 진 모양이다.  특히 아마존 웹 서비스에다가 이걸 올려서 클라우드 서비스까지 해 주기 때문에 어렵게 PC에 개발환경 구축하느라 진땀 빼지 않아도 되어서 더 좋다.

나에게 필요한 것은, 컴퓨터공학적인 최적화라던가 대규모 데이타를 효과적으로 다루는 것이 아니고, 높은 수준의 공학용 계산기 내지는 간단한 스크립트 엔진이다.

여러가지 많이 검토해 봤는데 Julia가 역시 최신기술의 집약체이다 보니 모든 조건에 다 부합하는 것 같다.

아래는 어떤 문제를 풀기 위해 Julia를 실무적으로 사용해 본 예이다.
원래는 Matlab m-code로 작성해서 FreeMat, Octave 따위로 돌려보던 것인데, Julia로 테스트해 보기 위해 컨버젼도 해 보고 완전히 새로 작성도 해 보았다.

m-code를 Julia code로 자동 컨버젼해주는 패키지도 Julia 패키지 라이브러리에 있으나, 일단 직접 수동으로 컨버젼 해 보았더니 함수 이름 바꿔준다던가 정도의 문법 수정으로 20분만에 끝났다.

그리고 Julia에 좀 더 부합하도록 몇가지 기능을 추가하고 수식도 새로 적용하고 해서 새로 만들었다.


---------------------------------------------------------------------------------------------------------------


본 Julia Code는 기존의 버전을 Julia 문법에 좀 더 부합하게 고치고, Interactive 기능을 추가한 버전이다.

최외곽 서큘러 스플라인 잇수(Number of Teeth)와 그 안쪽으로 들어가면서 조립되는 각 기어의 잇수의 차이를 기준으로 사양이 자동으로 잡히도록 하였고, Sun Gear의 반지름이 음수로 나오면 색상이 붉은 색으로 변하면서 경고 문구가 표시되도록 하였다.

기타 파라미터들은 관계를 조정하여 기하학적인 모순 상황이 발생하지 않도록 하였다.

타원 변형된 Flex Spline의 원주길이는 다음 공식을 기본으로 하였다.


* Annotations

$a$ : 긴 축의 지름 (Known)

$x$ : 짧은 축의 지름 (Unknown)

$\varepsilon$ : 이심률 (Known)

$L$ : 타원의 원주길이 (Known)


* Notations

$\varepsilon = \sqrt{ 1 - \frac{x^2}{a^2} }$

$L = 2aE(\varepsilon) = \pi a \left[  1 - \left( \frac{1}{2} \right)^2 \varepsilon^2 -  \left( \frac{1 \cdot 3}{2 \cdot 4} \right)^2 \frac{\varepsilon^2}{3} - \left( \frac{1 \cdot 3 \cdot 5}{2 \cdot 4 \cdot 6} \right)^2 \frac{\varepsilon^2}{5} - ... \right]$


* Remarks

$E(\varepsilon)$은 제2종 타원정적분 연산기호이다.  타원정적분은 엄밀하게 풀이하기가 어렵기 때문에, 이를 풀어쓴 우변의 무한급수 식을 이용하기로 한다.  급수의 항이 늘어날 수록 해(Solution)의 개수가 늘어나기 때문에 적합한 해를 판별하는 판단이 더 필요하게 되므로, 간소하게 하기 위해 다음과 같이 첫 번째 항만 살린 근사식을 만들었다.

$L = \pi a \left[  1 - \left( \frac{1}{2} \right)^2 \varepsilon^2 \right]$

해를 신속하게 구하기 위해 SageMath를 이용하였다.
(SageMath 대신 WolframAlpha를 이용해도 되나, 해가 복소수로 나오는 등 형태가 다를 수도 있다.)


a,L = var('a,L')
eq = L == pi*a* (  1-((1/2)^2)*(( sqrt(1-(x^2)/(a^2)) )^2)   )
eq
print solve(eq,x)


SageMath를 이용하여 얻어진 해는 다음과 같다.


L == 1/4*pi*a*(x^2/a^2 + 3)
[
x == -sqrt(-3*a^2 + 4*L*a/pi),
x == sqrt(-3*a^2 + 4*L*a/pi)
]



2개의 해가 얻어졌는데, 이 중에서 양수에 해당하는 두 번째 것을 취한다.  이 식을 Julia Code에 집어넣고 사용한다.


* Julia Coding

PyPlot 패키지는 Python 라이브러리 중에서, Matlab과 거의 비슷하게 Plot을 해 주는 MatPlotLib 기능을 Julia에서 사용할 수 있도록 해 주는 라이브러리이다.  따라서 이것은 내부적으로는 Python MatPlotLib가 그대로 동작하며, Julia Code에서 좀 더 사용하기 쉽도록 Matlab 문법과 거의 유사하게 간소화되어 있다.  기계공학도에게 Julia가 Python보다 접근하기 쉬운 점은, 굳이 객체지향 방법으로 코딩하지 않아도 된다는 점이다.  Matlab을 다루듯이 편하게 쓰면 된다.

Interact 패키지는 매우 간단하게 기본적인 GUI를 만들 수 있도록 해 준다.  여기 포함된 @manipulate 매크로를 이용하여, 자유롭게 조절하고 싶은 파라미터들을 설정해 주기만 하면 된다.  내부적으로는 무한루프를 돌리는 간단한 형태다.



#######################################################
# COMBI REDUCER with Planetary & Harmonic Drive
# V05
# 2015.05.18
# Dymaxion.kim
#######################################################
 
using PyPlot
using Interact
 
# Basic Parameter
alpha=[0:0.02:2*pi]
max_n_cs = 300
max_dn_fs = 20
max_dn_ig = 20
max_dn_sg = max_n_cs - max_dn_fs - max_dn_ig
# Making New Figure
f=figure(figsize=(8,8))
# Interact Macro
@manipulate for m = 0.1:0.1:2, # Module of The Gear
    n_cs = 50:1:max_n_cs, # Number of Teeth for Circular Spline
    dn_fs = 1:1:max_dn_fs, # Different Number of Teeth for Flex Spline
    dn_ig = 1:1:max_dn_ig, # Different Number of Teeth for Internal Gear
    dn_sg = 1:1:max_dn_sg # Different Number of Teeth for Sun Gear
    
    withfig(f) do
        grid("on")
        axis("auto")
        title("COMBI REDUCER v05")
        
        # Draw Circular Spline
        r_cs = m*n_cs/2
        plot( r_cs*sin(alpha), r_cs*cos(alpha), linewidth=2, color="Magenta" )
        annotate(["n_cs",int(n_cs)],xy=(0,r_cs),ha="center",va="bottom", color="magenta")
        
        # Draw Flex Spline in Idle Status
        r_fs = m*(n_cs-dn_fs)/2
        plot( r_fs*sin(alpha), r_fs*cos(alpha), linestyle="--", color="cyan" )

        # Draw Internal Gear in Idle Status
        r_ig = m*(n_cs-dn_fs-dn_ig)/2
        plot( r_ig*sin(alpha), r_ig*cos(alpha), linestyle="--", color="cyan" )
        
        # Draw Sun Gear
        r_sg = m*(n_cs-dn_fs-dn_ig-dn_sg)/2
        n_sg = 2*r_sg/m
        if r_sg > 0
            plot( r_sg*sin(alpha), r_sg*cos(alpha), linewidth=2, color="blue" )
            annotate(["n_sg",int(n_sg)],xy=(0,0),ha="center",va="center", color="blue")
        else
            plot( r_sg*sin(alpha), r_sg*cos(alpha), linewidth=4, linestyle="--", color="red" )
            annotate(["n_sg is in minus",int(n_sg)],xy=(0,0),ha="center",va="center", color="red")
        end
        
        # Draw Planet Gears
        t_fs = r_fs-r_ig # Thickness of Flex Spline's Plastic
        r_pg = (r_cs-t_fs-r_sg)/2
        plot( r_pg*sin(alpha), r_pg*cos(alpha)+(r_sg+r_pg), linewidth=2, color="magenta" )
        plot( r_pg*sin(alpha), r_pg*cos(alpha)-(r_sg+r_pg), linewidth=2, color="magenta" )
        n_pg = 2*r_pg/m
        annotate(["n_pg",int(n_pg)],xy=(0,r_sg+r_pg),ha="center",va="center", color="magenta")
        annotate(["Thickness",t_fs],xy=(0,r_sg+2*r_pg),ha="center",va="top", color="blue")
        
        # Draw Flex Spline in assembled
        L_fs = 2*pi*r_fs
        Dl_fs = 2*r_cs
        Ds_fs = sqrt(-3*Dl_fs^2 + 4*L_fs*Dl_fs/pi)
        plot( (Ds_fs/2)*sin(alpha), (Dl_fs/2)*cos(alpha), linewidth=2, color="blue" )
        n_fs = 2*r_fs/m
        annotate(["n_fs",int(n_fs)],xy=(-0.9*r_fs,0),ha="left",va="bottom", color="blue")

        # Draw Internal Gear in assembled
        L_ig = 2*pi*r_ig
        Dl_ig = Dl_fs - 2*t_fs
        #Ds_ig = sqrt(-3*Dl_ig^2 + 4*L_ig*Dl_ig/pi)
        Ds_ig = Ds_fs - 2*t_fs
        plot( (Ds_ig/2)*sin(alpha), (Dl_ig/2)*cos(alpha), linewidth=2, color="blue" )
        n_ig = 2*r_ig/m
        annotate(["n_ig",int(n_ig)],xy=(-0.9*r_ig,0),ha="left",va="top",color="blue")
        
        # Reduction Ratio
        RRp = (n_sg+n_ig)/n_sg
        RRh = n_fs/(n_fs-n_cs)
        RRt = RRp * RRh
        annotate(["Total Reduction Ratio",RRt],xy=(0,-r_cs),ha="center",va="top", color="black")

    end
end




아래 그림은 http://juliabox.org에서 구동한 결과이다.

검증결과 동일한 조건의 파라미터를 입력했을 때 기존 버전과 동일한 결과를 얻을 수 있었다.





2015년 5월 11일 월요일

GMSH > ELMER FEM > PARAVIEW 작업 흐름 강좌(?)


신입사원 OJT용으로 동영상으로 함 만들어봤다.

초보자를 위해 철저하게 GUI 상에서 작업이 이어지도록 하였고,
사용된 소프트웨어는 모두 리눅스 및 윈도우에서 잘 돌아가는 것들이므로
PC의 운영체제와 별 상관이 없다.


1. Gmsh 사용 방법 (매쉬 생성)




2. Elmer 사용 방법 (선형 탄성 해석)




3. Paraview 및 문서작성의 예






Open Source CAE Toolchain 14 - FEM with FreeCAD 0.15 including Netgen and Calculix


FreeCAD를 처음 테스트해 본게 V0.1 정도 즈음부터였던 것 같다.
그때는 완성도가 너무 낮아서 "재미있는 장난감이군" 정도의 느낌이었는데, 몇 년 지난 지금의 V0.15 에서는 굉장히 완성도가 높이 올라와 있어서 대단히 놀랍다.
물론 여전히 상용 CAD의 완성도에는 크게 못 미치지만, 3D 프린터를 기반으로 하는 교육 커리큘럼 같은데서 사용하기에는 충분한 완성도에 이미 도달했지 않나 싶다.

일단 옛날보다 안정성이 굉장히 좋아졌다.
갑자기 다운되어서 데이타가 날아가버린다던가 하는 증상의 빈도수가 크게 줄었다.

개발 속도도 갈수록 가속도가 붙는 것 같다.
특히 Python 스크립트로 확장성을 개방해 놓은 오픈소스 특유의 특징 덕분에, 사용자 커뮤니티가 마치 눈덩이처럼 점점 더 불어나면서 동시에 각종 모듈이나 매크로 기능들이 빠르게 붙어나간다.

가만히 보면 이미 구색은 다 갖춘 것 같다.  심지어 OpenPLM 하고도 연동될 지경이니....

아무튼 이렇게 붙은 확장 모듈들 중에서, FreeCAD에 기본으로 포함된 주요 모듈의 하나로 FEM 모듈이 있다.  이걸 어떻게 사용하나 싶어서 이리저리 혼자 해 봤는데 도무지 해법이 보이지 않았고, 아직 제대로 된 Tutorial 문서도 없는 상태라 어떻게 사용하는지 지침도 없었다.

그러다가 오늘 사용법을 알아냈기에 간단히 기록해 본다.


현재 FEM 모듈은 Netgen 매쉬 생성기와 Calculix 솔버를 사용하도록 준비되어 있다.
FreeCAD를 우분투 계열 리눅스에 설치할 때 PPA 저장소를 설정해서 apt-get 으로 설치하도록 되어 있는데, 이때 FreeCAD만 설치하지 말고 ccx 및 Netgen을 함께 설치하면 환경 구성은 끝난다.

FEM 모듈이 중요하다고 판단했는지, FreeCAD 저장소에 ccx(Calculix)와 Netgen을 함께 제공해줘서 환경구성하는데 삽질할 필요가 없도록 배려해 놨다.

다만 윈도우 버전의 FreeCAD에서는 Calculix 솔버 사용이 불가능하다.  Calculix 자체가 리눅스 기반이라 그런 것 같다.  뭐 억지로 윈도우 버전으로 된 걸 구해다가 해킹해서 이어붙이면 안될것도 없겠지만 그런 방식은 생명연장을 위해 지양하자.

아무튼 이걸 테스트한 컴퓨터는, 오래된 Core2Duo CPU 및 2GB RAM을 가진 노트북이다.
설치된 리눅스 배포판은 Chromixium이다.
현재의 Chromixium 1.0은 우분투 14.04 32bit 위에 크롬북 느낌 나게 이것저것 유틸리티들을 조합해서 만들어 놓은 것이다.  잡스러운 어플리케이션들이 다 빠져있어서, 1GB 용량의 USB 메모리 스틱에 심어넣고 컴퓨터에 설치하는 것이 가능하다.
이런 저성능의 컴퓨터에서 칼큘릭스를 돌려본다는 느낌도 나쁘지 않은 것 같다.

이제 이렇게 환경 구성이 되었으니 시작해 본다.


1. 3D 모델링


FreeCAD의 3D 모델링 방법은 일반적인 Parametric 3D CAD 툴들과 큰 차이는 없다.
Parametric 툴의 특징은, 2D 스케치를 일단 닥치고 먼저 그린다는 것이다.
이때 그리는 2D 스케치 단계에서, 선이나 점 따위 엔티티들의 치수 및 구속조건들을 지정해 주는 것이 Parametric 툴의 기본 개념이다.
FreeCAD에서는 2D 스케치를 그리는 툴이 Part Design 모듈에 들어 있으므로 그것을 이용하면 된다.
2D 스케치에서 각종 구속조건들을 줄 때, CAD 시스템 내부적으로는 주어지는 구속조건들의 기하학적 정합성을 계산해서 모순관계가 없느냐 따위를 실시간으로 판단하게 되는데, 이 일을 해 주는 알고리즘을 보통 "스케치 솔버"라고들 부른다.

현재 상용 CAD 툴들 중에서 만족스러운 성능을 가진 스케치 솔버는 "없다".
현존 스케치 솔버들은 굉장히 멍청해서, 스케치가 조금만 복잡해져도 버벅대거나 스케치가 폭발(?) 해 버린다.
특히 PTC CREO 및 SolidWorks 같은 제품들의 스케치 솔버는 악명이 높다.
UG NX나 CATIA도 별 차이 없이 멍청하다.

개발된지 최소 20~30년 정도 된 제품들인데 이토록 스케치 솔버의 발전이 더딘 것이 놀라울 정도다.

FreeCAD의 스케치 솔버도 조금 사용해 보니 그다지 만족스럽지는 않다.
다만 상용 제품들의 것들과 비교해서 그다지 뒤떨어져 보이지도 않는다.
디테일이나 사용성에 대한 편리성 같은 부분에서 약간의 차이만 있을 뿐인 것 같다.

아무튼 그렇게 스케치 해서 갈고리 모양을 만들고, Extrude 시켜서 입체화 시킨 후에, 모서리에 Fillet을 주고 간단히 마무리했다.

다 그리고 보니, 화면 좌측 Feature Tree의 구성 방식이 PTC CREO에 익숙한 나로서는 좀 이해하기 어려운 체계다.  그냥 그러려니 한다.



 2. 전처리 과정

이제 해석을 하기 위해서, FEM 모듈로 들어간다.


해석하려는 형상을 확실히 해 주기 위해서, 위 그림과 같이 원하는 솔리드가 연두색으로 빛나도록(?) 선택된 상태가 되도록 해 준다.  그렇게 해 주려면, 앞서 모델링한 모델의 트리 구조에서 제일 마지막에 매겨준 Fillet Feature를 위 그림 처럼 마우스로 선택해 주면 된다.
왜 이런 식으로 선택이 되도록 구성되어 있는지는 모르겠으나, 그다지 직관적으로 생각되지는 않는다.  아직 FreeCAD의 체계에 대해 이해가 부족해서 그렇겠지만, 확실한건 이런 사소한 직관성으로 인해서 Professional Tool과의 차이가 갈라지는 것 같다.

아무튼 이렇게 원하는 솔리드 전체가 선택된 상태에서, "A"자 모양의 아이콘을 눌러주거나 또는 메뉴에서  FEM > New Mechanical Analysis 을 선택한다.
그러면 선택된 솔리드에 대한 해석 케이스가 새로 생성된다.


일단은 화면에서 선택된 솔리드가 위 그림처럼 사라진다(?).
 동시에 위 그림의 좌측 Task 영역에서 매쉬 툴이 나타난다.

솔리드가 사라진 이유는, 해당 솔리드의 Visability가 False로 자동 변경되기 때문이다.
매쉬 툴은 당연히 Netgen이다.
컴퓨터의 낮은 사양을 고려하여 매쉬가 약간 성글게 형성되도록  Fineness를 Moderate로 놔 둔다.

참고로, 솔리드를 선택하지 않은 상태에서 New Mechanical Analysis를 해 주면, 매쉬 생성툴이 안 나타난다.  때문에 아무 일도 할 수 없다.  별다른 경고문구도 안 나타나기 때문에 사용자는 자기가 잘못 한 것인줄도 모른다.  때문에 이 과정에서 반드시 솔리드 선택 상태여야 한다는 점을 알고 있는 사용자만이 다음 과정으로 넘어갈 수 있게 된다.  ....  게임인가?

OK버튼을 누르고 약간 기다리면 매쉬가 딱 나타난다.


Netgen이기 때문에 큰 무리없이 왠만하면 잘 나온다.
FEM 모듈에서 별도 아이콘으로 매쉬 생성 아이콘이 있긴 있는데, 이 아이콘은 Netgen이 아니고 SMESH라는 다른 매쉬 생성 툴이다.  SMESH는 Salome에 들어있던 것인데, 그걸 떼어다가 FreeCAD에 내장시키려고 하고 있는 것이다.
다만 아직 개발이 덜 되어서, SMESH로는 에러메시지만 나오고 매쉬 생성은 되지 않는 상태다.
성능좋은 Netgen이 있는데도 불구하고, SMESH를 굳이 집어넣으려는 이유는 당연히 더 간지나는(?) Hexahedron 매쉬를 만들고 싶은 개발자의 욕심 때문일 것이다.



아무튼  이제 노란 공 모양의 아이콘을 누르면, Material 선택 툴이 위 그림처럼 나타난다.
여기서는 Steel 재질로 골랐다.
제공되는 Material 목록을 보면 전부 각국의 표준기호로 표기되어 있어서 뭐가 뭔지 보통 사람은 알기 어렵다만...  잘 살펴보면 중간중간 ABS 라던가 Wood 같은 친숙한 재료 명칭도 보인다.



이제 바운더리 컨디션을 잡아줄 차례다.
FreeCAD FEM 모듈에서는, 매쉬의 면에 선택하는게 아니고, 솔리드 면에다가 바운더리를 선택하도록 되어 있다.   따라서 위 그림처럼 일단 솔리드를 보이도록 해 주고...



또 매쉬를 안 보이도록 해 준다.  그래서 솔리드만 보이도록 해 놓는다.
그래야만 원하는 면을 선택할 수 있다.
역시 이걸 미리 모르는 사용자는 헤맬 것 같은 대목이다.







어떤 경우에는 버그 때문에 마우스로 원하는 면을 아무리 눌러줘도 선택이 안되는 경우가 있다.
그때는 화면상에서 마우스 오른쪽 버튼을 눌러서 나오는 메뉴 중에서 Navigation Styles를 선택해서, 마우스 조작 방식을 CAD naigation 같은 걸로 바꿔준다.
그러면 선택 가능하게 될 가능성이 높아진다.

아무튼 위 그림은 Fixed 면의 경계조건을 선택해 준 것이다.




위 그림은 Forced면의 경계조건을 선택해 준 것이다.
좌측 툴에서 Reverse direction 라디오버튼을 체크해 줘서 힘이 눌러지는 방향이 되도록 해 준다.
그 바로 위의 Direction 에서는 방향을 결정해줄 면을 선택해서 Shear Force로 만들어주는 것도 가능하다.  이번 경우에는 면에 대한 Normal force로 할 것이므로 건드리지 않았다.
그리고 그 바로 위에 Area load를 1000으로 해 준다.
당연히 N 단위다.

그리고 OK하면 끝.


3. FEM 해석
 

이제 솔버를 시작하기 위해 위 그림에서 표시한 아이콘을 누르면, 솔버 툴이 나타난다.
맨 처음 버튼인 Write Caculix Input File을 누른다.
그러면 혼자 꿍얼꿍얼 하면서 잠깐 작업을 한다.




무슨일을 했는지 확인하기 위해 그 밑의 버튼을 누르면, 탐색기가 뜨면서 만들어진 *.inp 파일이 나온다.  칼큘릭스 솔버 인풋 파일이다.
어떤 버전의 리눅스에서는 탐색기가 아니고 에디터가 바로 떠서 해당 파일의 내용을 보여줄 수도 있는데 각자 환경에 따라 동작이 다를 것이다.


 


일단 칼큘릭스 인풋 파일 내용을 뜯어고칠 만한 능력과 의지가 없으므로 그냥 구경만 하고 그대로 둔다.




그리고 마지막 세 번째 버튼을 누르면 솔버가 구동된다.
위 그림처럼 녹색 글씨가 나오면 이상없이 잘 끝난 것이다.
작업 시간은 이번 경우에는 8.6초 걸렸다는 것을 알 수 있다.



4. 후처리(가시화)


해석이 끝났으므로 결과를 보기 위해, Task 탭에서 Model 탭으로 넘어오면 위 그림과 같은 변화를 볼 수 있다.
Displacement 및 MisesStress 항목이 생겼고, 또 후처리기 아이콘이 활성화 되어 있다.
활성화된 후처리기 아이콘을 눌러본다.
 

그러면 위 그림과 같은 툴이 뜬다.
폰미세스 응력 보는 걸로 선택해 준다.
그러면 Max,Ave,Min값이 나오므로 정량적인 판단을 할 수 있는 근거가 된다.

그런데 화면에 아무 변화가 없네??



위 그림 처럼, 아까 안 보이게 해 놨던 매쉬를 보이도록 변경해 준다.
그러면 매쉬의 색깔이 이렇게 변화되어 있는 것을 볼 수 있다.

원래 솔리드와 겹쳐져 있으므로, 변형된 형상 확인이 가능하다.



솔리드 비주얼이 허접하므로, Transparency를 50으로 줘서 반투명하게 해 본다.
좀 보기가 나은 것 같은 기분이 든다.



와이어프레임 선이 거슬리므로, 위 그림에 표시된 아이콘을 눌러서 안 보이는 상태로 변경해 준다.
그럼 보기가 좀 더 나은 것 같다.





이상의 기능이 현재까지 구현되어 있는 FreeCAD FEM 모듈 기능의 거의 전부인 듯 하다.
때문에 "FreeCAD에서 Caculix 돌리는 게 된다는 게 증명됐다"는 의미 정도다.

실제로 쓸만하게 이 FEM 모듈을 개발자가 끈기있게 발전시켜 나가기를 바란다.
보통 개인 오픈소스 개발자가 이런 걸 몇 년 하다가 결국 관두곤 하는 경우가 많기 때문에, 이것이 어느정도까지 발전할지는 예상하기 어렵다.

하지만 FreeCAD 전체적으로 봤을 때, 이런 다양한 기능들이 여러 사람들에 의해 시도되어 빠르게 발전된다는 점은 확실하다.


개인적인 소감은....

FreeCAD 한글화가 꼭 필요하지 않나 싶다.

요즘 기술교육 하는 학교 같은데서 3D 프린터 같은거 들여놓고 한학기 정도 되는 분량의 커리큘럼으로 수업을 만드는 움직임이 많이 보이던데, 3D 프린팅을 하기 전에 먼저 CAD로 모델링을 하는게 순서다.

그런데 상용 3D CAD는 교육용으로 쓰기에는 너무 오버스펙이고 가격도 너무 높아서 비현실적이다.  대안으로 무료로 사용가능한 적당한 툴이 필요한데, 현재까지 이 조건을 잘 만족시키는 툴은 거의 없다.
구글에서 제공하는 스케치업이 있긴 한데....
스케치업은 기본적으로 폴리곤 모델링 기반이기 때문에 한계가 있다.

FreeCAD는 제대로 된 Open Cascade CAD 커널을 사용한 진짜 CAD이기 때문에 실제 현장에서 사용하는 Parametric CAD 시스템의 특성을 그대로 다 가지고 있다.
때문에 FreeCAD를 교육용으로 활용하면 굉장히 좋지 않을까 한다.

(보통 3D CAD 유저들은 하나의 툴만 손에 익히면 다른 툴로 전환하는 것은 매우 쉽다.
모델링 개념이 비슷비슷 하기 때문이다.  서로 경쟁하면서 좋은 특성들을 주고받으면서 발전했기 때문에 그렇다.)


한국에서 이런 좋은 오픈소스 솔루션을 교육용으로 적극 활용 안하는 이유는 간단하다.
학교 선생님들이 각종 업무에 시달리면서 관료주의에 찌들어가기 때문에, 초년의 의욕을 나이가 들어가면서 점차 상실해서 결국 아무것도 안하게 되기 때문이다.
새로운 기술, 새로운 시도, 더 발전적인 연구 같은 것을 이야기하면 아마 교사 사회에서 왕따 비슷하게 당하는 분위기일지도 모르겠다. (교사 사회를 잘 몰라서 그냥 억측일 뿐임)

아무튼 FreeCAD 국내 유저가 많아졌으면 좋겠고, 유저그룹도 자연적으로 발생하였으면 좋겠다 하는 바램이 생긴다.

대략 5~10년 정도 계속 업데이트가 이루어지면 아마 굉장한 완성도를 가진 괴물 툴이 되어 있을지도 모르겠다.




2015년 5월 10일 일요일

Open Source CAE Toolchain 13 - FEM with Elmer by Linear Elascticity and Scanning time varient normal force


Open Source CAE Toolchain 13 에서는 MATC 문법을 이용해서 Time Varient Displacement를 연습해 보았는데, 너무 단순한 감이 있어서 약간 다르게 연습해 보기로 했다.
어떻게 했는지 과정 역시 좀 자세하게 기술해서, 한 명도 없을 것 같지만(?) 혹시나 필요한 사람이 있을 수도 있으므로 도움이 될 수 있도록 해 본다.

기본적인 아이디어는 간단하다. 

FEM의 가장 기본적인 Linear Elastic 해석을 하는데, 해석 대상이 되는 물체에 가해지는 힘을 1초 단위로 바꿔주는 것이다.
그리고 그걸 여러 샷을 얻어내서 동영상을 구성해 주는 것이다. 

이렇게 할 경우, 단순히 Static 해석을 하는 것 보다 좀 더 좋은 가시화 효과를 얻을 수 있다.
또 다른 목적으로도 응용성이 넓어질 것이다.
(예를 들어, Elmer와 MBDyn을 Connect 시켜서 MFBD 해석 비슷하게 해 볼수도 있지 않을까)



1. 3D 모델링

여러가지 방법이나 소프트웨어를 사용해서 3D 모델을 만들어둔다.
여기서는 GPG를 이용해서 Involute Gear Profile을 얻어낸 후, PTC CREO로 Import하고 적당히 편집하면서 Extrude 시킨 것이다.
그려진 모델을 *.stp 포멧으로 저장한다.
이때, PTC CREO의 기본 치수 단위는 mm 단위로 되어 있으므로 유의해 둔다.



2. 매쉬 생성

본 예제에서는 별도의 외부 매쉬 소프트웨어를 사용하지 않고, Elmer에 내장된 nglib를 사용하였다.  따라서 매쉬 생성 규칙을 세밀하게 셋팅해 주기는 어렵지만, 가장 간단하게 해 볼 수 있다.


ElmerGUI 프로그램 실행후 *.stp 모델을 불러들이면 일단 자동으로 매쉬가 만들어지는데, 위 그림과 같이 너무 성글기 때문에 더 촘촘하게 매쉬를 만들기 위해 Mesh > Configure 메뉴로 들어간다.



그리고 위 그림과 같이, Max H 값을 0.05로 변경해 주었다.
Max H 값은, 생성될 매쉬의 셀의 가장 큰 사이즈 한계를 정해주는 것이다.  따라서 이 값을 줄이면 줄일수록 전체적으로 촘촘하게 되고, 아주 큰 셀이 만들어지지 않도록 해준다.
Gear Module이 0.3에 불과한 아주 작은 기어 치형이기 때문에 기어 치형을 더 잘게 쪼개주기 위해서이다.

Fineness 값의 의미는 나도 정확히 모르겠다.
이 값을 변경해 줘도 매쉬에 변화가 없다.  그래서 그냥 둔다.

좀 더 세밀한 옵션을 줘서 매쉬 작업을 제대로 해야 한다면, 다른 매쉬 소프트웨어를 사용하도록 일반적으로 권장된다.



아무튼 위의 옵션을 줘서 이렇게 나왔다.



3. 해석 조건 설정

Model > Setup 메뉴에 들어가서 아래와 같이 설정해 준다.


Simulation type은 Steady State가 디폴트로 되어 있는데, 일반적인 Static 구조해석을 하려면 이렇게 해서 하나의 샷만 얻어내면 될 것이다.
다만 이번 경우에는 가해지는 힘을 바꿔가면서 볼 것이기 때문에, Scanning으로 했다.
Transient로 설정하는 것은 Linear Elastic Equation을 쓸 때는 당연히 안 먹는다.

왜냐면 Linear Elastic Equation은 Implicit Equation이기 때문에 시간이 매개변수로 고려되지 않는 구조이기 때문이다.  하지만 유체동역학을 해석할 수 있는 Navier-Stokes Equation 같은 것은 당연히 시간 변수가 들어가 있기 때문에 Transient 옵션이 먹는다.

Timestep intervals 옵션은, 전체 샷의 개수를 써 넣는 것이다.  이번 경우에는 100개의 샷을 얻어내기로 했다.
Timestep sizes 옵션은, 각 샷의 시간 간격이다.  이번 경우에는 간단히 1초 간격으로 하기로 했다.  (Elmer FEM의 포럼에 가서 보니깐, Linear Elastic으로 Scanning 할 경우에는 가급적 시간 간격을 충분히 길게 주는 것이 좋다고 한다.  너무 짧게 잡으면 수렴성이 저하되기 때문이다.)

마지막으로, Free text에 위 그림과 같이 써 넣어 준다.
Free text에 써 넣는 코드는 case.sif 파일에 추가적으로 삽입되는 내용들을 자유롭게 써 넣도록 해 주는 것이다.  Remark 목적이 아니므로 유의한다.
본 예제에서 Coordinate Scaling = Real 0.001 이라고 써 준 이유는, 불러들여진 3D 모델이 mm 단위로 모델링 된 것이기 때문에, m 단위의 SI 단위계로 내장된 물성치들이 모두 통일되어 있는 Elmer에 맞춰주기 위한 것이다.

Elmer 개발팀에서는 추후에, 불러들여진 3D 모델의 스케일링을 GUI에서 지원해 주는 기능을 넣을 것을 고려하고는 있는 모양이다.

아무튼 Apply하고 창을 닫는다.
이제 Model > Equation 메뉴로 들어간다.



본 예제에서는 Linear elastic Equation만 사용한다.
따라서 위 그림과 같이, 이것만 Active 시켜주고, 또 이것을 Body1에 적용시켜준다.
Caculate Stresses 역시 체크해 줘서 응력 결과값도 얻어낼 수 있도록 해 준다.

OK 해 주고 나오고 난 후,
이제 Model > Material  메뉴로 들어간다.


Material library를 눌러서 Material을 골라준다.
본 예제에서는 Steel (carbon - generic) 을 선택해 주었다.
그러면 모든 물성치들이 한꺼번에 먹여진다.
물성치를 바꾸고 싶다면 직접 Youngs modulus 및 Poisson ration를 써 넣어줘도 당연히 무방하다.

OK 해 주고 나오고 난 후,
이제 Model > Boundary Condition  메뉴로 들어간다.


fixed 라고 이름을 지어준 후에, Displacement 1,2,3을 모두 0으로 묶어줘서 고정시키는 것으로 한다.
좌표계 차원이 x,y,z가 아니라 왜 1,2,3으로 되어 있냐면, 사용자의 필요에 따라 Setup에서 직교좌표계가 아니라 원통좌표계나 구형좌표계 등 좌표계를 바꿔서 설정해 줄 수도 있기 때문에 이와 같이 일반적인 이름으로 해 준 것이다.
Elmer의 특징 중의 하나가 이렇게 좌표계를 바꿔서 다룰 수 있도록 해 준 것이다.  모든 Elmer의 내장된 Solver들은 역시 당연히 이런 좌표계 변경에 대응 가능하도록 일반좌표계 형태로 코딩되어 있다고 한다.

이제 OK하고 닫는다.
그리고 다시 Model > Boundary Condition  메뉴로 들어가서 Boundary Condition을 아래와 같이 forced라는 이름으로 하나 더 만든다.


기어 치면에 가해 줄 힘을 정의하는 것이다.
Normal Force 부분에 Variable time으로 적어놓는다.
그리고 아래로 스크롤해서...


Free text input 란에다가 위와 같이 써 준다.
굳이 Free text input에다가 써 줄 필요 없이, 앞에 variable time이라고 써 준 뒤에 그냥 이어서 죽 써줘도 된다. (사실 그게 더 맞는 것 같다.)

그러면 나중에 case.sif 파일을 생성해서 들어다 보면,


Normal Force = Variable time
 Real MATC "-100*sin(tx*3.14159/100)"


이렇게 되어 있음을 확인할 수 있을 것이다.
즉 Normal Force에다가 집어넣어줄 값을, Variable time으로 정해준 다음, 그 값을 Real 자료형으로 주는데 그냥 상수가 아니고 시간을 매개변수로 한 함수 형태로 써 주는 것이다.
함수 표현을 해 주기 위해서 MATC 툴을 써서 "-100*sin(tx*3.14159/100)" 이렇게 표현했다.
tx라는 변수가 바로 시간 변수이다.
아까 위에서 Setup 메뉴 부분에서 Timestep intervals = 100, Timestep sizes = 1 으로 정해줬는데 그 설정에 따라서 tx 변수는 1, 2, 3, ... 100 까지 갈 것이다.
(매개변수가 시간 하나가 아니고 여러개로 늘어날 때는, tx(0), tx(1)...  이런 식으로 표현되는 것 같은데, 아직 이렇게 여러개의 매개변수를 써서 연습해 보지는 못했음)

MATC 문법은 그냥 우리가 흔히 쓰는 수식 형태가 큰 무리없이 다 먹는다.
sin() 같은 삼각함수도 그냥 먹어들어가고...

기호를 마이너스(-)로 해 준 것은 Normal force의 방향이 기어 표면을 눌러주는 방향으로 해 주기 위해서이다.

앞의 100은 최고점에 달했을 때의 힘이다.  즉 100N이다.
sin() 함수 안에 있는 3.14159/100은, Timestep intervals = 100이기 때문에 이렇게 100번 돌아갈 동안 sin()함수의 반주기가 되도록 맞춰준 것이다.

아무튼 이제 OK하고 닫는다.

이상 Boundary Condition을 fixed, forced 이름으로 2개 만들어 주었다.
이것들을 어느 Surface에 적용할 것인지를 GUI를 이용해서 직접 지정해 주는 순서로 들어간다.

일단 선행 작업을 먼저 해 준다.


마우스로 위 영역을 더블클릭하면 빨갛게 선택이 된다.
이 면에 모두 힘을 주고싶지는 않기 때문에, 이 면을 분할해서 일부에만 힘을 주고 싶다.
이 상태에서 Mesh > Devide surfaces 메뉴를 선택한다.
그러면 Sharp edge angle 옵션을 정하는 팝업창이 나온다.
디폴트값은 20도이다.

면의 형상을 보면 굉장히 완만하게 넘어가고 있기 때문에, 이걸 Devide 하기 위해 0.5도의 작은 값을 준다.


그러면 이렇게 분할이 된다.
잘 보면 동떨어져 분할된 면의 조각이 나오는데, 이것은 Ctrl키를 누른 상태에서 마우스 더블클릭을 해 가면서 합치고 싶은 것들을 선택해 준 다음에 Mesh > Unify surfaces 해 주면 합쳐진다.
그렇게 정리해 주고 일단 선행 작업을 마친다.

이제 Model > Set boundary properties 메뉴를 선택해 주면, 체크가 된다.

이 상태에서 이제 원하는 면을 더블클릭해 주면 Boundary Condition을 지정해 주는 팝업창이 뜨기 때문에, 앞서 만들어둔 fixed 또는 forced를 선택해서 조건을 설정해 줄 수 있다.

위 그림의 면에는 forced 조건을 설정해 주었다.


위 그림의 빨갛게 선택된 면과 그 반대쪽 면에는 fixed 조건을 주어서 고정시켰다.
그러면 이상 Boundary Condition을 원하는 면에 모두 지정해 주었다.

이상 살펴본 바와 같이, Elmer는 노드(node)가 아닌 면(surface)을 가지고 선택을 해 주도록 해 놓았다.  사용자 편의성을 위해 이렇게 단순하게 만들어 놓았을 것이다.
이렇게 하면 세밀한 설정이 어렵다는 단점이 있는 반면에, 입문자가 다루기에는 굉장히 심플하므로 진입장벽을 낮추는 효과가 있다.



4. case.sif 파일 만들기

대부분의 해석 소프트웨어는, solver에 입력될 파라미터 및 조건들을 간단히 넣어주기 위해 텍스트파일로 된 설정파일을 전처리 과정에서 생성하도록 되어 있다.
Elmer의 경우에는 그 역할을 하는 것이 바로 case.sif 파일이다.

sif > Generate 메뉴를 선택하면 자동으로 만들어진다.
그 다음에 sif > Edit 하면 텍스트에디터가 뜨면서 그 내용을 볼 수 있게 된다.
이걸 그대로 저장한다.  저장할 때 이름을 반드시 case.sif로 해 준다.
(Setup에서 그렇게 이름이 디폴트로 지정되어 있기 떄문이다.)

이 상태 그대로 해석을 실시해도 되는데, 그렇게 하면 결과 데이타는 case.ep 파일로 저장된다.
case.ep 파일은 텍스트파일인데 Elmer 전용 결과 데이타 포멧이다.
따라서 Elmer에 내장된 ElmerPost 및 ElmerVTK는 이 파일을 불러들여서 데이타를 가시화 해 준다.
하지만 더 좋은 후처리기로 보고 싶다면, 다른 포멧의 결과 데이타 파일을 출력해 줘야 한다.

이를 위해 case.sif 파일에 다음 내용을 추가해서 저장해 준다.



Solver 2
 Exec Solver = after timestep
 Equation = "result output"
 Procedure = "ResultOutputSolve" "ResultOutputSolver"
 Output File Name = "case"
 Output Format = String "vtu"
 Binary Output = True
 Single Precision = True
 Save Geometry Ids = True
End



그리고 이 부분의 내용을 수정해 준다.


Equation 1
 Name = "Equation 1"
 Calculate Stresses = True
 Active Solvers(1) = 1 2
End


위에 Active Solvers(1) = 1 이라고 원래 되어 있는데, 2를 하나 더 추가해 주는 것이다.
(그런데, 이렇게 추가해 주지 않아도 Solver2는 잘만 돌아가더라능...)


VTK 포멧의 xml 형식인 *.vtu 파일도 만들어주라는 내용이다.
그 기능을 해 주는 것이 바로 "result output" 이라는 것인데, 이것도 Linear elastic Equation 처럼 하나의 독립된 Solver 취급을 받고 있다.  독특한 구조다.

Elmer는 이런 식으로 미리 만들어진 여러 Solver들이 대략 46가지 정도 있는 것 같다.
물론 ElmerGUI 상에서 Equation 메뉴 들어가면 Solver 탭이 몇 개 안 보인다.
나머지는 숨어있다.

Elmer가 설치된 디렉토리에서 ../share/ElmerGUI 를 들여다 보면,
edf 및 edf-extra 라는 디렉토리가 보인다.

edf 디렉토리 안에는 ElmerGUI에서 보여지는 솔버들의 GUI 구성 내용이 xml 형식으로 각각의 별도 파일로 들어가있다.

edf-extra에는 GUI상에 안 보이는 다른 솔버들의 GUI 구성 내용들이 역시 들어있다.

가장 간단하게는, edf-extra 안의 파일들을 그냥 복사해서 edf 으로 넣어주는 방법이 있다.
이렇게 해 버리면 ElmerGUI 상에서 Equation 메뉴를 열면 솔버 선택하는 탭들이 아주 많이 생긴 것을 볼 수 있다.

하지만 이렇게 해 버리는 것은 좀 무식하고 비정상적인 방법이고, 정석적인 방법은 File > Definitions 메뉴에 들어가서 메뉴를 편집해 주는 것이다.
편집해 주고 나면 ElmerGUI를 다시 시작할 필요 없이 그냥 바로 적용되어 있다.
그래서 원하는 솔버를 선택해서 case.sif 생성해서 돌리면 된다.

편집해 준 내용을 저장하지 않고 ElmerGUI를 종료할 경우에는, 다음에 실행시킬 때는 초기화되어 보인다.  또는 편집 내용을 저장해 주면 다음부터 변경된 메뉴대로 보일 것이다.
사용자 마음대로 하면 된다.

지저분해 지는게 싫다면 편집하지 않고 그냥 디폴트로 해 놓고 쓰다가 필요한 솔버는 그때그때 불러다 쓰는게 나을지도 모른다.


ElmerGUI의 단점이 하나 있는데, 그것은 위에서처럼 case.sif 파일을 편집기로 직접 수정해 줄 경우에, Save Project 해 주면 편집해 준 내용이 다 날아가 버린다는 것이다.
왜 이렇게 만들었는지는 모르겠는데, 내용이 날아가버리는 것에 대비해서 수동으로 편집해 준 case.sif 파일은 이름을 바꿔서 백업해 두는 것이 좋겠다.



5. Run

Run > Parellel settings 메뉴에서 병렬연산용 CPU 코어 개수를 정해줄 수 있다.
ElmerSolver_mpi.exe 라는 유틸리티가 내부적으로 작동해서 계산영역을 자동으로 파티셔닝해서 이루어지는 것 같은데...  이게 잘 되는 케이스도 있고 안되는 케이스도 있다.
이번 예제에서는 안 먹고 에러가 나온다.  그래서 병렬연산 셋팅을 해제하고 싱글코어로 그냥 했다.
Nvidia CUDA 그래픽카드 병렬연산은 아마 지원하지 않는 듯 하다.
이걸 하려면 아마 Elmer에 사용된 핵심 포트란 라이브러리들을 CUDA와 엮어서 어떻게 재컴파일하던가 해야 할 것 같다.  그렇게 하기는 현실적으로 힘들기 때문에, 결국 비싼 그래픽카드는 필요없다.

이제 Run > Start solver 한다.


이 케이스에서의 수렴 그래프 모양은 좀 독특한 것 같은데 일단 뭐 결과는 나오므로 그냥 둔다.
전체 해석 시간은 6655.98 초 걸렸다.
100번의 샷을 연산했으므로 시간이 오래 걸렸다.



6. 결과 보기

결과를 보기 위해 Paraview를 실행시키고, 만들어진 case.vtu를 열어본다.
100번의 샷이므로 작업 디렉토리에는 case0001.vtu ... case0100.vtu 으로 100개의 파일이 만들어져 있다.




그리고 Paraview 상에서 결과를 애니메이션으로 이리저리 저장해 주고, 그것들을 모아서 동영상을 만든다.






이상의 과정을 연습해 보니깐 Elmer에 대해서 어느정도 감이 잡히는 것 같다.



2015년 5월 9일 토요일

크로믹시움(Chromixium)


사무실과 집에 돌아댕기는 구형 노트북들이 몇 개 있는데
전부 다 리눅스 기반 브라우징 용으로 쓸 수 있도록 하기 위해
몇가지 검토를 해 봤는데,
제일 좋았던 크런치뱅 리눅스는 이제 더이상 개발 안한다는 걸 알았다.
운영자가 이걸 계속 만들어대는데 의미를 느끼기 힘들다고 한다.
나한테는 의미가 있었구만 쩝.

암튼 그래서 크런치뱅 대안을 찾다가 Slitaz를 시도해 봤는데
엄청 빠르고 좋긴 한데, 데비안이나 우분투 기반이 아니고 독자적인 패키지 기반이라
필요한 환경을 구성하기에 제한점이 많아서 쓸 수 없다는 사실을 알았다.

결국 다른걸 다시 찾았는데, 크로믹시움(Chromixium) 이라는 녀석을 찾아냈다.
http://chromixium.org/



크롬OS 짝퉁(?)으로 생각되는데, 일단 UI 디자인이 그냥 크롬OS랑 똑같게 하려고 노력했다.
그런데 크로미움OS 프로젝트에서 포크해서 만든 게 아니고,
우분투 기반으로 패키지 구성해서 만든 녀석이라는 점이 특이하다.
간단히 말해서 우분투 위에 UI 부분을 크롬OS 삘 나게 데코레이션 헸다는 것이다.
우리나라 안에서 크롬북 보기가 하늘의 별따기인지라, 크롬북 사용하는 기분도 내고 좋겠네 싶다.

일단 받아다가 닥치고 깔아보았는데, 램 1기가짜리 구형 넷북에서 돌리는데 한 박자 반응이 느린 것 빼고는 일단 잘 돌아는 간다.
코어2 CPU를 사용한 구형 노트북 정도에서는 아주 팔팔 날아다닐 수 있겠다 싶다.
사무실의 구형 노트북에 이걸 깔아다가 프리젠테이션 용으로 쓰면 되겠다.
(크런치뱅 수준으로 아주 가볍지는 않은 것 같다.)

크로믹시움의 단점은, 한글 환경은 전혀 준비되어 있지 않다.
따라서 처음에 깔 때 그냥 미국 로케일로 깐 다음에, 나중에 한글 환경으로 몇가지 손을 봐 줄 필요가 있다.

일단 한글 폰트를 먼저 깔아준다.
시냅틱 패키지 관리자가 기본적으로 들어 있으므로 그걸로 폰트 찾아다가 깔아주거나, 이렇게 한번에 깔아주면 된다.

sudo apt-get install language-pack-ko


그리고 한글 로케일로 변경...


su
dpkg-reconfigure locales
locale-gen ko_KR.UTF-8
nano /etc/default/locale



여기서 locale 파일 내용 중에서 미국 것으로 되어 있는 놈들을 전부 "ko_KR.UTF-8" 요런 식으로 바꿔주고 저장해 준다.


LANG="ko_KR.UTF-8"
LANGUAGE="ko_KR:ko"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_PAPER="ko_KR.UTF-8"
LC_IDENTIFICATION="ko_KR.UTF-8"
LC_NAME="ko_KR.UTF-8"
LC_ADDRESS="ko_KR.UTF-8"
LC_TELEPHONE="ko_KR.UTF-8"
LC_MEASUREMENT="ko_KR.UTF-8"



그리고 재부팅하면 한글판 리눅스가 된다.

마지막으로, 한글 입력이 가능해지도록 하기 위해서


su
apt-get update
apt-get install uim uim-byeoru
im-config



해 주고 uim 선택해 준다.  그리고 재부팅하니깐 벼루 입력기가 트레이에 들어가 있음이 확인된다.

기타 잡스러운 어플리케이션 깔아주고 어쩌구 하는건 귀챦아서 관둘려다가 결국 크로미움이 너무 무거운지라, 파이어폭스와 미도리 브라우저를 추가로 깔아주고 필요할 때 골라 쓰기로 했다.
앞으로는 점차적으로 웹앱으로 처리하는 작업을 늘려가기로 한다...



2015년 5월 7일 목요일

Open Source CAE Toolchain 12 - Salome & Code_Saturne


Elmer의 CFD 능력은 한계가 있기 때문에,
좀 더 고급 해석을 위해서는 다른 솔루션이 필요할 수 있다.

학계에서 가장 잘 확산된 것은 뭐니뭐니해도
openFOAM 이다.
문제는 이 솔버는 너무 학구적(?)이라는 점이다.

영국의 작은 개발자 집단이 만들어내는 걸로 알고 있는데,
솔버 한가지에만 집중해서 개발을 진행하고 사업을 하다 보니
전처리기, 후처리기 쪽은 아예 건드리지도 않고 있다.

학계에서 선호하는 또 다른 이유는,
C++로 만들어놓아서 소스 분석하기가 좋고 (아닌가???)
자신만의 지배방정식을 집어넣기가 아주 용이하다고 한다.
다이버전스 같은걸 그냥 함수 이름으로 써 넣는 식으로
방정식을 액면 그대로 써 주면 되는 식인가 보다.

우리나라에서도 이걸 가지고 논문 쓴게 몇 개 정도 발견되기 시작한다.
아무래도 유럽 보다는 몇 년 뒤쳐져서 트랜드가 오는 것 같다.

아무튼 전산유체역학 하는 쪽에서는 꽤 핫 한가 보다.
CFD계의 리눅스 같은 느낌.



OpenFOAM의 전처리기를 보완해 줄 수 있는
다른 데서 나온 솔루션들도 물론 있다.

온라인으로 클라우드 서비스를 해 주는 Simscale도 있고,
Helyx-OS 라는 자바로 만든 것도 있다.

Helyx-OS는 설치 자체는 쉽고,
메뉴도 심플하게 되어 있어서 접근성이 좋은 것 같다.
다만 아직 해석후 비주얼라이제이션 과정을 이해하지 못해
결과를 보는데까지는 가 보지 못했다.

Simscale은 무료 회원가입 받아주고 해서 참 좋은데
언젠가는 완전 유료화 되지 않을까 싶기도 하고
아무래도 내 컴퓨터에서 돌아가는게 아니다 보니까
왠지 내 것이 아닌 것 같은 느낌이 들어 찜찜은 하다.
(그래도 해석 실패 직후에 곧바로 이메일 날아와서
기술 상담해 주는 걸 보고 감동먹음)


아무튼 그래서 OpenFOAM 보다는 좀 더 접근하기 쉬우면서
빵빵한 녀석은 없나 살펴보면
Code-Saturne이 있다.

물론 이 녀석도 굉장히 까다롭다.
일단 설치하는 것 부터 아주 괴롭다.
직접 컴파일 하고 순서대로 따라서 다 해줘도
제대로 실행이 안될 확률이 높다.

제일 편한 방법은 CAElinux를 받아다가 원래 깔려 있는걸 그냥 쓰는거다.
다만 CAElinux의 단점은 구버전이라는 점이다.
그래도 일단 혈압상승과 두뇌 용량 초과를 방지하기 위해
CAElinux를 VirtualBox로 설치해서 연습해 보기로 했다.


연습 과정은 다음 동영상으로 녹화해 봤다.
(시행착오 하는 과정까지 다 들어있기 때문에 굉장히 지루하다...)




그리고 난류 조건을 주고 입구속도를 증가시키고  Time Step을 줘서
100프레임 정도를 뽑아내 보기도 했다.





Code_Saturne의 단점은 OpenFOAM 만큼 유저가 많지는 않다는 점이다.
튜토리얼이나 입문자를 위한 다양한 동영상이나 사례 같은걸
찾기가 상대적으로 좀 더 어렵다.

하지만 어설프나마(?) GUI가 일단은 있기 때문에
OpenFOAM 같은 물건을 처음 맞딱뜨렸을 때의
당황스러움은 좀 덜 하다.

기능적으로는 OpenFOAM과 대등하거나
아주 살짝 떨어지지 않을까 추측되는데
신뢰성 면에서는 별로 의심할 부분은 없어 보인다.

오히려 Code_Saturne은 Code-Aster 및 Syrthes 같은
다른 솔버와 커넥션이 된다고 하므로
멀티피직스까지 되니깐
OpenFOAM보다 더 실용성이 있다고 볼 수도 있다.


OpenFOAM은
자동차회사인 아우디가 주력 해석툴로 사용하고 있다고 하니
거의 상용 수준이라고 봐도 의심되지 않을 것이고

Code_Saturne은 프랑스 EDF가 원자로 노심 내부의 유동 해석 같은
굉장히 높은 신뢰도가 요구되는 민감한 용도로 사용하고 있으니
역시 충분한 검증을 거쳤다고 볼 수 있다.


궁극적으로 로터 블레이드 같은 회전기계 해석을 목표로 할 경우
Code-Saturne 및 OpenFOAM 모두 이 문제는 잘 지원하고 있으니
큰 문제는 없으리라 생각된다.

관련 논문을 보면, OpenFOAM 같은 경우에 상용툴보다 못한 부분이
천음속~초음속 영역에서 충격파를 다룬다던가
연소 및 폭발 문제에서 박리 부분에서
해답이 살짝 진동한다던가 하는 걸로 지적되는데
이런 극단적인 해석은 사실 나하고는 아무 상관 없으므로
그냥 단점이 없다고 보면 될 것 같다.


CFD 툴 중에 최고로 편한걸 찾자면 SolidWorks에 포함된 툴 같은데..
그런 걸로 하면 결국 남는건 툴 사용 기능 밖에 없는 것 같다.
어느정도는 이런 경험을 해 보는 것도 좋지 않을까...


다만 구조해석 보다는 CFD 쪽은 확실히
매쉬가 훨씬 더 촘촘해야 의미있는 결과를 얻을 수 있으므로
이걸 돌리는 컴퓨터는 일단 메모리가 엄청 빵빵해야 할 것 같다.

Code_Saturne 돌리는 가상머신에 6기가 정도 메모리를 주고
100프레임을 뽑아내니깐 메모리 누수가 생겨서 데이타가 날아가 버리고
가시화 되지 않는 현상이 발생한다.