Integrate Hex8 mass verification and fixed-null-basis shell dynamics with numerical and physics handoff evidence. Preserve interrupted reference and full-validation status; full integration validation is deferred until after performance optimization.
22 KiB
HHT 독립 정식화 검토와 제조해 검산
2026-10-11 질량 정책 변경: HHT-ADR-012에 따라 현재 고유치·HHT는 lumped mass를 사용한다. 아래 consistent 질량을 전제로 한 수식 후보·검토·PASS/FAIL은 해당 시점의 이력이다. 변경본 통과로 승계하지 않으며 현재 수식은 formulation, 재검증 상태는 PRD의 현재 checklist를 따른다.
아래 상태와 미실행 표시는 각 검토 당시의 기록이다. 이후 reference 비교와 실제 shell 검증 결과는 구현 수치 검토, 현재 실패·잔여 범위는 PRD와 전체 현황을 따른다.
HHT 독립 수치 검토·검증 계약
- Feature:
hht-implicit-dynamics; owner:numerical-review-agent; date:2026-09-22. - 상태:
numerical-contract-defined; io-binding-and-implementation-verification-pending. 기존 정식화 검토에 후속 Numerical gate의 내부 판정·검증 사례·reference mapping 검토를 추가했다. Solver 기능 통과 또는 I/O schema 승인이 아니다. - 기준: 프로젝트 지침, Feature PRD, 요구사항, 연구 근거, 공통 tolerance.
- 상세: 내부 수치 기준, 검증 사례, 시간정확도 검산, 추가 일차 근거, reference mapping. Solver source/tests/reference/상위 계약은 수정하지 않았다.
결론
주 정식화와 관성 상세를 독립 대조했다. 현재 physical/algorithmic 가속도 분리 후보의 표시된 수식에서 새 오류는 발견하지 않았다. 사용자는 HHT-ADR-007에서 consistent kinetic mass를 선택했다. 내부 수치값과 반증 가능한 사례를 구체화했으며 Numerical 계약은 후속 I/O/구현에 인계할 수 있다. 실제 finite-rotation shell의 drilling DAE·시간수렴·reference 검증은 구현 후 필수 evidence다. 이 미실행을 수식 모순이나 코드 작성 금지로 해석하지 않는다.
| 확정한 내부 판정 | 핵심 기준 |
|---|---|
| Newton·선형계 | Force/moment별 상쇄 전 기여 scale의 residual 1e-10, correction 및 h-scaled v/a/A 각각 1e-10의 AND; linear backward error 1e-12; 최대100 corrections, fixed DIRECT/no cutback |
| Mass·DAE | Analytic Jl^-1 d의 free-space intersection으로 expected rank; positive-space Cholesky, scaled local/대수 rcond >=2^-32, null/Gram/moment 1e-12; 초기 hidden consistency 1e-10 |
| 미분·불변식 | D3/관성/전체 tangent step sweep의 nonzero error 1e-6, exact zero action 1e-10; nonlinear objectivity 1e-10, force/moment balance 1e-8; dynamic Keff 대칭 가정 없음 |
| 시간·coverage | 지정 smooth oracle의 q/v/physical a 최대오차와 마지막 두 refinement 차수 >=1.8; A는 별도량. Full Cartesian moving-null, coupled massless startup, finite-rotation shell, energy, rollback, 전체 reference 사례 |
숫자의 norm·zero branch·단위·실행 상태는 numerical-controls가 원본이다. 위 요약의 값만 떼어 다른 metric에 적용하지 않는다. 기존 정적 외력 상대 1%/absolute 1e-3나 eigen 외부 RMS 예외를 동적 Newton에 승계하지 않았다.
위험과 수정 반영
| ID | 판단 | 근거·필요 조치 |
|---|---|---|
| HHT-NR-001 | Naive variable-mass HHT의 일반 2차 주장 FAIL; 현 후보에서 배제 완료 | 여기서 g=c+f_int-F. M(q1)A1+(1+alpha)g1-alpha*g0에 -alpha*h*Mdot*a 결함. Smooth SDOF의 마지막 refinement 차수 0.976709. 관성 상세 §5.1이 이를 배제한다. |
| HHT-NR-002 | 두 시점 mass 가중을 moving-null 해결책으로 채택 FAIL; 현 후보에서 배제 완료 | 양의 가중 합의 nullspace는 교집합이다. 회전하는 drill null이 사라지면 인공 관성이 생긴다. SDOF 2차 관찰은 shell 채택 근거가 아니다. 관성 상세 §5.3이 이를 채택하지 않는다. |
| HHT-NR-003 | Endpoint physical a와 auxiliary A 분리 SUPPORTED CANDIDATE |
A1=(1+alpha)a1-alpha*a0, Newmark에는 A, endpoint balance에는 a. Smooth variable-mass와 한 moving-null 제조해에서 U/V/a의 2차 경향 확인. 일반 shell DAE 수렴 증명·구현 통과는 아니다. |
| HHT-NR-004 | A를 physical acceleration으로 출력 FAIL; 현 후보에서 구분 완료 |
위 후보에서도 A의 endpoint 오차는 1차다. 주 정식화 §§4–6이 a/A와 endpoint reaction을 구분한다. 영속 결과 선택은 I/O owner의 후속 계약이다. |
수식 대조 결과
| 검토 항목 | 결과와 evidence |
|---|---|
| DOF·좌표·회전 | [u,phi], total fixed-global chart ` |
| 질량·적분·단위 | Consistent HᵀH, scalar moment lumping, M_uu/M_uphi/M_phiphi의 M/ML/ML²와 force/moment 차원은 일관된다. 3³ 질량 적분의 최대 축별 차수 4, 내력 2³의 분리 및 density/reference measure 고정도 기존 mass M1–M7과 대조했다. 질량 종류별 에너지·orbital inertia 차이는 실제 물리 선택이다. |
| 관성력·접선 | I=∫rho Hᵀ(Ha+D²x[v,v])dV0는 kinetic energy의 Euler–Lagrange 전개와 일치한다. DqI의 D²x[p,·]ᵀ xddot, HᵀD²x[p,a], HᵀD³x[p,v,v] 및 DvI=2∫rho HᵀD²x[v,p]를 확인했다. M/((1+alpha)beta h²)와 gamma/(beta h) chain-rule 계수도 맞다. 일반 비대칭을 허용해야 한다. |
| Null·초기화 | ker B=span(Jl^-1 d) 및 free admissible null을 사용한다. psi=Nᵀg=0, 초기 1·2차 미분조건과 (psi_q N)eta로 null acceleration을 구하는 절차는 일관된다. M pseudoinverse만으로 초기 가속도를 정하지 않는 것이 필요하다. 실제 shell의 constant rank/regularity는 미검증이다. |
| 시간·하중 | alpha=-.05,beta=.275625,gamma=.55, STEP의 0+ 전값, a0 평형 및 A0=a0, DIRECT h=.1,T=10을 보존한다. Constant M에서 free endpoint 평형과 표준 force-weighted HHT의 환원을 확인했다. 큰 h의 정확도·일반 비선형 무조건 안정성을 주장하지 않는다. |
| 반력·에너지·회복 | Endpoint E=I+f_int-F, reaction의 support-on-structure 부호, M_spatial=Jl^-T m_phi의 가상일 관계는 일관된다. R_HHT,c와 endpoint reaction을 구별한다. T+U_phys+U_drill-W는 이산 에너지 결함이며 물리 damping이 아니다. Numerical drill을 physical section stress에 넣지 않는다. |
| State·안정성·coverage | 같은 trial의 q/v/a/A·tangent·recovery, 원자적 commit, 실패 history 보존 및 fixed dt 실패 종료는 수식과 일치한다. 기존 MITC의 locking/왜곡/chart 경계는 사라지지 않는다. U/UR reference만으로 V/A/에너지·큰 회전·hidden constraint를 검증할 수 없다. |
계약 결정과 후속 검증의 구분
| ID | 영향·owner | 필요한 해소 |
|---|---|---|
| HHT-NR-005 | 구현 후 필수 검증; 기능 acceptance blocking, Formulation/Implementation/Numerical Review | 선택한 지원 범위에서 free mass의 예상 constant rank와 psi_q N guard, finite-rotation drill coupling, q/v/a 및 hidden-constraint defect의 시간수렴을 검증한다. Nonsingular-mass 문헌 정리를 직접 확대하지 않으며 모든 finite-rotation shell DAE의 보편 정리를 새로 요구하지도 않는다. 현재 2D moving-null probe는 특정 regular 예제의 제한된 evidence다. |
| HHT-NR-006 | CLOSED: mass 사용자 결정, Main/사용자 | HHT-ADR-007의 consistent kinetic mass를 사용한다. Lumped를 동시에 지원하거나 reference fitting으로 전환할 의무·권한은 없다. 이 결정은 HHT의 모든 공개 입력/결과 계약까지 승인한 것이 아니다. |
| HHT-NR-007 | Numerical criteria DEFINED; I/O binding pending, 해당 owner | N1–N7과 C01–C12에 mixed-unit Newton, zero branch, conditioning/branch, 종료·hidden defect·oracle를 정의했다. 공개 a/A·omega quantity 선택과 HDF5 field/schema 연결은 후속 I/O 소유다. |
후속 필수 검증은 정식화 §7과 연구 HHT-E01–E10을 따른다. 특히 실제 shell의 3차 director/관성 tangent directional derivative, 초기 drilling acceleration coupling, 좌표변환 후 동일 물리 모델, kinetic-energy derivative·관성 force/moment 평형, 선형 alpha=0 에너지 및 비선형 에너지 결함 시간수렴을 포함해야 한다. 일반 비선형 HHT에 정확 에너지 보존·매 frame 단조감소를 강제하지 않는다.
Reference tolerance 적용 경계
reference-model을 독립 대조해 수치 비교 정의에 이견이 없음을 확인했다. 원본 inventory의 직접 재집계는 그 문서에 기록된 main evidence다. Step-1/increment/instance/node/component identity, frame별 U-global/UR-global 27 scalars씩 총202 families, 9-node projection 전후 사전검사를 사용한다. CSV decimal time n/10과 FESA scheduled binary64 n*h를 각각 검증한 뒤 integer increment로 연결하므로 표시 decimal과 부동소수점 곱의 차이를 nearest-time tolerance로 숨기지 않는다. 실제 HDF5 field/schema는 후속 I/O가 연결한다.
TOLERANCE의 near-zero band 0.01S, 일반 행 relative 0.05, relative RMS 0.01, S=0 exact-zero를 그대로 사용한다. U blocking, UR warning-only이나 identity/finite 오류는 전체 실패다. Eigen RMS 예외는 적용하지 않는다. 이 정식화 검토 당시 Reference 비교는 미실행이었다. 9개 node가 중심 주변 3×3 patch라는 coverage 한계 및 성긴 dt/T1≈7.4567을 보존한다.
실행 evidence와 한계
독립 검산의 기존 SDOF/angle-reduced moving-null은 종단 오차 evidence로 재사용했다. 후속 main의 full Cartesian 2×2 residual/Jacobian probe를 읽고 한 번 재실행하여 exit 0 및 전체 시점 최대오차를 확인했다. 마지막 refinement의 q/v/a 차수는 1.99985/1.99992/1.99834, full residual 최대 7.94824e-11, 최대 Newton3 corrections였다. 별도 Jacobian의 고정 step sweep도 연속한 내부 점에서 1e-6 이하를 보였다. 이 관찰은 N2–N7의 모든 gate나 실제 shell을 통과한 실행이 아니다.
본 owner의 4개 문서에서 로컬 링크 대상·trailing whitespace를 검사하여 문제 0개였다. Binary64 scalar 계산으로 gamma4096=4.54747e-13, gamma64/(2^-32)=3.05176e-5 및 diag(1,c)의 c=2^-31,2^-32,2^-33,0에 대한 conditioning 경계 판정 pass,pass,fail,fail을 확인했다. 이는 scalar 산술 확인이며 C05의 실제 mass/condition-estimator 실행 통과가 아니다.
잔여 위험은 선택 consistent mass의 실제 shell constant-rank/regularity, D3 구현과 small-angle 경계, 큰 h의 시간 alias, 초기·finite-dt hidden constraints, 조건수 추정의 forward-error 한계다. C01–C12가 이를 검출하도록 설계됐고 아직 solver 실행 결과는 없다. Build/CTest, FESA 동적 해석, Abaqus, 외부 reference comparison은 이번 문서 작업 범위에서 실행하지 않았다.
HHT 독립 시간정확도 검산
검토 보고서의 상세 evidence다. 2026-09-22 Python 표준 라이브러리만 사용했다. FESA solver, Abaqus 또는 reference 비교 실행이 아니다. 아래 오차는 승인 tolerance를 새로 정하는 값이 아니라 정확해와의 수렴 관찰값이다.
모델과 결과
- Smooth SDOF:
T=.5(1+q²)v²,c=qv²,q_exact=.4+sin(t),f=(1+q_exact²)a_exact+q_exact v_exact²,0≤t≤1. 초기q=.4,v=1,a=0. 입력은 일관된 무차원 검산 단위다.alpha=-.05,beta=.275625,gamma=.55. - Moving-null:
x(q)=q/|q|,T=.5|Dx(q)v|²,U=.5(|q|-1)²,q∈R²\{0}.r=|q|,d=q/r,M=(I-ddᵀ)/r²,c=-2(q·v)Mv/r²,f_int=(r-1)d.ker M=span(q)가 회전한다. 정확해q=(cos t,sin t),v=(-sin t,cos t),a=-q; 초기 위치·속도·가속도 대수조건은 일관된다. Endpoint 반경 대수조건r=1은 각도 parameterization으로 정확하게 강제하며 tangent 평형만 Newton으로 푼다. 이 모델은 shell/drilling 구현이나 일반 singular-DAE 정리의 대체물이 아니다.
| SDOF 방법 | h=1/512 U 오차 |
h=1/1024 U 오차 |
관측 차수 |
|---|---|---|---|
Naive M1 A1+(1+alpha)g1-alpha g0=0 |
1.0272820368e-5 | 5.2200068232e-6 | 0.976709 |
Weighted mass ((1+alpha)M1-alpha M0)A1+(1+alpha)g1-alpha g0=0 |
3.2914014847e-7 | 8.2299941973e-8 | 1.999739 |
Endpoint physical M1 a1+g1=0, A1=(1+alpha)a1-alpha a0 |
2.7561411953e-7 | 6.8902116013e-8 | 2.000030 |
g=c-f. 마지막 방법의 physical acceleration 오차는 2.3176116737e-7 → 5.7545108678e-8로 줄지만 algorithmic A 오차는 5.2612378749e-5 → 2.6344436092e-5다. 따라서 A를 endpoint physical acceleration으로 보고하면 안 된다.
Moving-null 마지막 방법은 같은 두 h에서 U 오차 4.0606413493e-7 → 1.0152120526e-7, V 오차 4.1505360817e-7 → 1.0376522277e-7, physical a 오차 4.1511310820e-7 → 1.0262747089e-7를 보였다. max|q·v|는 8.4282e-11 → 1.0594e-11, max|q·a+v²|는 7.9368e-7 → 1.9445e-7다. Endpoint 위치 대수조건을 지켜도 미분된 속도·가속도 조건이 매 frame 정확히 0이 되는 것은 아니다. 이 결함의 시간수렴과 초기 일관성을 별도로 검증해야 한다.
독립 수학 대조
Smooth 물리식 M(q)a+g(q,v,t)=0에서 Newmark 내부 가속도의 정확해 대응은 A=a+alpha*h*adot+O(h²)다. Naive 식의 일차 결함은
alpha*h*(M*adot+gdot)=-alpha*h*Mdot*a.
따라서 Mdot*a≠0인 일반 문제에서 상수 M 증명을 그대로 사용할 수 없다. Weighted mass는 이 항을 상쇄하지만 alpha∈(-1,0)이면 서로 다른 두 시점의 양의 준정부호 질량의 양의 결합이다. 그 영공간은 두 영공간의 교집합이므로, 영공간이 회전하면 rank가 늘어날 수 있다. 단순 SDOF의 2차 결과가 이를 정당화하지 않는다.
Physical/algorithmic 가속도 분리는 Brüls–Arnold 원문의 Eq. (5), (7), (8)에 alpha_m=0,alpha_f=-alpha를 대입한 것이다. 원문의 p.6 equivalent-model/index-3 가정은 비특이 mass 및 제약 정칙성을 사용한다. Singular drilling mass에 그 증명을 직접 적용하지 않는다. 이 문서의 제조해와 결함 계산은 독립 검산이다.
재현 코드와 명령
Workspace root에서 다음 명령으로 아래 Python block만 실행한다. 외부 package, 파일 생성 또는 solver 실행은 없다.
python -c 'from pathlib import Path; s=Path("docs/hht-implicit-dynamics/numerical-review-probes.md").read_text(encoding="utf-8"); exec(s.split(chr(96)*3+"python\n",1)[1].split(chr(96)*3,1)[0])'
import math
alpha = -.05
beta = (1-alpha)**2/4
gamma = .5-alpha
def exact(t):
return .4+math.sin(t), math.cos(t), -math.sin(t)
def force(t):
q, v, a = exact(t)
return (1+q*q)*a+q*v*v
def scalar(h, variant):
q, v, ap = exact(0)
A = ap
for n in range(round(1/h)):
t = (n+1)*h
m0 = 1+q*q
g0 = q*v*v-force(n*h)
oldap = ap
pred = q+h*v+h*h*(.5-beta)*A
vpred = v+h*(1-gamma)*A
def calc(x):
an = (x-pred)/(beta*h*h)
vn = vpred+gamma*h*an
m = 1+x*x
if variant == 'physical':
pn = (an+alpha*oldap)/(1+alpha)
r = m*pn+x*vn*vn-force(t)
dr = 2*x*pn+m/((1+alpha)*beta*h*h)+vn*vn+2*x*vn*gamma/(beta*h)
else:
me = m if variant == 'naive' else (1+alpha)*m-alpha*m0
dm = 2*x if variant == 'naive' else (1+alpha)*2*x
r = me*an+(1+alpha)*(x*vn*vn-force(t))-alpha*g0
dr = dm*an+me/(beta*h*h)+(1+alpha)*(vn*vn+2*x*vn*gamma/(beta*h))
pn = an
return r, dr, vn, an, pn
x = pred+beta*h*h*A
for _ in range(20):
r, dr, *_ = calc(x)
dx = -r/dr
x += dx
if abs(dx) < 1e-14:
break
else:
raise RuntimeError('scalar Newton failed')
q = x
_, _, v, A, ap = calc(q)
qe, ve, ae = exact(1)
return abs(q-qe), abs(v-ve), abs(ap-ae), abs(A-ae)
def moving_null(h):
q, v, ap = [1.,0.], [0.,1.], [-1.,0.]
A = ap[:]
theta = 0.
max_cv = max_ca = 0.
dot = lambda x,y: sum(x[i]*y[i] for i in range(2))
for _ in range(round(1/h)):
pred = [q[i]+h*v[i]+h*h*(.5-beta)*A[i] for i in range(2)]
vp = [v[i]+h*(1-gamma)*A[i] for i in range(2)]
old = ap[:]
theta += h
def calc(angle):
d = [math.cos(angle),math.sin(angle)]
tangent = [-d[1],d[0]]
an = [(d[i]-pred[i])/(beta*h*h) for i in range(2)]
vn = [vp[i]+gamma*h*an[i] for i in range(2)]
pn = [(an[i]+alpha*old[i])/(1+alpha) for i in range(2)]
dv, tv = dot(d,vn), dot(tangent,vn)
residual = dot(pn,tangent)-2*dv*tv
derivative = 1/((1+alpha)*beta*h*h)-dot(pn,d)-2*(tv*tv+dv*(-dv+gamma/(beta*h)))
return residual, derivative, d, vn, pn, an
for _ in range(15):
r, dr, *_ = calc(theta)
dx = -r/dr
theta += dx
if abs(dx) < 1e-14:
break
else:
raise RuntimeError('moving-null Newton failed')
_, _, q, v, ap, A = calc(theta)
max_cv = max(max_cv,abs(dot(q,v)))
max_ca = max(max_ca,abs(dot(q,ap)+dot(v,v)))
qe = [math.cos(1),math.sin(1)]
ve = [-math.sin(1),math.cos(1)]
ae = [-x for x in qe]
errors = [math.hypot(*[x[i]-y[i] for i in range(2)]) for x,y in ((q,qe),(v,ve),(ap,ae))]
return *errors, max_cv, max_ca
for variant in ('naive','weighted_mass','physical','moving_null'):
print(variant)
previous = None
for k in range(5,11):
h = 2**(-k)
errors = moving_null(h) if variant == 'moving_null' else scalar(h,variant)
order = math.log(previous/errors[0],2) if previous else float('nan')
print(f'h={h:.9g} errors='+','.join(f'{x:.10e}' for x in errors)+f' pU={order:.6f}')
previous = errors[0]
Newton correction cutoff 1e-14는 이 독립 double-precision probe의 반복 종료값이다. Solver convergence 또는 reference acceptance tolerance로 채택하지 않는다. 미세 h의 acceleration 오차에는 displacement 차분의 roundoff가 포함되므로 표의 관측값을 정확한 수학 상수로 해석하지 않는다.
후속 full Cartesian moving-null 검산
추가 Numerical 작업에서 메인이 full_coordinate_probe.py(당시 경로: ../../.harness/build/hht-numerical/full_coordinate_probe.py, 현재 checkout에 없음)를 작성했고 수치 검토자가 residual/Jacobian 식을 읽고 아래 명령을 재실행했다. Exit 0, 2026-09-22. 이 script는 ignored build evidence이며 FESA source가 아니다. 위 angle-reduced probe와 달리 q의 두 Cartesian 성분을 직접 Newton으로 풀며 radial projection·normalization을 하지 않는다. 같은 x=q/|q| 모델의 exact 2×2 Jacobian을 사용한다.
python .harness/build/hht-numerical/full_coordinate_probe.py
오차는 각 h의 모든 시점에서 q/v/physical a의 2-norm 최대다. 앞 절의 종단 오차와 다른 측정량이다.
| h | max q error | max v error | max physical a error | 직전 h 대비 q/v/a 차수 |
|---|---|---|---|---|
| 1/128 | 6.4948801161e-6 | 6.6395874231e-6 | 1.2690547915e-5 | 1.99932 / 1.99962 / 2.01024 |
| 1/256 | 1.6240799623e-6 | 1.6601117645e-6 | 3.1667175260e-6 | 1.99968 / 1.99981 / 2.00269 |
| 1/512 | 4.0606299832e-7 | 4.1505196280e-7 | 7.9259171465e-7 | 1.99985 / 1.99992 / 1.99834 |
마지막 grid의 최대 ||q|-1|=2.22045e-16, |q·v|=8.39836e-11, |q·a+v²|=7.91118e-7. 상쇄 전 Ma의 entry products·c·f_int를 사용한 최대 normwise residual은 7.94824e-11, Newton 최대 3 corrections, 마지막 correction 최대 4.00220e-16이었다. 이 probe의 종료는 correction <=1e-13이며 N2의 모든 AND gate를 구현한 solver가 아니다. 위 관찰을 N2–N7 전체 통과나 실제 shell 통과로 확대하지 않는다.
별도 trial q=(.85,.52), predictor (.83,.50), velocity predictor (-.35,.71), old physical a (-.7,-.3), h=.1, direction (.6,-.8)의 exact effective Jacobian을 중앙차분했다. N5의 j=8,10,12,14,16,18,20 순서에서 상대 오차는 [3.13656e-5,1.96035e-6,1.22522e-7,7.65779e-9,4.77929e-10,3.25134e-11,1.04250e-11]이다. 연속한 내부 sweep 점 j=12/14 등이 1e-6을 만족한다. 이는 이 2D trial/direction에 대한 미분 evidence이며 shell D3 oracle를 대체하지 않는다.
Full-coordinate 결과는 새로운 C04b의 moving-null 구조와 max-time 측정을 지지한다. C04b의 전체 prescribed grids, 초기화 실패 mutation, regularity·scale·반복오차 분리 등 모든 판정을 실행한 것은 아니다. 더 미세한 h에서 residual이 증가할 수 있으므로 h=1/1024까지 같은 residual 기준으로 통과했다는 주장을 하지 않는다.