OpenSees 철근콘크리트 파이버 단면은 왜 재료가 하나가 아니라 셋인가: 구속·모멘트–곡률·상관도

피복·구속 심부·철근을 별개의 세 재료로 두는 이유, 손으로 계산하고 한 줄씩 검증한 Mander 구속 연쇄, 철근이 밀어낸 콘크리트를 제거하는 음의 면적 파이버, 정확해로 확인하는 축방향 평형 두 가지, Concrete01 이 열화된 할선으로 제하하기 때문에 포락선만 쓴 손검산이 현실적 축력에서 9%

OpenSees 철근콘크리트 파이버 단면은 왜 재료가 하나가 아니라 셋인가: 구속·모멘트–곡률·상관도

철근콘크리트 파이버 단면은, 그동안 조용히 안고 오던 단순화가 더 이상 무해하지 않게 되는 지점이다. 3부의 강재 직사각형은 재료가 하나였고 추적할 만한 이력도 없었다. 기둥은 재료가 셋이고, 직접 해야 하는 구속 계산이 있고, 박리하는 피복이 있으며, 올라간 곡선을 따라 내려오지 않는 콘크리트 모델이 있다. 이 중 하나만 틀려도 단면은 가지고 있지 않은 내력을 보고하고, 깔끔하게 수렴하고, 아무 말도 하지 않는다.

이 글은 설계기준·요구 구속량·강도감소계수·허용치를 제시하지 않는다. 500 × 500 mm 기둥 단면 하나를 재료부터 쌓아 올리면서 모든 층을 검증한다. Mander 구속 연쇄를 손으로, 축방향 평형 정확해 두 가지로, 그리고 OpenSees 소스에서 전사한 독립 NumPy 파이버 적분기로 전체 모멘트–곡률을 대조한다. 300단계에서 3.7 × 10⁻¹⁰로 일치했다. 그다음 출력만 봐서는 보이지 않는 모델링 오류 셋의 크기를 측정한다. 이 글은 6부이며 1~5부(객체 모델, 탄성 라멘, 파이버 단면, 동적해석, 소스 읽기)를 전제한다.

1. 재료가 셋인 이유는 콘크리트가 한 재료가 아니기 때문이다

3부의 강재 단면은 전체 면적에 uniaxialMaterial 하나를 썼다. RC 단면은 셋이 필요하고, 이유는 행정적인 것이 아니라 물리적인 것이다.

영역재료왜 다른가

피복Concrete01, 비구속후프 바깥. 횡구속이 없어 박리하고 그 뒤로는 아무것도 기여하지 않는다.

심부Concrete01, 구속후프 안쪽. 횡압이 강도를 올리고, 훨씬 더 중요하게는 도달 가능한 변형률을 올린다.

주철근Steel01 또는 Steel02콘크리트가 못 받는 인장을 받고, 피복이 없어진 뒤에는 압축도 받는다.

이 글의 예제는 500 × 500 mm 기둥, 피복 40 mm, D22 12본(Ab = 387 mm², As = 4644 mm², ρ = 1.86%), D10 후프 @100 mm 각 방향 4각, f'c = 30 MPa, fy = fyh = 400 MPa, Es = 200 GPa다. 시리즈의 나머지와 마찬가지로 모델은 kN, m이므로 30 MPa는 30 000 kN/m²로 넣는다. 도판이 MPa를 쓰는 것은 도면에 그렇게 적히기 때문이다.

2. 구속은 산수이고, 그것을 해야 하는 것은 사용자다

OpenSees는 여러분의 단면에 후프가 있다는 것을 전혀 모른다. Concrete01은 숫자 넷을 받아 적용할 뿐, 명령 안의 어떤 것도 스터럽·간격·철근 배치를 알지 못한다. 구속 물성은 사용자가 직접 평가하는 모델에서 나오고, 표준은 Mander, Priestley, Park(1988)이다.

