Skip Navigation
Skip to contents

eTSNE


ANZINE : CAE 기술 매거진

PyMechanical을 이용한 Python 환경에서의 밸브 해석

PyMechanical을 이용한 Python 환경에서의 밸브 해석

 

 

Introduction 

일반적으로 Ansys Mechanical™을 이용하여 구조해석을 수행하고자 할 때에는 Ansys Workbench 환경에서 Mechanical 어플리케이션을 실행 후 GUI 환경에서 작업을 수행한다. 그러나 이 과정을 거치지 않고 python 환경에서도 Ansys Mechanical 어플리케이션으로 구조해석을 수행할 수도 있다. Python의 라이브러리 중 PyAnsys는 Ansys의 해석 기능을 python 언어 기반에서 제어할 수 있도록 지원하며, 그 중 PyMechanical 라이브러리는 Ansys Mechanical의 GUI 기능을 python으로 치환하여 전처리/해석/후처리를 모두 수행할 수 있도록 한다. 

PyMechanical을 통한 Ansys Mechanical의 해석을 진행하면 다음과 같은 장점을 지닌다.


▶ API로서 python 내의 타 라이브러리를 호환하여 사용 가능
▶ Ansys Workbench GUI에서는 복잡하거나 제한적인 조건 입력을 python에서는 자유롭게 구현 가능
▶ 반복 해석, 해석 자동화, 사용자 환경 구성, 최적화 해석으로의 확장 가능

 

여기서는 PyMechanical을 사용한 [Basic valve implementation] 예제를 소개한다. 해석 과정에서 각각의 속성을 어떻게 활용하는지 알아보고, python 환경에서 Ansys Mechanical 어플리케이션으로 구조해석을 수행하는 방법을 알아본다.

본문에 들어가기 전에, 본 작업을 수행하기 위한 유의사항에 대해 언급한다. 본 예제는 python 코드로 작성되었으며, Pycharm IDE 환경에서 수행되었다. 해당 예제는 python을 사용할 수 있는 환경에서, 사용자가 python을 어느 정도 사용해본 경험이 있을 것임을 권장한다. 또한 아래 python 코드를 실행하기 위해서는 Ansys Mechanical 어플리케이션을 사용할 수 있는 라이선스가 있어야 한다. ANZINE에서는 본문이 모두 그림으로 업로드 되므로 코드를 직접 실행해보고 싶다면 PyAnsys 홈페이지의 examples 탭을 참조하기 바란다.

 

 

 

■ 본문

■ 1. 라이브러리 불러오기

Python 코드의 서두에서는 [그림 1]처럼 python 환경에서 활용하기 위한 모듈을 불러온다. Python 표준 라이브러리에 포함되지 않아 별도로 설치가 필요한 서드파티 라이브러리는 다음과 같다.


▶ ansys.mechanical.core : Ansys Workbench의 GUI 환경을 python 스크립트로 제어할 수 있게 해주는 라이브러리
▶ matplotlib : MATLAB 스타일의 인터페이스를 제공하여 데이터를 시각화하는 라이브러리
▶ pillow(PIL) : 이미지 처리 라이브러리

 

 


[그림 1] 라이브러리 불러오기 코드

 

 

app.update_globals(globals())은 Ansys Mechanical 어플리케이션에서 제공되는 객체들(Model, Graphics, ExtAPI)을 현재 python 코드에서 사용할 수 있게 해주는 명령어이다. 이 명령어를 실행하기 전에는 python 코드 편집기(IDE)에서 해당 객체들이 정의되지 않은 것으로 인식되어 오류를 표시하지만, 실행 후에는 Ansys Mechanical 어플리케이션 환경 내에서 제공되는 함수들이 전역변수로 선언되어 실제 실행 시에는 오류를 일으키지 않고 동작한다.

[그림 3]은 IDE가 Graphics 등의 Ansys 객체들을 인식하지 못해 참조 오류(Unresolved Reference)를 표시하는 예시이다. 그러나 이 오류는 편집기에서만 발생하며, 코드를 실행하면 문제없이 잘 작동한다.

os.getcwd()는 현재 python 프로그램이 실행되고 있는 작업 폴더의 위치를 가져오며, display_image(image_name) 함수는 현재 위치의 하위 폴더 ‘out’에 저장되어 있는 ‘image_name’(입력 인수)와 같은 이름의 그림을 matplotlib 라이브러리를 통해 화면에 시각화한다.

print(app) 명령어는 [그림 4]와 같이 Ansys 라이선스와 버전을 출력한다.

 


