| OpenFOAM | |
|---|---|
| 종류 | 오픈소스 CFD 툴박스 |
| 개발 | OpenCFD Ltd (ESI Group) |
| 언어 | C++ |
| 라이선스 | GPL v3 |
| 최초 공개 | 2004년 |
| 플랫폼 | Linux (주력), Windows/macOS |
1. 개요[편집]
라이선스 비용은 0원이다. 대신 당신의 시간과 정신력으로 지불하게 된다.
OpenFOAM(Open Field Operation And Manipulation)은 C++로 작성된 오픈소스 전산유체역학 툴박스다. 정확히는 CFD 전용 프로그램이라기보다, 연속체 역학의 편미분방정식을 유한체적법으로 풀기 위한 라이브러리와 그 위에 구현된 솔버·유틸리티의 모음이다. 소스가 완전히 공개되어 있고 병렬 코어 수 제한이 없어, 학계와 산업계를 가리지 않고 상용 코드의 대안 혹은 보완재로 널리 쓰인다.
가격표에 0이 하나 적은 것이 아니라 아예 0원이라는 점 때문에 상용 코드 라이선스 비용에 시달리는 조직에게 구원처럼 보이지만, 공식 GUI가 없고 학습 곡선이 가파르다는 점에서 공짜 점심은 아니다.
2. 역사[편집]
전신인 FOAM은 1980년대 말~1990년대에 임페리얼 칼리지 런던의 헨리 웰러(Henry Weller)와 흐르보예 야삭(Hrvoje Jasak) 등이 개발했다. 당시 지배적이던 포트란 CFD 코드에 대한 반란으로, C++의 객체지향과 연산자 오버로딩으로 텐서 수학을 코드에 직접 표현하겠다는 설계 철학이 핵심이었다. 이후 Nabla Ltd를 통해 상용 판매되다가, 2004년 OpenCFD Ltd가 GPL 라이선스로 전면 공개하면서 OpenFOAM이 되었다.
이후의 역사는 포크(fork)의 역사다.1
- ESI-OpenCFD 버전 (openfoam.com) — OpenCFD Ltd는 2011년 SGI에, 2012년 ESI Group에 인수되었다. 상표권 “OpenFOAM”의 보유자이며, v1606부터 연도+월 형식(v2312, v2406, …)으로 연 2회 릴리스한다.
- Foundation 버전 (openfoam.org) — 원저자 헨리 웰러가 이끄는 OpenFOAM Foundation이 배포하며, CFD Direct가 개발을 주도한다. 정수 버전 번호(10, 11, 12, …)를 쓴다.
- foam-extend — 야삭이 주도하는 커뮤니티 포크로, 실험적 기능(중첩 격자, 블록 연성 솔버 등)을 과감하게 수용하는 노선이다.
세 갈래는 케이스 파일이 미묘하게 호환되지 않아서, 인터넷에서 주운 튜토리얼이 내 버전에서 안 돌아가는 것은 OpenFOAM 입문의 통과의례다.
3. 케이스 구조[편집]
OpenFOAM에는 프로젝트 파일이라는 개념이 없다. 케이스는 정해진 구조의 디렉토리이며, 모든 설정은 텍스트 딕셔너리 파일로 이루어진다.
cavity/
├── 0/ # 초기·경계 조건 필드 (U, p, k, omega, ...)
├── constant/ # 격자(polyMesh/), 물성치, 난류 모델 설정
└── system/ # controlDict, fvSchemes, fvSolution
- 0/ — 각 물리량 필드의 초기값과 경계 조건을 담는다. 디렉토리 이름이 0인 이유는 시간 0초의 상태이기 때문. 시간 전진에 따라 0.1/, 0.2/ 같은 시간 디렉토리가 늘어난다.
- constant/ — 격자 데이터(polyMesh)와 물성, 난류 모델(turbulenceProperties) 등 해석 중 변하지 않는 정보.
- system/ — 시간 간격과 출력 주기(controlDict), 이산화 스킴(fvSchemes), 선형 솔버와 알고리즘 설정(fvSolution).
4. 주요 솔버[편집]
솔버가 물리 모델별로 따로 존재하는 것이 OpenFOAM의 전통적 구조다.2
- simpleFoam — 정상상태 비압축성 난류 유동. 이름 그대로 SIMPLE 알고리즘 기반이다.
- pisoFoam — 비정상 비압축성 유동. PISO 알고리즘으로 시간 정확도를 확보하며, CFL 조건의 제약을 받는다.
- pimpleFoam — PISO와 SIMPLE을 결합한 PIMPLE 알고리즘. 외부 반복을 통해 큰 시간 간격에서도 안정적으로 돌아가는 실무의 주력이다.
- interFoam — VOF(Volume of Fluid) 기반 2상 유동 솔버. 자유수면, 슬로싱, 월파 해석의 단골이다.
5. 유틸리티[편집]
- blockMesh — 딕셔너리로 정의하는 정렬 육면체 격자 생성기. 꼭짓점 좌표를 손으로 적어야 해서 복잡한 형상에는 고행이다.
- snappyHexMesh — STL 표면에 육면체 지배(hex-dominant) 격자를 자동 생성하는 도구. 강력하지만 설정 딕셔너리의 파라미터가 수십 개라, 이것만 다루는 튜토리얼 시리즈가 따로 있을 정도다.
- decomposePar / reconstructPar — 병렬 계산을 위한 도메인 분할과 재조합. MPI 코어 수에 제한이 없다는 것이 상용 코드 대비 최대 무기다.
- checkMesh — 격자 품질 검사. 비직교성과 skewness를 검사해 통과/실패를 알려주는 문지기.
6. 코드로 쓰는 방정식[편집]
OpenFOAM의 백미는 C++ 연산자 오버로딩으로 구현된 텐서 DSL이다. 지배 방정식이 거의 수식 그대로 코드가 된다.
solve
(
fvm::ddt(rho, U)
+ fvm::div(phi, U)
- fvm::laplacian(mu, U)
==
- fvc::grad(p)
);
fvm:: 네임스페이스는 해당 항을 음적(implicit)으로 이산화하여 행렬 계수에 반영하고, fvc:: 네임스페이스는 현재 필드값으로 양적(explicit) 계산하여 소스항으로 처리한다. 즉 어떤 항을 행렬 좌변에 넣을지 우변에 넣을지를 네임스페이스 선택만으로 결정하는 것. 나비에-스토크스 방정식을 이 정도 가독성으로 코드에 옮긴 시스템은 지금 봐도 드물다. 새 물리 모델을 추가하고 싶은 연구자에게 이 구조는 강력한 유인이다.
7. 장점과 단점[편집]
장점
- 무료이며 소스가 완전 공개되어 있다. 솔버 내부가 궁금하면 열어보면 된다.
- 병렬 코어 수 무제한. HPC 클러스터에 1만 코어를 던져도 라이선스 서버가 화내지 않는다.
- 라이브러리 구조 덕분에 커스텀 솔버·경계 조건·물리 모델 개발이 자유롭다.
단점
- 공식 GUI가 없다. 모든 설정은 텍스트 파일 편집이며, 오타 하나에 솔버는 장문의 C++ 스택 트레이스로 응답한다.
- 학습 곡선이 가파르다는 표현은 관대하고, 절벽에 가깝다.
- 공식 문서가 만성적으로 부족하여 소스 코드가 곧 문서인 경우가 많다.4
- 포크 3파전으로 인해 버전 간 파편화가 존재한다.
상용 코드인 ANSYS Fluent와 비교하면 “지원과 편의를 돈으로 사느냐, 자유를 시간으로 사느냐”의 구도로 요약된다.
8. 커뮤니티[편집]
문서화 부족을 메우는 것은 커뮤니티다. CFD Online 포럼의 OpenFOAM 게시판은 20년치 시행착오의 아카이브로, 웬만한 에러 메시지는 검색하면 2009년쯤 같은 고통을 겪은 선배가 나온다. 그 외 OpenFOAM Wiki, 연례 OpenFOAM Workshop, 각종 대학 강의 자료가 사실상의 교과서 역할을 한다.