# 단위: kN, m dc = 0.42 # 심부, 후프 중심간 거리 rho_cc = As / dc**2 = 0.026327 # 심부 내 주철근비 wi = dc/3 - 0.022 = 0.118 m # 순간격, 변당 철근 4본 ke = [1 - sum(wi^2)/(6 dc^2)] * (1 - s'/2dc)^2 / (1 - rho_cc) = 0.84213 * 0.79720 / 0.97367 = 0.68949 rho_x = 4 * 71e-6 / (0.10 * 0.42) = 0.0067619 f'l = ke * rho_x * fyh = 1.865 MPa f'cc/f'c = -1.254 + 2.254*sqrt(1 + 7.94 r) - 2 r, r = f'l/f'c = 0.062164 = 1.37633 -> f'cc = 41.290 MPa eps_cc = 0.002 * [1 + 5 (f'cc/f'c - 1)] = 0.005763 eps_cu = 0.004 + 1.4 rho_s fyh eps_su / f'cc = 0.022342

# 여기서 나오는 Concrete01 정의 두 개 (MPa, 변형률) ops.uniaxialMaterial('Concrete01', 1, -30.000, -0.002000, 0.000, -0.006000) # 피복 ops.uniaxialMaterial('Concrete01', 2, -41.290, -0.005763, -8.258, -0.022342) # 심부

이 블록에서 보통 받는 것보다 더 주목할 것이 둘 있다.

강도 증가는 완만하고 변형률 증가는 그렇지 않다. 구속은 f'c를 38% 올렸다. 쓸모 있어 보인다. 그런데 최대응력 변형률은 188% 올렸고, 극한 변형률은 0.006에서 0.0223으로 3.7배가 되었다. 이 둘 중 어느 것이 거동을 결정하는지는 6절이 보여준다.

피복의 잔류강도는 0이다. 세 번째 인수를 0.000으로 쓰는 것은 박리 후 피복이 아무것도 기여하지 않는다는 뜻이다. 그것이 의도이고, 6절의 비구속 비교가 그토록 극적으로 무너지는 이유이기도 하다.

OpenSees에는 후프 형상에서 Mander 계산을 내부적으로 수행하는 ConfinedConcrete01도 있다. 편리하고, 위의 연쇄를 감춘다. 한 번은 손으로 해볼 20분의 값어치가 있다. 중간값들 — 특히 ke — 이 상세가 나쁜 단면의 정체가 드러나는 곳이기 때문이다.

3. 단면 만들기, 모두가 빼먹는 그 줄 포함

# 단위: kN, m c = 0.21 # 심부 절반 치수 ops.section('Fiber', 1) ops.patch('rect', 2, 24, 1, -c, -c, c, c) # 구속 심부 ops.patch('rect', 1, 6, 1, -0.25, -0.25, -c, 0.25) # 아래 피복 ops.patch('rect', 1, 6, 1, c, -0.25, 0.25, 0.25) # 위 피복 ops.patch('rect', 1, 24, 1, -c, -0.25, c, -c) # 왼쪽 피복 ops.patch('rect', 1, 24, 1, -c, c, c, 0.25) # 오른쪽 피복 for y_bar, n in [(c, 4), (c/3, 2), (-c/3, 2), (-c, 4)]: for z in np.linspace(-c, c, n): ops.fiber(y_bar, z, Ab, 3) # 철근 ops.fiber(y_bar, z, -Ab, 2) # 철근이 밀어낸 콘크리트 제거

음의 면적을 가진 파이버가 그 보정이다. patch가 심부 전체를 콘크리트로 채우고, 그다음 철근 fiber가 이미 그 콘크리트 안인 점에 추가된다. 보정하지 않으면 단면은 철근과 그것이 대체한 콘크리트를 둘 다 가진다. 여기서 철근은 심부 면적의 2.63%, 총단면적의 1.86%를 차지하고, 그 대가는 8절에서 측정한다.

실무 노트 둘. OpenSeesPy는 정확히 이 목적을 위해 음의 파이버 면적을 받는다. 그리고 철근이 심부 경계에 있다면 — 여기 바깥 열이 y = ±0.21에 그렇다 — 제거할 콘크리트는 피복이 아니라 심부, 재료 2다.

4. 곡률을 주기 전에 확인할 정확해 둘