[그림 2] 전역변수 불러오기 및 이미지 출력 함수 정의 코드

 


[그림 3] Ansys 객체들이 등록되지 않아 참조 오류가 표시되는 python 코드 편집기 화면

 


[그림 4] Ansys 라이선스와 버전 출력 화면

 

 

■ 2. 그래프 출력 포맷 설정

settings_720p = Ansys.Mechanical.Graphics.GraphicsImageExportSettings()는 그래픽 이미지 추출에 관한 설정값을 담아두기 위해,
GraphicsImageExportSettings 클래스 객체를 생성하고, 이를 ‘settings_720p’ 라는 변수에 저장한다. 해당 변수는 이후 여러 이미지 출력을 위해 입력 인수로 활용된다. 이하 아래의 명령어들은 settings_720p 변수의 속성(resolution, width 등)값을 지정하여 그래픽 출력 조건을 구성한다.

 


[그림 5] 이미지 추출 관련 설정값 객체 생성 및 출력 조건 코드

 

 

 

■ 3. 예제 형상 다운로드 및 시각화

라이브러리를 통해 예제 형상 파일을 다운로드하여 이를 시각화한다. [그림 6]과 같이 예제 파일 중 “Valve.pmdb” 모델을 가져온다.

 

 


[그림 6] 예제 모델 형상 다운로드 코드

 

 

[그림 7]은 형상을 불러오기 위한 코드이다. ‘Geometry_import’는 형상을 불러오기 위해 정의된 변수이다. 이후 형상 파일의 형식(format)과 불러오기 옵션(preferences)을 정의한다. 이 과정에서 형상에 named selection 정보를 포함하고 있다면 geometry_import_preferences.ProcessNamedSelections 값을 ‘True’로 설정하여 이를 불러올 수 있다. 사전 정의한 format과 preferences를 geometry_import.import() 함수의 인수로 입력하여 형상을 불러온다.

app.plot() 명령어를 통해 [그림 8]에 표시되는 plot은 pyvista로 출력되며, 마우스에 반응하여 회전/확대/축소/이동이 가능하다. 그러나 격자 생성 이후에서는 pyvista로 형상을 표시하기 어려우므로, Ansys Mechanical에서의 그림을 캡쳐하여 저장한 후 해당 그림을 표시했다.

 


 
[그림 7] 예제 형상 불러오기 및 시각화 코드

 


[그림 8] 예제 형상 시각화 결과

 

 

 

■ 4. 물성 부여 및 격자 생성

전체 body에 ‘Material Assignment’ 항목을 통해 ‘Structural Steel’ 물성을 적용하고, 모델의 해석을 위해 형상을 모서리 크기 25mm인 격자로 나누어 CAE 모델을 구성한다. 다음으로 격자가 잘 생성되었는지 확인할 수 있도록 그림으로 저장하고, matplotlib 라이브러리를 통해 화면에 표시한다.

‘material_assignment’ 항목은 입력 값으로 물성 정보와 물성을 적용할 대상을 선택한다.
[그림 9]에서 material_assignment = Model.Materials.AddMaterialAssignment()는 material assignment 항목을 생성해 ‘material_assignment’라는 변수로 저장하고, 이 ‘material_assignment’의 속성 중 ‘Material’을 “Structural Steel”로 지정한다.

sel = … 은 어떤 형상(Geometry)에 물성을 지정할 것인지 선택 정보를 전달하는 객체이다. 이 중 sel.Ids에서 모델 내의 모든 Body ID를 리스트로 모아 sel.Ids로 저장한다.
마지막으로 material_assignment.Location = sel을 통해, 앞에서 선택한 모든 형상에 물성을 적용한다.

 

 


[그림 9] 물성 부여 코드

 

 

[그림 10]에서 mesh = Model.mesh로부터 ‘mesh’라는 변수를 생성하고 속성을 통해 CAE 모델을 구성한다. ElementSize 속성값을 통해 요소 크기(Global mesh size)를 25 mm로 지정하고, GenerateMesh() 메서드를 실행하여 격자 생성 작업이 이루어진다.

