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에 대해서 어느정도 감이 잡히는 것 같다.



댓글 없음:

댓글 쓰기