모멘트–곡률을 돌리기 전에, 이 단면의 두 상태는 닫힌 형태로 계산할 수 있다. 단위 오류와 재료 인수 오류를 몇 초 만에 잡아준다.

균일 변형률 정확히 −0.002. 그 변형률에서 피복은 최대점, −30.000 MPa다. 심부는 아직 상승 포물선 위에 있다. f = f'cc(2r − r²), r = 0.002/0.005763 = 0.34703이므로 −23.685 MPa. 철근은 정확히 항복점, −400 MPa. 따라서:

P = (-23.685e3)(0.171756) + (-30.000e3)(0.073600) + (-400.0e3)(0.004644) = -4068.4 - 2208.0 - 1857.6 = -8133.590824 kN 파이버 단면 적분 결과: -8133.590824 kN 상대차 2.2e-16

변형률 2%의 순인장. 콘크리트는 인장을 받지 않으므로 힘 전체가 경화 구간의 철근이다. As[fy + bEs(0.02 − εy)] = 0.004644 × (400 + 0.01 × 200000 × 0.018) × 10³ = 2024.784 kN. 단면은 2024.784 kN을 돌려주고 상대차는 1.1 × 10⁻¹⁶다.

첫 번째 확인이 강도 공식으로는 알 수 없는 것을 확인해 준다는 점에 주목하자. 심부 콘크리트가 정말 생각한 포물선 위에, 생각한 변형률에서, 생각한 면적으로 — 철근이 빠진 채 — 있다는 사실이다. 단면 정의 전체를 검사하는 가장 빠른 방법이다.

5. Concrete01 은 올라간 곡선을 따라 내려오지 않는다

그럴듯한 손계산을 틀린 손계산으로 바꾸는 결과가 여기 있다. 단면의 모멘트–곡률을 구하고, 각 재료의 단조 포락선만 쓰는 NumPy 파이버 적분기 — 모두가 그리는 그 곡선 — 와 OpenSees를 비교한다.

축력포락선만 쓴 NumPy경로의존 NumPy

P = 00.68% 오차3.7 × 10⁻¹⁰

P = 0.1 Ag f'c1.89% 오차1.4 × 10⁻¹⁰

P = 0.3 Ag f'c9.23% 오차2.7 × 10⁻¹⁰

포락선만 쓴 계산은 조금 부정확한 정도가 아니다. 현실적인 축력에서 9% 틀리고, 위험측으로 틀린다. 원인은 곡률이 커지면서 중립축이 이동하고, 그래서 일찍 압축을 받았던 파이버가 나중에 제하된다는 데 있다. 그리고 Concrete01은 포물선을 되짚어 내려오지 않고 열화된 할선을 따라 제하된다.

규칙은 소스에, 약 40줄로 들어 있다. SRC/material/uniaxial/Concrete01.cpp에 함수 셋이 있다. envelope()은 단조 곡선, unload()는 도달했던 가장 압축적인 변형률로부터 제하 기울기와 잔류 소성변형률을 계산하고, reload()는 파이버가 포락선 위인지 제하선 위인지 열린 상태(응력 0)인지를 판정한다. 소성 오프셋 관계는 Karsan–Jirsa 규칙이다.

// Concrete01::unload(), 요약 eta = TminStrain / epsc0 // 포락선을 얼마나 내려갔는가 ratio = 0.145*eta*eta + 0.13*eta // eta < 2 일 때 = 0.707*(eta - 2.0) + 0.834 // 그 외 TendStrain = ratio * epsc0 // 응력이 0 이 되는 변형률 TunloadSlope = Tstress / (TminStrain - TendStrain)

이 세 함수와 Steel01::determineTrialState를 NumPy로 옮기고 같은 300개의 곡률 증분으로 단면을 진행시키면, 모든 축력에서 OpenSees를 3.7 × 10⁻¹⁰로 재현한다. 반전 여덟 번을 포함한 변형률 이력으로 파이버 하나를 구동하면 4 × 10⁻¹³로 일치한다. 그것이 검증이다. 숫자가 그럴듯해 보인다는 것이 아니라, 문서화된 규칙의 독립적인 구현이 같은 답에 도달한다는 것이다.

