1. 개요
| OpenFOAM | |
|---|---|
| 종류 | 오픈소스 CFD 툴박스 |
| 주요 배포판 | OpenFOAM Foundation / OpenCFD Ltd |
| 언어 | C++ |
| 라이선스 | GPL v3 |
| 최초 공개 | 2004년 |
| 플랫폼 | Linux (주력), Windows/macOS |
라이선스 비용은 0원이다. 대신 당신의 시간과 정신력으로 지불하게 된다.
OpenFOAM(Open Field Operation And Manipulation)은 C++로 작성된 오픈소스 전산유체역학 툴박스다. 정확히는 CFD 전용 프로그램이라기보다, 연속체 역학의 편미분방정식을 유한체적법으로 풀기 위한 라이브러리와 그 위에 구현된 솔버·유틸리티의 모음이다. 소스가 완전히 공개되어 있고 병렬 코어 수 제한이 없어, 학계와 산업계를 가리지 않고 상용 코드의 대안 혹은 보완재로 널리 쓰인다.
가격표에 0이 하나 적은 것이 아니라 아예 0원이라는 점 때문에 상용 코드 라이선스 비용에 시달리는 조직에게 구원처럼 보이지만, 공식 GUI가 없고 학습 곡선이 가파르다는 점에서 공짜 점심은 아니다.
처음 죽는 자리는 거의 정해져 있다. fvSchemes 에서 대류 div(phi,U) 를 Gauss linear 로 두면 유계가 없어 속도가 발산하고, Gauss upwind 로 바꾸면 잠잠해지는 대신 수치점성이 붙는다. 격자는 checkMesh 가 비직교각을 찍어 주는데, 최댓값이 70° 를 넘기면 비직교 보정 횟수를 올리고 그 위로 더 눕으면 격자를 다시 짜는 편이 빠르다. 이 두 군데를 보기 전에 잔차 창만 노려보면 오후가 통째로 사라진다. 공식 입문 케이스 cavity 가 이 순서를 통과의례로 만들어 둔 것이다.
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. 실무 팁
- 케이스 설정 파일의 문법을 잘 지키라. 오타 하나가 장문 에러로 이어진다.
- snappyHexMesh를 쓸 때는 격자 품질을 checkMesh로 반드시 확인하라.
- 병렬 실행 시 도메인 분할 품질이 수렴에 큰 영향을 준다.
- 커스텀 솔버를 만들 때는 기존 솔버를 복사해서 수정하는 것이 안전하다.
9. 커뮤니티
문서화 부족을 메우는 것은 커뮤니티다. CFD Online 포럼의 OpenFOAM 게시판은 20년치 시행착오의 아카이브로, 웨만한 에러 메시지는 검색하면 2009년쯤 같은 고통을 겪은 선배가 나온다. 그 외 OpenFOAM Wiki, 연례 OpenFOAM Workshop, 각종 대학 강의 자료가 사실상의 교과서 역할을 한다.
10. 관련 문서
11. Footnotes
이 문서의 주요 출처
의견을 반영할게요. 감사합니다.