# MITC4 lumped mass·FEAST 고유치해석 ## 목적과 지원 범위 원형상·무응력 MITC4의 무감쇠 선형 고유진동 `K*phi=lambda*M_L*phi`를 푼다. Consistent moment에서 유도한 nodal block lumped mass와 실제 MKL FEAST를 사용한다. Prestress·nonlinear eigen·damping·acoustic·modal transient·외부 mode-shape equality는 포함하지 않는다. 공통 실행·소유권은 [solver-core](../solver-core/README.md)를 따른다. 수학 원문은 [전체 정식화](formulation.md), [mass·stabilization](formulation-mass-stabilization.md), [축소·FEAST](formulation-eigen.md)이며 [이전 유도](../mitc4-shell-feast-eigen/README.md)의 채택 경계를 구분한다. ## 채택한 설계와 이유 Mass는 `3×3×3` 적분의 scalar thickness moments를 row-sum하여 nodal `6×6` block으로 만든다. 3 병진·2 director 접평면 회전 관성과 warped geometry cross coupling을 보존한다. Numerical drill은 analytic mass null이며 인공 drilling inertia를 넣지 않는다. Stabilization scale은 초기 physical rotary diagonal 8개 trace 평균의 `10^-3`이다. Global 실제 BC를 먼저 적용하고 analytic null과 free 공간의 교집합만 제거한다. Partial rotational BC를 full clamp로 대체하지 않고 finite constrained spectrum을 유지한다. Positive nodal mass space를 whitening하고 sparse symmetric 문제를 FEAST에 전달한다. 완전한 interval의 c개 결과를 검증한 후 사용자 요청 lowest N만 공개한다. N 밖의 실패한 eigenpair를 버려 성공으로 바꾸지 않는다. Trace convergence만으로 개별 residual을 보장하지 못해 C-index `fpm[5]=0` residual stopping을 채택했다. ## 실제 입력 subset `S4|S4R`, centered homogeneous shell, `*ELASTIC`과 양의 상수 `*DENSITY`를 사용한다. 유일한 frequency step은 optional `NAME`, `NLGEOM=NO`, flag `PERTURBATION`을 허용한다. `*FREQUENCY`의 `EIGENSOLVER=LANCZOS`는 source 값이며 실제 FEAST mapping warning을 남긴다. `SIM=YES`/flag, `ACOUSTIC COUPLING=ON`은 structural-only source 의미를 보존한다. `NORMALIZATION=MASS`만 허용하며 실제 normalization은 derived lumped mass 기준이다. Data 첫 field N은 양의 checked int64, 뒤 2–7 field는 존재하면 모두 empty여야 한다. Nonempty zero bounds·shift, eighth field, 여러 step·preload·load·nonzero BC는 거부한다. Source step 이름과 canonical storage `Step-1`은 별개이며 원본 `Step-2`를 잃지 않는다. ## 결과와 reference 대응 HDF5는 `schema_version=0`, `eigen_schema_version=1`, procedure `linear-frequency`로 식별한다. `/steps/Step-1/eigen/modes`는 mode ID·raw eigenvalue·classification·cluster ID를 가진다. `vectors[N,node,6]`은 mass-normalized mode이며 response displacement가 아니다. Constrained 성분은 exact zero이고 sign은 최대 scaled global component의 stable rule로 정한다. Raw 작은 음수 lambda를 clamp하지 않는다. Frequency는 lambda>=0 mode subset만 생성한다. `verification`에는 전체 c개 residual·Gram·null 검사와 backend call/control evidence를 보존한다. | 원본 | 비교 계약 | | --- | --- | | `reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp` | 유일한 source frequency step `Step-2`, N=10 | | 같은 폴더 `shellNL-eigen-meshfine eigenvalues.txt` | `Frame: Mode : Value = ... Freq = ... (cycles/time)` | Step·mode ID·Value·time^-2를 직접 대응하며 TXT Freq로 lambda를 재구성하지 않는다. Duplicate/missing/extra mode·malformed/nonfinite·unit/mass/backend/schema 오류는 tolerance 전에 실패한다. 동일 Value의 서로 다른 mode는 합치거나 평균하지 않는다. 승인된 named policy `mitc4-eigen-first-implementation`은 mode별 singleton의 relative row error와 relative RMS를 각각 `<=5%` inclusive로 검사한다. Report는 policy_id와 relative_rms_tolerance를 기록한다. 이 예외는 다른 공통 family의 row 5%·RMS 1%를 바꾸지 않는다. 전체 c개 독립 내부 residual·Gram 등 `1e-10` 기준도 그대로다. ## 구현·데이터 흐름·수명 [Mitc4Shell::Mass](../../include/fesa/elements/mitc4_shell.h)와 [kernel](../../src/fesa/elements/mitc4_shell.cpp)이 local mass를 만든다. [LinearFrequencyProcedureExecutor::Execute](../../include/fesa/analysis/linear_frequency_procedure.h)는 [실제 procedure](../../src/fesa/analysis/linear_frequency_procedure.cpp)에서 stable assembly·modal candidate를 소유한다. [BuildEigenReduction](../../src/fesa/analysis/eigen_reduction.h)은 constrained lift·null split·whitening을 만든다. [MklFeastEigenSolver::Solve](../../include/fesa/solvers/eigen/mkl_feast_eigen_solver.h)는 private vendor adapter다. Domain→local K/M→ordered assembly→reduced solve→global phi 복원→all-c 검증→N 선택 순서다. [EigenHdf5ResultsWriter](../../include/fesa/io/hdf5/eigen_hdf5_results_writer.h)는 검증 state를 직렬화한다. 출력 close/self-check/atomic replace 실패는 candidate를 폐기하고 기존 final을 보존한다. ## 실제 evidence와 미해결 범위 2026-09-10 사용자 승인 첫 구현에서 전체 417/417 PASS와 원본 10 Value의 모드별5% 통과 기록이 있다. 최대 외부 상대차는 약 `4.261331%`다. 이전 RMS1% 불일치 이력은 소급 PASS로 고치지 않는다. 이 기록은 당시 revision의 evidence이며 이번 문서 정리는 새 build/test를 실행하지 않았다. Rational mass oracle·Jensen energy·좌표 재계산 공변성·density scaling·all-c 실패 주입이 보완 근거다. S3 public static 평형 충돌과 Abaqus Value 정확도 개선은 후속 보류다. 실제 512회 vendor 호출 또는 실제 HDF5 close-error의 모든 조합을 주입한 것은 아니다. Retained shell/shellNL 회귀와 내부 검증 의무를 유지하며 `reference/temp` 제외 예제를 재사용하지 않는다.