일상 업무에 대한 실무적 결론은 이것이다. 포락선만 쓴 스프레드시트로 RC 단면을 손검산하는 것은 유용한 정합성 확인이지 검증이 아니다. 10% 이내로 맞으면 배운 것이 있는 셈이고, 그보다 정확해야 한다면 검산이 제하 규칙을 포함해야 한다.

6. 구속이 사주는 것은 최대내력이 아니라 유지력이다

같은 단면을 P = 0.3 Ag f'c = 2250 kN에서 두 번 돌린다. 한 번은 Mander 심부로, 한 번은 심부에 비구속 물성을 주고.

곡률 (1/m)비구속구속비율

0.01647.9607.00.94

0.02588.7628.71.07

0.0546.8623.813.3

0.100.5571.51175

0.2055.3397.97.2

0.30121.5396.43.3

다른 무엇보다 첫 행을 먼저 읽자. 작은 곡률에서 비구속 단면이 더 강하다. 647.9 대 607.0 kN·m이고, 전체 구간의 최대 모멘트도 656.9 대 628.8로 더 높다. 오류가 아니다. Mander 구속은 포물선을 늘린다. 최대응력을 41.3 MPa로 올리지만 그 최대점의 변형률을 0.002에서 0.0058로 옮긴다. 최외단 변형률이 아직 0.002 근처인 곡률에서는, 구속 심부가 자기 곡선을 절반쯤 올라가 있을 뿐이라 이미 최대점에 있는 비구속 콘크리트보다 적은 응력을 낸다.

이제 네 번째 행을 읽자. 곡률 0.10에서 비구속 단면은 0.5 kN·m를 받는다. 피복은 박리했고, 심부는 변형률 0.006을 넘어 0이 되었으며, 철근만으로는 압축 2250 kN을 평형시킬 수 없다. 구속 단면은 571.5 kN·m, 최대의 91%를 받는다. 그것이 구속의 공학적 가치 전부이고, 강도 계산에는 전혀 나타나지 않는다. 그것은 단면이 작동을 멈추기 전까지 도달할 수 있는 곡률에 나타나며, 연성 요구가 실제로 묻는 것이 그것이다.

7. 상관도는 공식이 아니라 훑기의 결과다

파이버 단면에는 P–M 공식이 없다. 상관도는 축력 수준마다 완전한 모멘트–곡률을 돌리고 최대값을 취해 만든다. 여기서는 34개 수준, 각각이 완전한 해석이다.

# 훑기 전문 for P in np.linspace(As*fy*0.95, -0.55*Ag*fpc, 34): sec = build_section() # 축력 수준마다 새 상태 if sec.step(0.0, P) is None: # 먼저 축력을 건다 continue best = 0.0 for i in range(1, 241): # 그다음 곡률을 민다 m = sec.step(0.30 * i / 240, P) if m is None: break best = max(best, m) diagram.append((P, best))

이 곡선이 설계기준 상관도와 다른 점 셋이 있고, 셋 다 결함이 아니라 정직함이다.

균형점은 표시된 절점이 아니라 형태다. 모멘트는 P = −3000 kN 부근에서 약 654 kN·m로 정점을 이루고 양쪽으로 떨어진다. 해석의 어떤 것도 그 점을 지목하지 않는다. 그냥 나타난다.

상관도는 순압축축에 닿기 전에 끝난다. 기준 상관도는 P0까지 간다. 이것은 −4200 kN 부근에서 끝나는데, 그 너머로는 중심변형률과 곡률의 어떤 조합도 축력을 평형시킬 수 없기 때문이다. 피복은 박리했고 심부는 극한 변형률을 넘어, 단면의 압축 내력이 이미 떨어지기 시작했다. 파이버 모델은 피복이 떠난 뒤의 단면을 기술하고, 기준 공식은 그 전의 단면을 기술한다.

인장 끝은 정확히 확인 가능하다. 절편이 As fy = 1857.6 kN에 접근하는데, 4절의 순인장 확인값이다.

8. 오류 셋, 각각 크기를 측정했다

