11장 유체역학 계산: 배관과 마찰
이번 주의 도구: 도구⑧ 배관 압력강하 계산기
다음 상황을 생각해 보자. 어느 공장에서 반응기 냉각수 라인을 100 m 증설하기로 했다. 펌프 카탈로그에는 사양이 수십 종인데, 어느 것을 골라야 하는지는 결국 숫자 하나에 달려 있다. 물이 그 배관을 지나는 동안 마찰로 잃어버릴 압력이다.
이 값을 구하는 절차는 유체역학 교과서에 이미 있다. 유속으로 레이놀즈 수를 계산하고, Moody 선도에서 마찰계수를 눈으로 읽고, Darcy-Weisbach 식에 대입한다. 문제는 조건이 바뀔 때마다 이 3단계를 처음부터 되풀이해야 한다는 데 있다. 관 지름 후보가 5개, 유량 시나리오가 4개면 손계산 20번이다.
이번 주에 만드는 도구⑧은 이 반복을 함수 호출 한 번으로 줄인다. 그리고 이 장의 마찰계수에는 AI가 유난히 자주 틀리는 지점이 있다. 두 규약이 정확히 4배 차이로 갈리는 곳이다. 검증 루틴 3종을 실전에서 쓰게 된다.
- 레이놀즈 수로 층류와 난류를 판별하는 기준을 도입한다
- Darcy-Weisbach 식으로 배관 압력강하 계산을 형식화한다
- Colebrook 식·명시적 근사식·Moody 선도의 관계를 정리한다
- Darcy와 Fanning, 두 마찰계수 규약의 4배 함정을 검증 루틴으로 잡는다
- 도구⑧ 배관 압력강하 계산기를 만들고 고장 코드를 디버깅한다
이 장을 마치면 다음을 할 수 있다.
- 유체 물성과 배관 조건으로 레이놀즈 수를 계산하고 층류/난류를 판별할 수 있다.
- Darcy-Weisbach 식의 각 항을 단위까지 설명하고 압력강하를 계산할 수 있다.
- 흐름 영역에 맞는 마찰계수 식(64/Re, Colebrook, 명시적 근사)을 골라 쓸 수 있다.
- 생성 코드가 어느 마찰계수 규약을 쓰는지 코드만 읽고 판별할 수 있다.
- Moody 선도를 코드로 그리고 계산 결과를 그 위에 점으로 표시할 수 있다.
- 검증 루틴 3종으로 고장 난 압력강하 코드의 버그를 찾아 고칠 수 있다.
이번 주 실습에서는 §11.2~11.4의 식과 함수로 도구⑧ 배관 압력강하 계산기를 만든다(75분 타이머, 공개 지목 구술). 이번 실습은 시험2 전 마지막 mini practical이다. 다음 주 실습 슬롯이 곧 시험2이고, 규정 브리핑은 이번 주 이론 세션에서 한다(시험2 규정 전문은 12장 표 12-1). 특히 실습 11.6의 고장 코드 디버깅은 시험2의 문항 유형 그대로다.
11.1 레이놀즈 수: 층류와 난류
수도꼭지를 아주 조금만 열면 물줄기가 유리 막대처럼 매끈하게 떨어진다. 조금 더 열면 어느 순간 물줄기가 흐트러지고 표면이 거칠어진다. 같은 물, 같은 꼭지인데 흐름의 상태가 다르다.
앞의 매끈한 흐름처럼 유체가 층을 이루어 가지런히 미끄러지는 상태를 층류(laminar flow)라 한다. 뒤의 거친 흐름처럼 크고 작은 소용돌이가 뒤섞이며 나아가는 상태를 난류(turbulent flow)라 한다. 배관 안에서도 같은 두 상태가 나타나는데, 마찰로 잃는 압력의 계산법이 상태에 따라 완전히 달라진다. 그래서 압력강하 계산의 첫 단계는 언제나 "지금 흐름이 어느 쪽인가"라는 판별이다.
판별 기준은 무차원수 하나로 요약된다. 관 내 흐름에서 레이놀즈 수(Reynolds number, Re)를 다음과 같이 정의한다.
Re = ρ·v·D / μ (11.1)
여기서 ρ는 유체 밀도[kg/m³], v는 평균 유속[m/s], D는 관 내경[m], μ는 점도[Pa·s]다. 분자 ρvD는 유체가 하던 대로 밀고 나가려는 관성의 크기에, 분모 μ는 흐트러짐을 눌러 가지런히 만들려는 점성의 크기에 대응한다. 관성이 이기면 난류, 점성이 이기면 층류다.
정의했으면 단위부터 검산해 보자(검증 루틴 1종인 단위 체크다). Pa·s = kg/(m·s)이므로 식 (11.1)의 단위는
(kg/m³) · (m/s) · (m) / (kg/(m·s)) = 1
분자와 분모가 남김없이 지워진다. Re는 단위가 없는 무차원수다. 계산 결과에 단위가 남는다면 식을 잘못 옮긴 것이다.
경계값은 어디인가. 관 내 흐름에서는 Re < 2320이면 층류로, Re > 2320이면 난류로 판정한다. 임계값으로 2100을 쓰는 문헌도 있다. 실제 전이는 칼로 자르듯 일어나지 않기 때문에 문헌마다 관례가 조금씩 다르다. 이 책은 2320 기준으로 통일하고, 코드에 판별을 넣을 때는 어느 값을 썼는지 주석으로 남긴다.
예제 11.1-1 냉각수 흐름의 판별
25 °C의 물이 내경 D = 0.05 m인 배관을 흐른다. 평균 유속이 (a) 2.0 m/s, (b) 0.02 m/s일 때 각각 레이놀즈 수를 구하고 흐름 상태를 판별하라. 물성은 ρ = 994.6 kg/m³, μ = 8.93×10⁻⁴ Pa·s로 한다(§11.4의 물성 상관식 계산값).
식 (11.1)에 대입만 하면 되는 산술이므로 AI 없이 직접 계산한다(협업 사이클 ①~②만 해당). 손계산으로 기준값을 먼저 만들어 두어야 나중에 코드가 틀렸을 때 알아볼 수 있다.
(a) Re = 994.6 × 2.0 × 0.05 / (8.93×10⁻⁴) ≈ 1.11×10⁵. 2320보다 두 자릿수 크므로 난류다.
(b) 유속이 (a)의 1/100이므로 Re도 1/100이다. Re ≈ 1.11×10³ < 2320, 층류다.
답: (a) Re ≈ 1.1×10⁵, 난류 (b) Re ≈ 1.1×10³, 층류
- 단위: 본문에서 확인한 대로 모든 단위가 소거된다. Re는 무차원이다.
- 대조값: 자릿수 암산 1000 × 2 × 0.05 / 0.001 ≈ 10⁵로, 계산기 결과와 오더가 일치한다.
- 극한값: v → 0이면 Re → 0(정지 유체는 층류 극한), μ가 클수록(끈적할수록) Re가 작아져 층류 쪽이다. 물리 직관과 부합한다.
분석 물처럼 점도가 낮은 유체가 공정 규모의 관을 실용적인 유속으로 흐르면 Re는 대개 10⁴~10⁶에 놓인다. 난류가 기본값이다. 층류가 되려면 (b)처럼 유속이 cm/s 수준으로 느리거나, 관이 아주 가늘거나, 유체가 훨씬 끈적해야 한다. What-if: 같은 조건에서 점도가 물의 1000배인 시럽이라면 (a)는 어느 쪽이 되는지 계산해 보라.
- 같은 유속·같은 관에서 수온을 올리면 물의 Re는 커지는가, 작아지는가? (물의 점도는 온도가 오르면 감소한다)
- Re = 2500인 흐름을 층류식으로 계산하면 어떤 위험이 있는지 한 문장으로 설명하라.
11.2 Darcy-Weisbach 식: 마찰로 잃는 압력
유체가 관 벽을 스치며 흐르면 벽에는 흐름을 거스르는 마찰력이 걸린다. 이 마찰을 이기느라 흐름 방향을 따라 압력이 조금씩 낮아지는데, 길이 L인 구간에서 잃는 압력을 압력강하(pressure drop) Δp라 한다. 펌프는 정확히 이 값만큼을 보충해야 하므로, 압력강하 계산이 그대로 펌프 사양 계산이 된다.
관 내 흐름의 압력강하는 Darcy-Weisbach 식으로 계산한다.
Δp = λ · (L/D) · ρv2/2 (11.2)
식을 한 항씩 해부해 보자. ρv²/2는 흐르는 유체의 운동에너지를 압력 단위로 나타낸 양으로, 동압(dynamic pressure)이라 부른다. 단위를 확인하면 (kg/m³)·(m²/s²) = kg/(m·s²) = Pa로, 정확히 압력이다. L/D는 관이 지름의 몇 배만큼 긴가를 나타내는 무차원 기하 인자다. 길수록 마찰 구간이 길어 손실이 커지고, 굵을수록 벽의 영향이 옅어져 손실이 작아진다.
남는 것은 λ 하나다. 벽 마찰의 세기를 담는 이 무차원 계수를 마찰계수(friction factor)라 하고, 식 (11.2) 규약의 것을 특히 Darcy 마찰계수(Darcy friction factor)라 부른다. 식 (11.2)의 다른 항은 전부 문제 조건에서 바로 나오므로, 이 장의 나머지는 사실상 λ를 구하는 이야기다.
그런데 문헌에는 마찰계수가 두 종류 있다. 벽 전단응력을 동압으로 나눈 비를 Fanning 마찰계수(Fanning friction factor) fF라 하는데, 같은 물리를 다르게 정규화했을 뿐이라 두 계수는 정확히 4배 관계다.
λ = 4·fF (11.3)
층류 마찰계수가 Darcy 규약에서 64/Re, Fanning 규약에서 16/Re로 적히는 것이 이 4배의 흔적이다. 어느 쪽도 틀린 규약이 아니지만, 둘을 섞어 쓰면 계산이 어긋난다. Fanning 값 fF를 식 (11.2)에 넣으면 압력강하가 4배 작게 나오고, 그 값으로 고른 펌프는 4배 모자란다. 문헌·웹·AI 출력에서 마찰계수를 만나면 "층류식이 64/Re인가 16/Re인가"부터 확인한다. §11.4에서 AI가 정확히 이 지점에서 엇갈리는 사례를 본다.
- 식 (11.2)에서 유속을 그대로 두고 관 지름만 2배로 하면 L/D와 Re는 각각 어느 방향으로 변하는가?
- 어느 웹 문서의 마찰계수 상관식이 층류 극한에서 16/Re로 수렴한다. 이 상관식의 값을 식 (11.2)에 바로 넣어도 되는가?
11.3 마찰계수: Colebrook 식에서 Moody 선도까지
11.3.1 층류: 반복이 필요 없는 영역
층류(Re < 2320)의 마찰계수는 Poiseuille의 결과로 닫힌 식이 알려져 있다.
λ = 64 / Re (11.4)
식 (11.4)를 식 (11.2)에 대입하면 Δp = 32·μ·L·v/D²을 얻는다. 층류의 압력강하는 유속에 정비례하고, 밀도와 무관하며, 점도에 비례한다. 관성이 아니라 점성이 지배하는 영역답다.
11.3.2 난류: 조도가 등장한다
난류가 되면 사정이 복잡해진다. λ가 Re뿐 아니라 관 벽이 얼마나 거친가에도 의존하기 때문이다. 벽 요철의 대표 높이 ε[m]을 절대조도(absolute roughness), 그것을 관 지름으로 나눈 무차원비 ε/D를 상대조도(relative roughness)라 한다. 조도 값은 관의 재질과 상태에 따라 다르며 유체역학 교재나 제조사 자료의 표에서 조회한다(이 장의 문제에서는 조건으로 준다).
난류 마찰계수의 표준 관계식은 Colebrook-White 식(1937)이다.
λ = 1 / [ 2·log₁₀( 2.51/(Re·√λ) + 0.27·ε/D ) ]2 (11.5)
식 (11.5)를 잘 보면 이상한 점이 있다. 구하려는 λ가 우변 안에도 들어 있다. 이렇게 미지수를 좌변에 홀로 남기도록 대수적으로 풀 수 없는 식을 암시적 식(implicit equation)이라 하고, 답은 반복 계산으로 얻는다. 방법은 10장의 연립방정식 풀이보다 오히려 단순하다. 적당한 초기값을 우변에 넣어 새 λ를 얻고, 그 값을 다시 우변에 넣는 일을 값이 더 변하지 않을 때까지 되풀이한다. 이를 고정점 반복(fixed-point iteration)이라 한다.
import math
Re = 1.11e5 # 무차원 (예제 11.1-1의 난류 조건)
rel_rough = 0.001 # 무차원 (상대조도 ε/D)
lam = 0.02 # 초기 추측값 — Moody 선도 세로축의 중간쯤
for i in range(6):
rhs = 2.51 / (Re * math.sqrt(lam)) + 0.27 * rel_rough
lam = 1.0 / (2 * math.log10(rhs))**2
print(f"{i+1}회: lam = {lam:.6f}")
실행하면 네 번째 반복부터 소수 여섯째 자리까지 값이 멈춘다.
1회: lam = 0.022057
2회: lam = 0.021955
3회: lam = 0.021960
4회: lam = 0.021960
5회: lam = 0.021960
6회: lam = 0.021960
초기값이 아무 값이나 되는 것은 아니다. lam = 0.0으로 시작하면 √λ = 0으로 나누게 되어 다음 에러가 그대로 난다.
Traceback (most recent call last):
File "colebrook.py", line 8, in <module>
rhs = 2.51 / (Re * math.sqrt(lam)) + 0.27 * rel_rough
ZeroDivisionError: float division by zero
초기값은 물리적으로 그럴듯한 값이어야 한다. Moody 선도에서 난류 마찰계수는 대략 0.01~0.1 사이에 놓이므로, 그 중간인 0.02쯤이 안전한 출발점이다. 반복 계산의 초기값을 답이 있을 법한 범위에서 고르는 습관은 10장의 fsolve 초기 추측과 같은 원리다.
11.3.3 반복을 피하는 길: 명시적 근사식
매번 반복문을 돌리는 대신, 정확도를 조금 양보하고 한 번의 대입으로 끝나는 명시적 근사식(explicit approximation)을 쓸 수 있다. 매끈한 관(ε/D ≈ 0), 2320 < Re < 10⁵ 범위에서는 Blasius 식이 좋은 근사를 준다.
λ = 0.3164 · Re−0.25 (11.6)
조도까지 포함해 Re > 2320 전 영역을 덮는 것은 Swamee-Jain 식(1976)이다.
λ = 0.25 / [ log₁₀( ε/(3.7·D) + 5.75/Re0.9 ) ]2 (11.7)
식 (11.7)의 ε/(3.7·D)는 식 (11.5)의 0.27·ε/D와 같은 항이다(1/3.7 ≈ 0.27). 문헌마다 표기가 다를 뿐이다. 그리고 두 식 모두 로그의 밑과 상수가 한 세트다. 8장의 Antoine 상수에서 본 것과 같은 함정으로, 식 (11.7)을 자연로그 ln으로 쓰는 문헌은 상수도 0.25 대신 1.325를 쓴다. 식을 옮기며 로그 밑을 바꾸면 상수도 함께 바뀌어야 한다.
| 식 | 적용 영역 | 조도 | 형태 |
|---|---|---|---|
| (11.4) 64/Re | Re < 2320 | 무관 | 명시적 |
| (11.5) Colebrook-White | Re > 2320 | 포함 | 암시적(반복 필요) |
| (11.6) Blasius | 2320 < Re < 10⁵, 매끈한 관 | 불포함 | 명시적 |
| (11.7) Swamee-Jain | Re > 2320 전 영역 | 포함 | 명시적 |
도구⑧에는 어떤 식을 넣을까. 층류는 식 (11.4)로 확정이고, 난류는 식 (11.7)을 기본으로 쓰되 식 (11.5)를 반복으로 푼 값과 1% 이내로 일치하는지 대조한다. 예제 11.1-1의 난류 조건(Re = 1.11×10⁵, ε/D = 0.001)에서 식 (11.7)은 0.0221, 코드 11-1의 수렴값은 0.0220이다. 0.8% 차이로, 조도 값 자체의 불확실성보다 훨씬 작다.
11.3.4 Moody 선도: 식들의 지도
지금까지의 식을 전부 한 장의 그래프에 겹쳐 그린 것이 Moody 선도(Moody diagram, 1944)다. 가로축 Re, 세로축 λ를 모두 로그 눈금으로 잡고, 왼쪽에 층류 직선(64/Re)을, 오른쪽에 상대조도별 난류 곡선 가족을 그린다. 컴퓨터 이전 시대에는 이 선도에서 눈으로 λ를 읽었고, 지금도 계산값의 자릿수가 맞는지 한눈에 확인하는 지도로 쓴다.
로그-로그 그래프는 matplotlib에서 plt.plot 대신 plt.loglog를 쓰면 된다. 층류 직선만 먼저 그려 보자.
import numpy as np
import matplotlib.pyplot as plt
Re = np.linspace(500, 2320, 50) # 층류 영역 (무차원)
plt.loglog(Re, 64 / Re) # 두 축 모두 로그 눈금
plt.xlabel("Re")
plt.ylabel("Darcy friction factor")
plt.grid(True, which="both")
plt.show()
로그-로그 눈금에서 64/Re는 기울기 −1의 직선으로 나타난다. 난류 곡선 가족과 계산점 표시는 실습 11에서 직접 완성한다.
생각해보기 Re = 2320 바로 근처(이를테면 2200~2500)에서는 어느 식도 자신 있게 쓸 수 없다. 경계 지점인 Re = 2320에서 식 (11.4)는 0.0276, 식 (11.7)은 (ε/D = 0.001 기준) 0.0495를 준다. 값이 두 배 가까이 다르다. 실제 설계에서 이 구간의 흐름을 만나면 어떻게 대처할지 방법을 두 가지 제안해 보라. (힌트: 안전 여유라는 관점, 그리고 조업 조건을 바꾼다는 관점)
- Colebrook 식이 "암시적"이라는 말의 뜻을 한 문장으로 설명하라.
- 식 (11.6)을 Re = 10⁶인 흐름에 써도 되는가? 이유를 말하라.
11.4 AI 협업: 마찰계수 함수와 4배 함정
- 문제 정의
- 분해
- 프롬프트
- 생성 코드 읽기
- 테스트
- 화공 검증
도구⑧의 중심은 "Re와 상대조도를 받아 λ를 돌려주는 함수" 하나다. §11.2에서 규약이 두 가지임을 알았으므로, 프롬프트에 규약을 못 박는 것이 이번 장의 프롬프트 패턴이다.
배관 마찰계수를 계산하는 파이썬 함수를 만들어 줘. 입력은 레이놀즈 수와 상대조도(ε/D), 출력은 Darcy 마찰계수야. Re가 2320 미만이면 층류식 64/Re를 쓰고, 그 이상이면 Swamee-Jain 식을 써. Fanning이 아니라 Darcy 마찰계수라는 걸 docstring에 명시하고, Re가 0 이하이면 ValueError를 내게 해 줘. 주석은 한국어로.
import numpy as np
def darcy_friction_factor(Re, rel_rough=0.0):
"""Darcy 마찰계수를 반환한다 (Fanning의 4배 규약).
Re : 레이놀즈 수 (무차원)
rel_rough : 상대조도 ε/D (무차원), 기본값 0 = 매끈한 관
"""
if Re <= 0:
raise ValueError("Re는 양수여야 한다")
if Re < 2320: # 층류 (Poiseuille)
return 64.0 / Re
# 난류: Swamee-Jain 명시적 근사 (Re > 2320 전 영역)
arg = rel_rough / 3.7 + 5.75 / Re**0.9
return 0.25 / np.log10(arg)**2
✔ 로그 밑 확인: np.log10이므로 상수 0.25와 옳은 세트다. 층류 앵커: Re = 1000 입력 → 0.064 반환, λ·Re = 64 성립. 난류 대조: Re = 1.11×10⁵, ε/D = 0.001 → 0.02213, 코드 11-1의 Colebrook 수렴값 0.02196과 0.8% 차. 규약이 docstring에 명시됐고 Re ≤ 0 예외도 요구대로다.
생각해보기 실행해 보지 않고 함수 본문만 읽어서 어느 규약인지 판별할 수 있는 단서를 두 가지 찾아보라. (층류 분기의 상수, 그리고 난류식의 형태가 각각 단서가 된다)
검증을 마친 함수가 생겼으니 전체 계산을 조립하자. 물성과 조건을 대입하는 정도의 스크립트는 직접 쓴다. 무엇을 AI에게 시키고 무엇을 직접 할지 가르는 감각도 훈련의 일부다.
예제 11.4-1 냉각수 배관의 압력강하
25 °C의 물이 내경 D = 0.05 m, 길이 L = 100 m인 배관을 평균 유속 v = 2.0 m/s로 흐른다. 절대조도는 ε = 0.05 mm로 주어졌다. 압력강하를 구하라.
마찰계수는 검증을 마친 코드 11-3을 재사용한다. 물성은 사람이 책임진다. 아래 코드의 물 밀도·점도 상관식(코퍼스 pycse 수록, Polymath 문제집 8.8)을 쓰고, 값이 그럴듯한지는 검증 단계에서 도구④ 단위환산 + 물성 조회기로 교차 확인한다. 사이클 ①~③은 §11.4 앞부분에서 끝났으므로 여기서는 ④~⑥을 수행한다.
import numpy as np
from friction import darcy_friction_factor # 코드 11-3 (검증 완료)
T = 298.15 # K (25 °C)
# 물의 밀도·점도 상관식 (T는 K 단위 크기, 출처: pycse/Polymath 8.8)
rho = 46.048 + 9.418*T - 0.0329*T**2 + 4.882e-5*T**3 - 2.895e-8*T**4 # kg/m^3
mu = np.exp(-10.547 + 541.69 / (T - 144.53)) # Pa·s
D, L, v = 0.05, 100.0, 2.0 # m, m, m/s
eps = 0.05e-3 # m (절대조도 0.05 mm — mm→m 환산)
Re = rho * v * D / mu # 무차원
lam = darcy_friction_factor(Re, eps / D) # 무차원
dp = lam * (L / D) * 0.5 * rho * v**2 # Pa
print(f"rho={rho:.1f} kg/m3, mu={mu:.2e} Pa.s, Re={Re:.2e}")
print(f"lam={lam:.4f}, dp={dp/1000:.1f} kPa")
실행 결과는 다음과 같다.
rho=994.6 kg/m3, mu=8.93e-04 Pa.s, Re=1.11e+05
lam=0.0221, dp=88.0 kPa
답: Δp ≈ 88.0 kPa(= 0.880 bar)
- 단위: 입력이 전부 SI(ε는 mm → m 환산 확인), ρv²/2 = Pa이므로 Δp도 Pa다. 식 (11.2)와 일치한다.
- 대조값: 같은 조건을 Colebrook 반복(코드 11-1)으로 풀면 λ = 0.0220, Δp = 87.3 kPa로, 0.8% 이내 일치한다. 물성도 도구④ 조회값과 대조하라.
- 극한값: ε/D → 0으로 놓으면 λ = 0.0175, 매끈한 관의 Blasius 식 (11.6)이 주는 0.0173과 1% 이내다. 매끈한 관 극한이 맞물린다.
분석 계산 자체는 세 줄이고 지면 대부분이 검증에 쓰였다. 이 비율이 정상에 가깝다. 유속을 2배(4.0 m/s)로 올려 다시 돌리면 Δp는 335 kPa, 약 3.8배가 된다. 속도 제곱의 4배에 조금 못 미치는 이유는 Re가 커지면서 λ가 살짝 줄기 때문이다. What-if: 조도를 10배(0.5 mm)로 바꿔 재실행하고, λ와 Δp가 얼마나 커지는지, Moody 선도에서 계산점이 어느 곡선으로 옮겨 가는지 확인해 보라.
동시수강 중인 유체역학 과목과의 관계를 짚어 두자. 유체역학 강의가 이 식들의 유도와 물리를 담당한다면, 이 장은 같은 식을 "계산 가능한 형태"로 옮겨 도구로 굳히는 쪽을 담당한다. 종이 위의 Moody 선도에서 눈으로 λ를 읽는 훈련과, 그 선도를 코드로 그려 계산점을 얹는 훈련은 같은 내용의 양면이다. 이론 수업에서 새 상관식을 만나면 도구⑧에 분기 하나로 추가해 보라(도구를 함수로 만들어 둔 이유가 그것이다).
실습 11: 도구⑧ 배관 압력강하 계산기 (75분)
공개 지목 구술을 포함한다. 이번 실습은 시험2 전 마지막 리허설이고, 마지막 단계의 고장 코드 디버깅은 시험2 문항 유형 그대로다.
준비물
- Python + numpy/matplotlib 환경(5주차와 동일). 확인:
python -c "import numpy, matplotlib"가 아무 출력 없이 끝나면 정상. - 재사용: 도구④ 단위환산 + 물성 조회기의 물성 함수(물의 ρ, μ). CoolProp을 썼다면 그대로 import한다.
- 스타터 repo의
broken_pipe.py(실습 11.6 디버깅 연습용 고장 코드, 코드 11-5).
과제
- 실습 11.1 repo에
friction.py를 만들고, §11.4의 프롬프트 패턴으로 마찰계수 함수를 생성해 넣어라. (완료 확인: Re = 1000에서 0.064를 반환한다) 커밋하라. - 실습 11.2 층류 앵커(λ·Re = 64)와 난류 대조(Colebrook 반복값 대비 1% 이내)를 검사하는 테스트 2개를 AI에게 요청해
test_friction.py로 저장하고 pytest로 돌려라. (완료 확인: 2개 통과) 커밋하라. - 실습 11.3
pressure_drop(D, L, v, rho, mu, eps)함수를 만들어라. 물성은 도구④에서 가져온다. (완료 확인: 예제 11.4-1 조건에서 88.0 kPa ± 1%) - 실습 11.4 Moody 선도를 그려라: 층류 직선 + 상대조도 4종(0, 10⁻⁴, 10⁻³, 10⁻²)의 Swamee-Jain 곡선, 축은 loglog. (완료 확인:
moody.png가 저장된다) - 실습 11.5 예제 11.4-1의 계산점(Re, λ)을 선도 위에 별표로 표시하고, README에 그림과 검증 3종 기록을 넣어라. (완료 확인: 계산점이 ε/D = 10⁻³ 곡선 위에 놓인다) 커밋하라.
- 실습 11.6
broken_pipe.py에는 버그가 세 개 심어져 있다. 검증 루틴 3종을 무기로 전부 찾아 고치고, 각 버그가 어느 루틴에 걸렸는지 README에 한 줄씩 기록하라. (완료 확인: 예제 11.4-1 조건에서 옳은 값이 나온다) 커밋하라.
import math
def pressure_drop(D_mm, L, v, rho, mu, eps_mm):
"""배관 압력강하 [Pa]를 반환한다."""
D = D_mm # 관 내경
Re = rho * v * D / mu # 레이놀즈 수
if Re < 2320:
lam = 16.0 / Re # 층류 마찰계수
else:
arg = eps_mm / (3.7 * D) + 5.75 / Re**0.9
lam = 0.25 / math.log(arg)**2 # Swamee-Jain
return lam * (L / D) * 0.5 * rho * v**2
힌트를 하나만 준다. 예제 11.4-1 조건을 넣으면 88,033 Pa 대신 14.7 Pa가 나온다. 몇 배나 틀렸는지가 단서다.
완성 기준
- pytest 테스트 2개 이상 통과 (실습 11.2)
- 예제 11.4-1 조건에서 88.0 kPa ± 1% 재현 (실습 11.3)
moody.png+ 계산점 표시 (실습 11.4~11.5)- README에 검증 3종 기록 + 디버깅 리포트 3줄 (실습 11.6)
- 의미 있는 커밋 ≥ 4
판정은 통과/재도전 2단계다. 재도전은 다음 실습 전까지 허용된다.
막혔는가? 마찰계수 값이 이상할 때
AI에게 이렇게 물어라: "이 함수에 Re=1000을 넣으면 0.016이 나와. Darcy 마찰계수라면 얼마가 나와야 하고, 왜 다른지 후보 원인 3개를 말해 줘."
막혔는가? Moody 선도가 그려지지 않을 때
AI에게 이렇게 물어라: "matplotlib loglog로 여러 곡선을 겹쳐 그리는 최소 예제를 보여 줘. x는 2320부터 1e8까지 로그 간격 200점이야."
막혔는가? broken_pipe.py에서 에러 없이 값만 틀릴 때
AI에게 이렇게 물어라: "이 코드와 정답값(88.0 kPa)을 줄게. 내 결과가 몇 배 다른지부터 계산하고, 그 배율을 만들 수 있는 버그 후보를 나열해 줘." 배율이 단서다. 4배 차이가 나면 규약을, 1000배 차이가 나면 단위 환산을 의심하라.
퇴실 전 기록 오늘 만든 것·막힌 것·틀린 것 1건을 위키에 커밋해야 퇴실이다. 특히 broken_pipe.py에서 마지막까지 못 찾던 버그가 좋은 소재다.
요약
- S 11-1 Re = ρvD/μ (무차원). Re < 2320 층류, Re > 2320 난류. 이 책의 기준이며, 임계값은 문헌에 따라 다를 수 있다.
- S 11-2 Δp = λ(L/D)ρv²/2 (Darcy-Weisbach). λ = 4fF, 층류 앵커 λ·Re = 64.
- S 11-3 λ는 흐름 영역에 따라 고른다. 층류는 64/Re, 난류는 Swamee-Jain 식 (11.7)을 기본으로 하고 Colebrook 식 (11.5)의 반복 해와 1% 이내로 대조한다.
- S 11-4 프롬프트 패턴은 "규약을 못 박아라"이다. 출력이 Darcy인지 Fanning인지, 로그 밑이 무엇인지 프롬프트에 명시하고, 받은 코드는 층류 앵커로 검수한다.
| 층류 | 난류 | |
|---|---|---|
| 판별 | Re < 2320 | Re > 2320 |
| 마찰계수 | 64/Re (닫힌 식) | Colebrook(암시적) 또는 명시적 근사, ε/D에 의존 |
| 조도의 영향 | 없음 | 있음 |
| Δp의 유속 의존 | 정비례(∝ v) | 대략 제곱(예제 11.4-1에서 2배 유속 → 3.8배) |
| 공정 현장에서 | 드묾(저속·세관·고점도) | 기본값 |
이번 장의 수확은 식보다 경험이다. 예외 한 줄 없이 조용히 4배 틀리는 코드를, λ·Re = 64라는 앵커 하나로 잡아냈다. AI 협업 사이클의 ⑤ 테스트와 ⑥ 화공 검증이 이제 반사 신경에 가까워졌을 것이다. 도구 사다리는 ④ 물성 → ⑤ 증기압 → ⑥ T-xy → ⑦ 물질수지 → ⑧ 압력강하까지 올라왔다. 남은 것은 이 도구들을 시간 압박 아래에서 꺼내 쓰는 훈련이고, 그 자리가 시험이다.
용어 정리
- 층류(laminar flow)
- 유체가 층을 이루어 가지런히 미끄러지는 흐름 상태. 관 내 흐름에서 Re < 2320.
- 난류(turbulent flow)
- 소용돌이가 뒤섞이며 진행하는 흐름 상태. 공정 배관의 기본값.
- 레이놀즈 수(Reynolds number, Re)
- 관성과 점성의 비를 나타내는 무차원수, ρvD/μ. 층류/난류 판별 기준.
- 압력강하(pressure drop)
- 마찰 때문에 배관 구간에서 잃는 압력, Δp. 펌프가 보충해야 할 값.
- 마찰계수(friction factor)
- 벽 마찰의 세기를 담는 무차원 계수. Darcy 규약(λ)과 Fanning 규약(fF = λ/4)이 있다.
- Darcy 마찰계수(Darcy friction factor)
- 식 (11.2)에 그대로 들어가는 마찰계수. 층류에서 64/Re.
- Fanning 마찰계수(Fanning friction factor)
- 벽 전단응력을 동압으로 나눈 마찰계수. 층류에서 16/Re, Darcy의 1/4.
- 절대조도(absolute roughness)
- 관 벽 요철의 대표 높이 ε[m]. 재질·상태에 따라 표로 조회한다.
- 상대조도(relative roughness)
- 절대조도를 관 지름으로 나눈 무차원비 ε/D. 난류 마찰계수를 결정하는 인자.
- 암시적 식(implicit equation)
- 미지수를 좌변에 홀로 남기도록 정리할 수 없어 반복 계산이 필요한 식. Colebrook 식이 그 예다.
- 명시적 근사식(explicit approximation)
- 한 번의 대입으로 값이 나오도록 만든 근사식. Blasius, Swamee-Jain 식.
- 고정점 반복(fixed-point iteration)
- 초기값을 식의 우변에 넣어 얻은 값을 다시 우변에 넣기를 수렴할 때까지 되풀이하는 반복법.
- Moody 선도(Moody diagram)
- Re–λ 평면(로그-로그)에 층류 직선과 상대조도별 난류 곡선을 함께 그린 마찰계수 지도.
연습문제
Q군: 개념·읽기 (AI 없이 풀 것, 시험1 대비)
- Q11.1 다음 코드가 인쇄할 세 줄을 실행하지 말고 예측하라.
rho, mu = 994.6, 8.93e-4 # kg/m^3, Pa·s D = 0.05 # m for v in [0.01, 0.2, 2.0]: # m/s Re = rho * v * D / mu state = "laminar" if Re < 2320 else "turbulent" print(f"v={v}: Re={Re:.0f} -> {state}") - Q11.2 코드 11-3의
darcy_friction_factor의 목적과 동작을 한국어 2~3문장으로 설명하라(EiPE).rel_rough의 기본값 0.0은 물리적으로 어떤 관을 뜻하는가? - Q11.3 AI가 낸 다음 풀이를 채점하고 틀린 곳을 교정하라: "Re = 1500인 층류 흐름이므로 f = 16/1500 = 0.0107이고, 이것을 Δp = f·(L/D)·ρv²/2에 넣어 계산하면 된다." 검증 루틴 3종 가운데 어느 것이 이 오류를 잡는가?
P군: 제작·계산 (AI 사용 전제, 시험2·최종 시험 대비)
- P11.1 예제 11.4-1과 같은 배관에서, 학번 끝 두 자리를 XY라 할 때 유속 v = 1.X m/s, 조도 ε = 0.0Y mm로 바꿔 압력강하를 계산하고 검증 3종을 README에 기록하라.
- P11.2 열교환기에 물 2.5 L/s를 길이 100 m의 매끈한 관으로 보내야 한다. 25 °C에서 압력강하가 103 kPa를 넘지 않게 하는 최소 관 내경을 구하라. 지름이 유속과 Re를 함께 바꾸므로
fsolve로 푼다(10장 참조). 대조값: 같은 문제를 Fanning 규약 상관식으로 푼 문헌 풀이의 답은 0.0390 m다. 1% 안팎에서 일치해야 한다. - P11.3 도구⑧에 "경계 영역 리포트"를 붙여라: 2200 ≤ Re ≤ 2500이면 층류식과 난류식의 λ를 모두 계산해 경고 문구와 함께 큰 값을 쓰도록 하라. 그리고 이 계산기를 티 나지 않게 틀리게 만드는 방법을 두 가지 제시하고, 각각을 잡아내는 pytest 테스트를 작성하라.
위키 기록 과제 이번 주 의미 커밋 ≥ 1이 채점 지표다. 다음 3항을 커밋하라. ① 이 장 핵심 1페이지 정리(#seed): 식 (11.1)·(11.2)와 마찰계수 선택 기준을 본인의 말로. ② "내가 틀렸던 것" 1건: broken_pipe.py에서 마지막까지 못 찾은 버그와 잡은 순간의 화면 캡처. ③ 타 과목 연결 1건: 유체역학 강의 노트의 Moody 선도와 내 moody.png를 나란히 놓고 다른 점 한 가지.