절점 변위에서 파이버 응력까지: OpenSees 내부의 변환 네 번
캔틸레버 선단을 6 mm 움직이면 OpenSees 는 그것을 손으로 검증할 수 있는 네 번의 변환을 거쳐 파이버 응력 100,000 kPa 로 바꾼다. 요소는 강체운동을 걷어내므로 v1 = theta1 + ux/L 이고, 강체운동은 정확히 0 의 힘을 준다. 힘기반 요소는 모멘트를 정확히 보간하므로 Lo
3 m 캔틸레버의 선단을 6 mm 움직이면 OpenSees는 그것을 네 번의 변환을 거쳐 파이버 응력 100,000 kPa로 바꿉니다. 그 네 변환 전부를 종이에 적어 검증할 수 있습니다. 16부가 시간축 — 시행상태가 확정상태가 되는 과정 — 을 따라갔다면, 이 글은 공간축을 따라갑니다. 절점의 숫자 하나가 단면 안 한 점의 숫자가 되는 과정입니다. 프레임워크를 이해하는 나머지 절반이고, 정확한 법칙 둘과 계통적인 함정 하나가 여기 삽니다.
아래는 전부 OpenSeesPy 3.8.0에서, 0.30 × 0.50 m 탄성 직사각형 파이버 단면과 E = 2 × 10⁸ kPa, Gauss–Lobatto 5점을 쓴 3 m forceBeamColumn에서 측정했습니다.
1. 사슬
단계질의값
절점nodeDisp(2)ux = 0.0060000000 m, θ = −0.0030000000 rad
요소, 기본계basicDeformation(1)0, +0.00200000, −0.00100000
단면, 1번 점sectionDeformation(1,1)ε₀ = 0, κ = −0.00200000 1/m
y = +0.25 의 파이버평면유지ε = −y κ = +5.000000 × 10⁻⁴
재료getStress()+100,000.0000 kPa
화살표 넷. 첫째는 운동학, 둘째는 보간, 셋째는 가정이고, 물리는 넷째뿐입니다. 이 넷을 구분하는 것이 파이버 모델 디버깅의 대부분입니다.
2. 절점에서 기본계로: 요소는 강체운동을 버린다
요소는 자기가 어디 있느냐에 따라 달라지는 힘을 가질 수 없습니다. 얼마나 변형했느냐에만 달려 있어야 합니다. 그래서 모든 요소가 가장 먼저 하는 일이 절점 변위에서 강체 성분을 걷어내는 것입니다. 2D 보-기둥이면 축방향 하나와 회전 둘, 세 숫자가 남고 그것이 basicDeformation이 보고하는 값입니다.
선단 ux선단 회전축방향v₁v₂
0.00600.00000+0.002000+0.002000
0.0000+0.003000.000000+0.003000
0.0060−0.00300+0.002000−0.001000
세 줄이면 규칙을 읽어낼 수 있습니다.
v1 = theta_1 + ux / L v2 = theta_2 + ux / L
ux/L이 현 회전, 즉 강체 성분입니다. 남는 것이 변형입니다. 첫 줄만으로도 요점이 드러납니다. 선단이 6 mm 움직였고 회전은 하지 않았는데 두 기본회전이 같은 0이 아닌 값입니다. 양 단부가 회전하지 않은 부재 아래에서 현이 회전했기 때문입니다.
요소 출력을 처음 볼 때 걸려 넘어지는 지점의 실체가 이것입니다. 강체운동은 v = 0을 만들고 따라서 힘도 0입니다. 변위가 아무리 커도. 기구(mechanism)가 거대한 힘이 아니라 특이행렬을 주는 이유이고, 평형을 대조할 올바른 양이 basicForce인 이유입니다. 12부가 그것이 2.8 × 10⁻¹⁴로 닫히는 것을 측정했습니다.
3. 기본계에서 단면으로: 푸는 게 아니라 보간이다
점x / Lκ (1/m)M (kN·m)
10.000000−0.00200000−1249.2187
20.172673−0.00165465−1033.5122
30.500000−0.00100000−624.6094
40.827327−0.00034535−215.7066
51.0000000.000000000.0000
둘째 줄을 손으로 확인해보십시오. −0.002 × (1 − 0.172673) = −0.00165465. 정확합니다. 모멘트가 선형이므로 곡률도 요소를 따라 선형이고, forceBeamColumn은 힘을 정확히 보간합니다. "힘기반"이라는 말의 뜻이 그것이고, 2부에서 변위기반 요소 여럿이 필요한 자리에 힘기반 하나면 충분했던 이유입니다.
5번 점은 모멘트가 없으므로 곡률도 없습니다. 그래도 Lobatto 가중치 0.05(12부)로 적분되고, 캔틸레버의 "끝"에 건 단면 recorder가 0을 보고하는 이유가 이것입니다. 캔틸레버의 끝은 모멘트가 없는 곳입니다.
4. 단면에서 파이버로: 유일한 가정
eps(y) = eps0 - y * kappa = 0 - (+0.25) * (-0.00200000) = +5.000000e-04 -> sigma = E eps = +100 000.0000 kPa
이것이 사슬 전체에서 유일한 모델링 가정이고, OpenSees가 그것을 검증하지 않는다는 점은 분명히 해둘 값어치가 있습니다. 파이버 단면이 곧 그 가정입니다. 전단변형, 뒤틀림, 부착슬립, 국부좌굴은 전부 그 밖에 삽니다. 파이버 모델이 실험과 어긋날 때 대개 이 줄이 이유이고, 메시를 아무리 조밀하게 해도 도움이 되지 않습니다.
이 단계에서 단면 객체가 하는 일도 보십시오. 산수 말고는 없습니다. ε₀와 κ를 파이버에 나눠주고, 각 재료에 응력을 묻고, 더합니다. 그것이 돌려주는 강성은 파이버에 대한 E·A·y²의 합이고, 그래서 두 법칙으로 이어집니다.
5. 첫 번째 법칙: 단면의 EI는 여러분이 계산한 EI가 아니다
모멘트를 받는 네 점 중 아무 데서나 모멘트를 곡률로 나누면 같은 수가 나옵니다.
M / kappa = 624 609.375 모든 적분점에서 E b h^3/12 = 625 000.000 비 = 0.999375 = 1 - 1/40^2
12부는 sectionStiffness에 직접 물어 이 법칙을 얻었습니다. 여기서는 요소가 보고하는 두 양의 비에서, 깊이 방향 파이버 40개로, 스스로 나타납니다. 같은 법칙을 반대편에서 본 것이고, 양쪽이 서로 다른 곳에서 오는 검사의 좋은 예입니다.
6. 두 번째 법칙: 최외단 파이버를 요청하면 그 옆의 것을 준다
파이버 응답을 기록하는 표준 방법은 좌표를 지정하는 것입니다.
ops.eleResponse(1, 'section', 1, 'fiber', str(H/2), str(B/2), 'stressStrain')
파이버 40개, H = 0.5 m에서 이것이 돌려준 변형률은 4.875 × 10⁻⁴였고, 평면유지가 표면에서 주는 값은 5.000 × 10⁻⁴입니다. 2.5% 낮습니다. 오류가 아닙니다. eleResponse는 여러분이 물은 좌표에 도심이 가장 가까운 파이버를 돌려주고, 최외단 도심은 언제나 표면에서 파이버 반 개만큼 안쪽입니다.
파이버보고된 변형률오차실효 yH/2 − 파이버 반 개
43.750 × 10⁻⁴−25.00%0.1875000.187500
104.500 × 10⁻⁴−10.00%0.2250000.225000
204.750 × 10⁻⁴−5.00%0.2375000.237500
404.875 × 10⁻⁴−2.50%0.2437500.243750
1004.950 × 10⁻⁴−1.00%0.2475000.247500
오차는 정확히 −100/n 퍼센트이고, 실효 높이는 모든 개수에서 정확히 H/2에서 파이버 두께의 절반을 뺀 값입니다. 가져갈 것이 둘입니다.
파이버 10개로 "최외단 콘크리트 파이버"를 기록하면 표면값보다 10% 낮은 변형률이 보고됩니다. 압괴변형률 0.003과 비교하고 있다면, 그것은 도달했느냐 아니냐의 차이입니다.
두 파이버 법칙은 반대 방향으로, 서로 다른 속도로 작용합니다. 단면은 1/n²만큼 물러지고, 보고된 최외단 변형률은 1/n만큼 작아집니다. 파이버 10개면 강성에 1%, 변형률에 10%입니다. 필요한 파이버 수는 강성이 아니라 무엇을 읽으려 하느냐가 정합니다.
해결책은 무작정 조밀하게 하는 게 아닙니다. 표면 변형률이 필요하면 정확한 단면 변형에서 계산하십시오.
eps0, kappa = ops.sectionDeformation(ele, ip) eps_surface = eps0 - (H/2) * kappa # 정확. 파이버 수와 무관
7. 사슬 전체를 하나의 스크립트로
# units: kN, m import openseespy.opensees as ops B, H, E, L = 0.30, 0.50, 2.0e8, 3.0 NFIB = 40 ops.wipe() ops.model('basic', '-ndm', 2, '-ndf', 3) ops.uniaxialMaterial('Elastic', 1, E) ops.section('Fiber', 1) ops.patch('rect', 1, NFIB, 4, -H/2, -B/2, H/2, B/2) ops.node(1, 0.0, 0.0) ops.node(2, 0.0, L) ops.fix(1, 1, 1, 1) ops.geomTransf('Linear', 1) ops.beamIntegration('Lobatto', 1, 1, 5) ops.element('forceBeamColumn', 1, 1, 2, 1, 1) ops.timeSeries('Linear', 1) ops.pattern('Plain', 1, 1) ops.load(2, 1.0, 0.0, 0.0) ops.constraints('Plain'); ops.numberer('Plain'); ops.system('BandGeneral') ops.test('NormDispIncr', 1e-12, 20); ops.algorithm('Newton') ops.integrator('DisplacementControl', 2, 1, 0.006) ops.analysis('Static') ops.analyze(1) # --- the chain, level by level print('1 node ', [f'{ops.nodeDisp(2, i):.10f}' for i in (1, 2, 3)]) print('2 basic ', [f'{v:.8f}' for v in ops.basicDeformation(1)]) eps0, kappa = ops.sectionDeformation(1, 1) print('3 section ', f'eps0 {eps0:.10f} kappa {kappa:.8f}') eps = eps0 - (H/2) * kappa print('4 fibre ', f'{eps:.6e} (exact, from plane sections)') print('5 stress ', f'{E * eps:.4f} kPa') # and the two laws M = ops.sectionForce(1, 1)[1] print(' EI ratio', f'{(M/kappa) / (E*B*H**3/12):.6f} against 1 - 1/{NFIB}^2 =' f' {1 - 1/NFIB**2:.6f}') got = ops.eleResponse(1, 'section', 1, 'fiber', str(H/2), str(B/2), 'stressStrain') print(' lookup ', f'{100*(got[1]-eps)/eps:+.2f}% against -100/{NFIB} =' f' {-100/NFIB:+.2f}%')
이 페이지에서 그대로 복사해 돌리면 이 글의 근거 전체가 일곱 줄로 나옵니다.
1 node ['0.0060000000', '0.0000000000', '-0.0030000000'] 2 basic ['0.00000000', '0.00200000', '-0.00100000'] 3 section eps0 0.0000000000 kappa -0.00200000 4 fibre 5.000000e-04 (exact, from plane sections) 5 stress 100000.0000 kPa EI ratio 0.999375 against 1 - 1/40^2 = 0.999375 lookup -2.50% against -100/40 = -2.50%
8. 각 단계에서 확인할 것
절점. 변위가 예상한 크기인가? 12부: 그림은 알려주지 못한다.
기본계. basicForce가 요소 평형을 만족하는가? 아니면 그 아래는 전부 무의미하다.
단면. 곡률 분포가 정역학이 요구하는 모양인가 — 점하중이면 선형, 등분포면 포물선?
단면 강성. M/κ가 E·I와 1/n² 이내로 맞는가?
파이버. 파이버를 읽고 있는가, 표면을 계산하고 있는가? 둘은 1/n만큼 다르다.
재료. 16부처럼 그 변형률 이력을 따라 손으로 몰아 대조했는가?
9. 같은 사슬을 다섯 단계 깊이로
입문자는 선단 변위를 읽습니다. 주니어는 요소력을 읽고 정역학과 대조합니다. 실무 해석자는 단면 변형을 읽고 하중이 요구하는 곡률 모양을 압니다. 시니어는 단면 객체가 푸는 게 아니라 보간한다는 것을, 그리고 평면유지가 모델 전체가 기대고 선 가정이라는 것을 압니다. 전문가는 보고되는 양 중 무엇이 정확하고 무엇이 이산화된 것인지 알고, 중요할 때 정확한 쪽을 계산합니다.
16부의 시간축과 이 글의 공간축으로, 프레임워크에서 아직 열어보지 않은 움직이는 부품은 남아 있지 않습니다. 남은 것은 연습입니다.
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부 — 면진과 감쇠: 속도 의존 요소와 베어링
참고 자료
OpenSeesPy, basicDeformation, sectionDeformation, sectionForce.
OpenSeesPy, eleResponse — 6절의 파이버 조회.
OpenSees Wiki, Add a New Element C++ — 기본계와 변환을 안쪽에서 설명한 문서.
Spacone, E., Filippou, F. C., Taucer, F. F., "Fibre beam-column model for non-linear analysis of R/C frames", Earthquake Engineering and Structural Dynamics 25(7), 1996 — 3절의 힘기반 정식화.
Scott, M. H., OpenSees Digital — 단면 상태 결정과 파이버 이산화에 관한 풍부한 자료.
출처 확인 2026-08-31. 모든 결과는 OpenSeesPy 3.8.0에서 탄성 직사각형 파이버 단면으로 산출했으며 7절의 스크립트로 재현할 수 있습니다. 두 법칙 — EI가 1/n²만큼 모자라고 보고된 최외단 변형률이 1/n만큼 작다 — 은 등높이 파이버를 쓴 직사각형 patch에 대해 정확하며, 다른 patch 형상으로 그대로 옮겨지지는 않습니다. 결과는 프레임워크의 거동을 보여주는 것으로, 프로젝트별 해석이나 설계기준 검토를 대체하지 않습니다.