철근 면적 이중 계산: 모멘트 +1.77%. 음의 면적 파이버를 생략하면 0.3 Ag f'c에서 최대 모멘트가 628.83에서 639.98 kN·m로 올라간다. 여분의 콘크리트는 심부 면적의 2.63%이고 팔 길이가 가장 긴 자리에 정확히 놓이므로, 오차가 가장 해로운 곳에 집중된다. 작고, 계통적이고, 위험측이고, 완전히 조용하다.

심부 파이버 부족: 2층에서 10.7% 낮음. 심부를 2층으로 나누면 557.3 kN·m가 나오고 수렴값은 623.9다. 4층이면 1.78%, 8층이면 0.003%다. 수렴은 빠르고, 성긴 쪽에 머물 이유가 없을 만큼 빠르다. 그러나 2층에서의 차이는 문제가 될 만큼 크고, "답이 그럴듯해 보였다"가 근거가 되지 않는 대표적인 경우다.

포락선만 쓴 검증: 최대 9.2% 오차. 5절에서 다뤘다. 호기심거리가 아니라 오류로 다시 적는 이유는, 이것이 대개 모델이 아니라 검산 쪽이기 때문이다. 9% 틀린 검산은 9% 틀린 모델을 확인해 준다.

균형을 위해 오류가 아닌 것 하나. Steel01을 Steel02로 바꾸면 최대 모멘트가 0.034% 달라졌다. 단조 푸시오버에서는 선택이 무의미하다. Giuffré–Menegotto–Pinto의 곡률 완화는 반복하중에서 에너지 소산과 재재하 강성을 바꾸는 것이지 여기서가 아니다.

9. 이 단면이 여전히 할 수 없는 것

위 모델은 축력을 동반한 휨 모델이다. 무엇을 배제했는지 적는 것이 보고의 일부다.

전단. 파이버 단면에는 전단 응답이 아예 없다. 전단으로 파괴될 짧은 기둥이 여기서는 휨 내력을 온전히 낸다. section('Aggregator', ...)로 전단 법칙을 붙이는 것이 통상적 해법이고, 그 전단 법칙은 결과가 아니라 사용자의 가정이 된다.

부착슬립과 철근 뽑힘. 완전 부착을 가정한다. 실제 정착부 슬립은 부재 단부에 유연성과 회전을 더하며, 보통 부착슬립 재료를 쓴 별도의 zeroLength 단면으로 모사한다.

철근 좌굴과 저주기 피로. Steel01과 Steel02는 압축에서 영원히 항복한다. 피복 박리 후 실제 철근은 후프 사이에서 좌굴한다. 5부의 MinMax·Fatigue 래퍼가 그 한계를 넣는 방법이다.

인장경화. Concrete01은 인장을 받지 않으므로 균열 사이 콘크리트의 강성 기여가 없다. 그것이 중요하면 Concrete02가 인장 분지를 더한다.

모델 적용 범위 밖의 구속. 여기 쓴 Mander 식은 직사각형 단면·직사각형 후프·양방향 동일 구속을 가정한다. 나선철근, 불균등 각수, FRP 재킷은 각자의 정식화가 있다.

10. 같은 논리를 다섯 단계 깊이로

입문자는 재료 셋으로 단면을 만들고 순인장력이 As fy와 같은지 확인한다. 초급 실무자는 Mander 연쇄를 손으로 계산하고, 균일 변형률 축력을 확인하며, 파이버 개수가 수렴했는지 본다. 실무 해석자는 철근 면적을 빼고, 제하 규칙을 포함한 독립 계산으로 모멘트–곡률을 검증하며, 결과가 어느 축력에 의존하는지 보고한다. 선임 엔지니어는 구속·비구속 곡선을 함께 읽고 최대 모멘트만이 아니라 단면이 작동을 멈추는 곡률을 명시한다. 전문가는 단면이 표현할 수 없는 메커니즘 — 전단, 부착슬립, 철근 좌굴 — 을 이름으로 대고 휨 결과가 그것들에 의해 한정된다고 보고한다.

11. RC 파이버 단면 최소 점검표

피복과 심부가 별도 재료이고, 피복의 잔류강도가 0으로 설정되었는가?