이후 코드는 outline tree에서 ‘Mesh’를 선택하고 현재 viewport의 화면을 보여주는 코드이다. Tree.Activate([mesh])는 Ansys Mechanical 어플리케이션의 outline tree에서 ‘Mesh’를 선택하면 GUI에서 격자를 표시하도록 하고 관련 설정들이 활성화되는 것처럼, python 환경에서 이에 대응하는 명령어이다. 현재 viewport의 화면을 Graphics.ExportImage를 통해 “mesh.png”로 저장하고, 사전 정의한 display_image 함수로부터 해당 이미지를 [그림 11]처럼 화면에 출력하였다. 이 때 위에서 저장한 그래픽 이미지 추출 설정값인 변수 settings_720p를 불러왔다.

 

 


[그림 10] 격자 생성 및 이미지 출력 코드

 


[그림 11] 격자 시각화

 

 

■ 5. 해석 유형 및 경계 조건 정의

이 절에서는 해석 유형을 설정하고, 경계/하중 조건을 정의한 후 이를 확인하는 작업을 수행한다. 모델 내에는 경계조건을 적용하기 위한 named selections가 미리 정의되어 있어 이를 불러올 것이다. 각 경계조건 ‘Fixed Support’, ‘Frictionless Support’, ‘Pressure’를 named selection에 정의하고, 경계조건이 잘 적용되었는 지 이미지로 저장해 확인한다.

[그림 12]에서는 analysis = Model.AddStaticStructuralAnalysis()는 선형 정적 해석을 추가하고, ‘analysis’ 변수의 속성을 통해 해석 설정을 다루게 된다. analysis.AddFixedSupport(), analysis.AddFrictionlessSupport()을 통해 경계조건 객체를 생성하고, 이를 각각 ‘fixed_support’, ‘frictionless_support’로 저장한다.

경계조건의 적용 대상은 ‘Location’ 속성을 통해 지정하였다. ExtAPI를 통해 모델 트리 내에 정의된 named selection 객체를 참조하였고, 이들을 경계조건의 대상으로 지정하였다.

같은 방법으로 analysis.AddPressure()을 통해 압력 하중 객체를 생성하고, 이를 ‘pressure’에 저장한다. 해석 시간(0 ~ 1s)에 따라 압력 크기가 선형 증가하도록 설정하였다.

Graphics.Camera.SetFit()는 모든 모델이 카메라 뷰에 딱 맞게 보이게끔 viewport 화면을 조정하는 명령어이다. 이전 격자 화면을 표시할 때와 동일한 방법으로 ‘ExportImage’로 현재 viewport의 화면을 저장하고, 해당 이미지를 display_image 함수를 통해 [그림 13]처럼 화면에 출력하였다.

 

 


[그림 12] 경계조건 설정 코드

 


[그림 13] 경계 조건 시각화

 

 

 

결과 출력 항목으로 total deformation과 equivalent stress을 ‘solution’ 변수에 추가 후 해석을 수행한다.

 

 


[그림 14] 결과 항목 추가 및 해석 수행 코드

 

 

 

■ 6. 메시지 로그 확인

[그림 15]는 해석 후 메시지(Info/Warning/Error)가 발생하였다면 이를 표시하고, 그렇지 않다면 메세지가 발생하지 않았음을 출력한다.

 

 


[그림 15] 메시지 로그 확인 코드

 

 

■ 7.  해석 결과 확인

해석 결과 항목으로 추가했던 total deformation 및 equivalent stress 항목 결과 화면을 저장하고, 이를 나타내도록 한다. 더불어 해석 애니메이션의 출력 코드도 함께 설명한다.

위에서 정의한 total deformation 항목에 대해 [그림 16]에서 해석 결과 항목으로 Tree.Activate()로 활성화하면 viewport 화면이 전환되고, 해당 화면을 이미지로 저장 및 [그림 17]과 같이 표시한다.

 

 


[그림 16] Total deformation 결과 출력 코드

 


[그림 17] Total deformation 결과 출력 화면

 

 

Equivalent stress 항목도 같은 방법으로 [그림 18]을 통해 [그림 19]처럼 equivalent stress 결과가 출력되도록 한다.

 

 


[그림 18] Equivalent stress 결과 출력 코드

 

 


[그림 19] Equivalent stress 결과 출력 화면

 

 

[그림 20]은 equivalent stress 해석 결과 애니메이션을 표시하기 위한 코드이다. 먼저 Ansys Mechanical에서 해석 결과를 움직이는 그림 파일(GIF)로 저장한다. 이 때 어떤 포맷으로 저장할지를 animation_export_format에서 지정한다.

저장된 gif 파일을 pillow 라이브러리의 Image.open()으로 불러들여 gif 변수에 이미지 객체로 저장하였다. gif.seek(frame)은 gif의 특정 프레임으로 이동할 수 있게 해 주는 함수로, 이를 이용해 update(frame)이라는 함수에서 각 프레임에 해당하는 화면 정보를 줄 수 있게 하였다.