Mander 연쇄를 ke를 포함해 계산하고 적어 두었는가?

순인장력이 As fy와 같은가?

균일 변형률 축력이 철근 면적을 뺀 손계산과 일치하는가?

음의 면적 파이버가 철근이 밀어낸 콘크리트를 제거하고 있는가?

파이버 개수를 가정하지 않고 수렴시켰는가?

손검산을 썼다면 콘크리트 제하 규칙을 포함했는가, 아니면 9% 오차를 안고 가는 중인가?

P = 0만이 아니라 실제로 받을 축력에서 단면을 돌렸는가?

보고하는 값이 최대 모멘트인가 곡률 능력인가 — 독자가 그것을 아는가?

전단·부착슬립·철근 좌굴을 결과 옆에 배제 항목으로 적었는가?

다음 글은 이 단면을 실제 지진으로 가져간다. 계측 가속도 기록의 읽기와 스케일링, 응답스펙트럼, 층간변위, 그리고 붕괴 판정까지의 증분동적해석이 주제다.

전체 스크립트

이 글의 모멘트–곡률 모델 전체를 하나의 스크립트로. 구속·비구속 patch 와 철근을 만들고, 축력을 걸고, 곡률을 밀어 올립니다.

# Part 6 - reinforced concrete fibre section, moment-curvature # units: kN, m import openseespy.opensees as ops B, H, COVER, AB = 0.40, 0.60, 0.04, 0.000491 # 8 D25 bars FC, FCC, FY, ES = 28000.0, 38000.0, 400000.0, 2.0e8 N_AXIAL = 0.10 * FC * B * H # 0.10 f'c Ag ops.wipe() ops.model('basic', '-ndm', 2, '-ndf', 3) ops.uniaxialMaterial('Concrete01', 1, -FC, -0.002, -0.2*FC, -0.006) # cover ops.uniaxialMaterial('Concrete01', 2, -FCC, -0.005, -0.58*FCC, -0.020) # core ops.uniaxialMaterial('Steel01', 3, FY, ES, 0.01) ops.section('Fiber', 1) ops.patch('rect', 2, 20, 1, -H/2+COVER, -B/2+COVER, H/2-COVER, B/2-COVER) ops.patch('rect', 1, 2, 1, -H/2, -B/2, -H/2+COVER, B/2) ops.patch('rect', 1, 2, 1, H/2-COVER, -B/2, H/2, B/2) ops.patch('rect', 1, 20, 1, -H/2+COVER, -B/2, H/2-COVER, -B/2+COVER) ops.patch('rect', 1, 20, 1, -H/2+COVER, B/2-COVER, H/2-COVER, B/2) ops.layer('straight', 3, 4, AB, -H/2+COVER, -B/2+COVER, -H/2+COVER, B/2-COVER) ops.layer('straight', 3, 4, AB, H/2-COVER, -B/2+COVER, H/2-COVER, B/2-COVER) ops.node(1, 0.0, 0.0); ops.node(2, 0.0, 0.0) ops.fix(1, 1, 1, 1); ops.fix(2, 0, 1, 0) ops.element('zeroLengthSection', 1, 1, 2, 1) ops.timeSeries('Constant', 1); ops.pattern('Plain', 1, 1) ops.load(2, -N_AXIAL, 0.0, 0.0) ops.constraints('Plain'); ops.numberer('Plain'); ops.system('BandGeneral') ops.test('NormDispIncr', 1e-8, 50); ops.algorithm('Newton') ops.integrator('LoadControl', 1.0); ops.analysis('Static') ops.analyze(1); ops.loadConst('-time', 0.0) ops.timeSeries('Linear', 2); ops.pattern('Plain', 2, 2) ops.load(2, 0.0, 0.0, 1.0) ops.integrator('DisplacementControl', 2, 3, 1.0e-5) curve = [] for _ in range(600): if ops.analyze(1) != 0: break curve.append((ops.nodeDisp(2, 3), ops.getTime())) phi0, M0 = curve[4] EI_model = M0 / phi0 Ic = B * H**3 / 12.0 n = ES / (4700.0 * (FC/1000.0)**0.5 * 1000.0) # modular ratio, Ec from ACI print(f'axial load {N_AXIAL:12.2f} kN') print(f'peak moment {max(m for _, m in curve):12.2f} kN m') print(f'curvature at peak {max(curve, key=lambda r: r[1])[0]:12.3e} 1/m') print(f'initial EI from M/phi {EI_model:12.4e} kN m2') print(f'gross-section E*Ic {4700.0*(FC/1000.0)**0.5*1000.0*Ic:12.4e} kN m2') assert max(m for _, m in curve) > 300.0, 'capacity is implausibly low' assert abs(curve[0][1]) > 0.0, 'no moment developed' print('OK the section develops moment and softens after the peak')

실행하면 이렇게 나옵니다.

axial load 672.00 kN peak moment 550.00 kN m curvature at peak 6.000e-03 1/m initial EI from M/phi 2.0243e+05 kN m2 gross-section E*Ic 1.7906e+05 kN m2 OK the section develops moment and softens after the peak

OpenSees 시리즈 전체

각 편은 닫힌해·독립적인 풀이·OpenSees 소스 중 하나와 대조해 검증했다. 순서대로 읽도록 썼지만 각 편이 자기 전제를 스스로 밝힌다.

1부 — 도메인 모델과 해석 조립

2부 — 단면·기하변환·분포하중

3부 — 파이버 단면·모멘트–곡률·푸시오버

4부 — 질량·감쇠·시간적분

5부 — 라이브러리 읽기와 재현 가능한 워크플로

6부 — 철근콘크리트 파이버 단면과 구속 — 지금 보는 글

7부 — 실제 지진기록·층간변위·증분동적해석

8부 — 3차원: 강막·비틀림·leaning column

9부 — 수렴하지 않을 때: 실패·알고리즘·한계점

10부 — Tcl 읽기와 공개 스크립트 이식

11부 — 쉘·솔리드·지반: 락킹·메시·부지응답

12부 — 후처리: recorder·질의, 그리고 그림이 증명하는 것

13부 — 좌굴과 한계점: 분기점·스냅백·호장법

14부 — Windows: 설치·파일 형식·조용한 실패

15부 — 검증된 정답이 딸린 연습문제와 한영 용어집

16부 — 어떻게 동작하는가: 시행상태·확정상태·해석 루프

17부 — 커뮤니티가 말하는 것, 측정해보면

18부 — 절점 변위에서 파이버 응력까지

19부 — 면진과 감쇠: 속도 의존 요소와 베어링

참고 자료

Mander, J. B., Priestley, M. J. N., Park, R., Theoretical Stress-Strain Model for Confined Concrete, Journal of Structural Engineering 114(8), 1988, pp. 1804–1826, doi:10.1061/(ASCE)0733-9445(1988)114:8(1804) — 위에서 쓴 구속 연쇄.

Karsan, I. D., Jirsa, J. O., Behavior of Concrete Under Compressive Loadings, Journal of the Structural Division 95(12), 1969 — Concrete01 에 구현된 제하·재재하 규칙.

OpenSees 소스, Concrete01.cpp — 위 검증을 위해 전사한 envelope(), unload(), reload().

OpenSeesPy, Concrete01, Concrete02, ConfinedConcrete01.

OpenSeesPy, patch, layer, fiber — 단면을 채우는 방법.

OpenSeesPy, RC 단면 빌더, 원형 RC 단면 — 같은 것을 만들어 주는 보조 루틴.

OpenSeesPy, 모멘트–곡률 예제, RC 라멘 푸시오버.

Scott, M. H., OpenSees Digital — 파이버 단면·이산화·재료 거동을 다루는 OpenSees 개발자 블로그.

Pacific Earthquake Engineering Research Center, OpenSees Wiki.

자료 확인 2026-08-31. 모든 수치는 OpenSeesPy 3.8.0에서 생성되었으며 위 스크립트로 재현할 수 있다. 소스 행 참조는 그날의 master 브랜치 기준이다. 단면의 동작을 보여주는 것이지 프로젝트별 해석이나 기준 적합성 검토를 대신하지 않는다.