마지막으로 matplotlib 라이브러리에서 가져온 FuncAnimation 함수를 사용하면 gif의 각 프레임이 시간 간격에 따라 출력된다.

 

 


[그림 20] Equivalent stress 항목의 결과 애니메이션 출력 코드

 

 

 

■ 8. 해석 출력 파일 확인

[그림 21]은 Ansys Mechanical에서 해석 수행 후 자동으로 생성되는 solve.out 파일 내용을 출력하는 코드이다.

 

 


[그림 21] Solver Output 텍스트 출력 코드

 

 

Write_file_contents_to_console 함수는 path내 텍스트 파일의 텍스트 내용을 한 줄씩 출력하는 함수이며, 아래의 코드는 함수의 입력인수로 필요한 solve.out 파일 경로를 가져오는 코드이다. 이 때 해석이 정상적으로 수행되어 solve.out이 존재할 경우에만 텍스트 출력 함수를 실행한다.

코드가 실행되면 [그림 22]와 같이 Ansys Mechanical 환경에서 해석 시 출력되는 solver output을 python 터미널에서 확인할 수 있다.

 

 


[그림 22] 텍스트로 출력된 Solver Output

 

 

■ 9. 프로젝트 트리 구조 확인

 [그림 23]처럼 입력하면 터미널에 프로젝트 트리 정보를 출력해 준다. 이 명령어는 해석 조건을 모두 지정하지 않았어도 작업 도중 프로젝트 상황을 확인하기 위해 활용할 수도 있다. [그림 24]의 왼쪽은 모든 해석을 완료한 후 프로젝트 트리를 출력한 것이고, 오른쪽은 경계조건 설정 도중 ‘Frictionless Support’까지 설정한 후 프로젝트 트리를 출력한 것이다.

 

 


[그림 23] 프로젝트 트리 출력 코드

  


[그림 24] 텍스트로 출력된 프로젝트 트리

 

 

■ 10. 세션 정리 및 임시 파일 삭제

지금까지 해석에 적용한 설정/결과를 프로젝트 폴더에 “Valve.mechdat”라는 이름으로 저장하고 세션을 새롭게 초기화한다. 이후 다운로드했던 예제 파일을 삭제한다.

 

[그림 25] 세션 저장 및 초기화 코드

 

 

맺음말

이 글에서는 예제를 통해 python 개발 환경에서 Ansys Mechanical로 해석을 수행하였다. 주어진 예제 모델을 불러오고, 격자 및 경계조건 부여 후 해석 후처리까지 일련의 과정을 수행하는 방법을 알아보았다.

PyMechanical은 Ansys Mechanical 어플리케이션의 UI에서 작업하는 모든 것을 코드로 구현하기에는 어렵다. Ansys Mechanical을 사용할 때에는 각 작업들을 GUI를 보면서 작업하여 편리하지만, python 환경에서 해석 작업을 수행할 때에는 이러한 과정을 코드로 해결하여야 한다. 예를 들어, 경계조건을 적용할 대상 지정 시 viewport에서 형상을 직접 보고 지정해야 하는 경우 등의 상황에는 python 환경에서 작업하는 것에 한계가 있을 수 있다. 더불어 PyMechanical은 python 개발에 대한 이해도가 필요하여 숙련되기까지의 진입 장벽 또한 존재한다.

하지만, PyMechanical은 python 라이브러리 확장성 측면에서 Ansys Mechanical 어플리케이션에서 어려운 작업을 수행할 수 있다.


▶ 각종 해석 과정에서의 분기/반복을 통한 조정 가능
▶ 결과에 기반한 자동 후처리 (초기 해석 후 stress error를 확인하고, 해당 부분의 격자를 refinement 수행하여 재시도)
▶ 해석 수렴 실패 시 파라미터 조정 후 재시도 등의 자동 대응 기능
▶ 해석 완료 시 자동 후처리 기능

 

날이 갈수록 python 라이브러리들을 이용하여 자동화, AI 등을 접목하는 방법에 관심이 높아지고 있다. Ansys Mechanical을 python 환경에서 충분히 다룰 수 있다면, 무궁무진한 확장성을 통해 전반적인 CAE 해석 작업의 자유도를 높일 수 있을 것으로 기대한다.


■ 참고자료
- PyAnsys Example 

 

좋아요이 원고가 마음에 든다면 하트를 꾸욱!