diff --git a/docs/mitc4-shell-feast-eigen/ADR.md b/docs/mitc4-shell-feast-eigen/ADR.md index bfa2f24..bf9c0fb 100644 --- a/docs/mitc4-shell-feast-eigen/ADR.md +++ b/docs/mitc4-shell-feast-eigen/ADR.md @@ -52,3 +52,12 @@ - 결정: 고유치 개수는 `.inp`의 `*FREQUENCY` data를 사용한다. 지정 input의 요청은 `10`개이며 reference 행수나 FEAST 내부 count 추정으로 요청 개수를 역추론하지 않는다. - 근거: 2026-09-06 사용자 답변 “inp 파일의 고유치 개수를 사용합니다”; [r1 FEM-REQ-MITC4-EIGEN-009/015](requirements.md#requirement-verification-matrix). - 영향: 기존 mode-count 의미의 확인이므로 contract revision은 `r1`을 유지한다. FEAST interval/subspace는 입력 요청의 낮은 N개와 multiplicity·누락 검증을 충족하기 위한 내부 처리이다. 새 입력 설정 기능을 추가하지 않는다. + +## MFE-ADR-006 — 질량 lumping과 질량 없는 좌표의 정식화 + +- 상태: Formulation owner의 수학 계약으로 기록; 독립 Numerical Review 대기. +- 결정 owner: formulation-agent; 기록 owner: coordinator-agent. +- 결정: Consistent scalar moments를 같은 `3×3×3` volume quadrature로 계산하고 moment row-sum에서 nodal `6×6` block lumped mass를 유도한다. 기존 global 제약 뒤 analytic director null과 기존 stabilization의 decoupling을 이용해 finite 공간을 투영하고 sparse nodal whitening으로 FEAST에 연결한다. +- 근거: [Formulation 핵심 계약](formulation.md#핵심-계약), [mass M1~M10](formulation-mass.md), [eigen E1~E8](formulation-eigen.md). +- 영향: 곡면 coupling 및 mass/centroid·energy 차이를 명시하고 인공 drilling mass와 일반 dense Schur는 도입하지 않는다. Numerical Review는 수식·conditioning·FEAST controls·reference 준비를 독립 검토한다. +- 남은 검토: [V5](formulation-verification.md#v5-rigid-mode-coordinate-및-density-불변식)의 기존 basis-dependent stabilization 한계와 `FEM-REQ-MITC4-EIGEN-014` coordinate-invariance coverage 관계를 NR가 명시적으로 확인해야 한다. 이 기록으로 acceptance 범위를 조용히 좁히지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md index 14f1d5d..9619d18 100644 --- a/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md +++ b/docs/mitc4-shell-feast-eigen/FEATURED_AGENTS.md @@ -37,5 +37,9 @@ Reference artifact와 공통 정책은 수정하지 않는다. 외부 solver 실 | [requirements-evidence.md](requirements-evidence.md) | requirement-agent | r1 | 원본 관찰·결정·정적 evidence audit 완료 | | [research.md](research.md) | research-agent | r1 | Coordinator gate pass; primary source coverage | | [research-evidence.md](research-evidence.md) | research-agent | r1 | 수식 후보·API·한계·verification 근거 audit 완료 | +| [formulation.md](formulation.md) | formulation-agent | r1 | Coordinator gate pass; 독립 NR 인계 | +| [formulation-mass.md](formulation-mass.md) | formulation-agent | r1 | M1~M10·적분·lumping·보존량 수학 계약 | +| [formulation-eigen.md](formulation-eigen.md) | formulation-agent | r1 | E1~E8·제약/null·FEAST·복원 수학 계약 | +| [formulation-verification.md](formulation-verification.md) | formulation-agent | r1 | V1~V7·검증식·NR 수치 기준 인계 | 아직 작성되지 않은 specialist 보고서는 목록에 승인 산출물로 등록하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/PRD.md b/docs/mitc4-shell-feast-eigen/PRD.md index 3202354..87e659d 100644 --- a/docs/mitc4-shell-feast-eigen/PRD.md +++ b/docs/mitc4-shell-feast-eigen/PRD.md @@ -3,7 +3,7 @@ - Feature ID: `mitc4-shell-feast-eigen` - Owner: `coordinator-agent` - Input contract revision: `r1` -- 검토 상태: requirements 및 research r1 gate pass; 구현용 정식화 준비. +- 검토 상태: requirements·research·formulation r1 gate pass; 독립 numerical/reference review 진행. 기준: [프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [프로젝트 ADR](../ADR.md). 지역 지침과 문서 목록은 [FEATURED_AGENTS.md](FEATURED_AGENTS.md), 상태 원본은 [coordination.md](coordination.md)를 따른다. @@ -42,3 +42,4 @@ Reference는 선행 preload 없는 단일 frequency step의 10모드이며 상 두 질량 계산의 연결에 관한 [MFE-ADR-002](ADR.md#mfe-adr-002--mitc4-질량-이산화)는 사용자 후속 요구로 확정되었다. 실제 FEAST mass는 [MFE-ADR-004](ADR.md#mfe-adr-004--feast에-사용하는-질량행렬)에 따라 lumped로 승인되었다. 상세 lumping 수식은 Research/Formulation owner가 정의한다. Primary-source 근거와 적용 한계는 [research](research.md), 상세 근거는 [research-evidence](research-evidence.md)에 있으며 최종 수식·수치 기준의 승인을 대신하지 않는다. +구현용 수학 계약과 상세 문서의 연결은 [formulation](formulation.md)에 있다. 수치 acceptance 및 reference readiness는 NR 판정 전이다. diff --git a/docs/mitc4-shell-feast-eigen/coordination.md b/docs/mitc4-shell-feast-eigen/coordination.md index 542564b..8cec70b 100644 --- a/docs/mitc4-shell-feast-eigen/coordination.md +++ b/docs/mitc4-shell-feast-eigen/coordination.md @@ -3,9 +3,9 @@ - Feature ID: `mitc4-shell-feast-eigen` - Owner: `coordinator-agent` - Contract revision: `r1` (사용자 최종 질량 요구를 반영한 requirements baseline) -- Stage: `formulation` -- Outcome: `pass` (research gate) -- Next owner: `formulation-agent` +- Stage: `numerical-review` +- Outcome: `pass` (formulation gate; 독립 numerical 판정 전) +- Next owner: `numerical-review-agent` - Attempt: `0` - Completion: 미완료 - Failure classification / retry key: `null` @@ -23,6 +23,7 @@ | requirements r0 초안 | [requirements](requirements.md), [관찰·결정 evidence](requirements-evidence.md) | needs-user-decision; 질량 선택 미승인으로 baseline pass 보류 | | requirements r1 | [requirements](requirements.md), [관찰·결정 evidence](requirements-evidence.md), MFE-ADR-002/004 사용자 명시 결정 | pass; 26개 must와 owner/revision/hash 검증, 미결정 0 | | research r1 | [research](research.md), [primary-source 상세 근거](research-evidence.md) | pass; primary source 11개 그룹·프로젝트 근거2개, 26개 requirement coverage 및 API 보장 한계 확인 | +| formulation r1 | [기본 수학 계약](formulation.md), [mass](formulation-mass.md), [eigen](formulation-eigen.md), [verification](formulation-verification.md) | pass; owner/revision/상세 수식·26개 coverage·정적 evidence 확인, 독립 수치판정은 NR 소유 | 공통 문서 및 reference 파일 목록의 read-only 조사 명령은 exit code `0`으로 완료했다. 확인된 reference 파일은 `shellNL-eigen-meshfine.inp`, `shellNL-eigen-meshfine eigenvalues.txt`이며 실제 의미와 readiness는 담당 owner가 검토한다. @@ -31,6 +32,16 @@ Root의 시작 Git 조사에서 worktree clean을 확인했다. 구현·build/te ## 현재 bounded dispatch +Formulation owner의 r1 `pass` envelope와 실제 기본/상세 문서 4개를 감사하여 numerical-review로 전이한다. +Owner 정적 검사는 `4`문서, `38` local links, requirement coverage `26`, issues `0`, `python -B -` exit `0` 및 `git diff --check` exit `0`이다. +Coordinator는 모든 상세 문서의 metadata·수식/단위/identity/오류/검증/한계 절과 링크를 읽고 필수 항목 존재를 확인했으며 수학적 correctness verdict를 대신하지 않았다. +NR는 수학 correctness와 reference-model readiness를 모두 검토하고 명시된 metric/zero branch의 수치값, FEAST controls·bounded budgets 및 필수 verification portfolio를 고정한다. +Root의 두 독립 감사 포인트를 필수 handoff로 포함한다: count 기능의 실제 API 보장보다 강한 completeness를 주장하지 않을 것; +기존 basis-dependent drilling stabilization과 `FEM-REQ-MITC4-EIGEN-014`의 coordinate-invariance coverage 관계를 명시하여 acceptance의 조용한 축소를 막을 것. +현재 새 사용자 미결정이나 implementation correction은 없다. + +### Formulation 이력 + Research owner의 r1 `pass` 반환을 Coordinator가 감사하여 formulation으로 전이한다. 연구 기본/상세 문서의 owner, r1, source locators, Fact/Derivation/Candidate 구분, 실제 명령 exit code 및 미실행 항목을 확인했다. 연구 문서 SHA-256: `research.md` = `c044031f844798f32bedc95fd998c181f965fbac00c3ed8f594a48d0164b8956`, @@ -39,6 +50,10 @@ Coordinator local-link audit은 Feature 8문서/끊긴 링크0, exit code `0`; ` 설치 header와 공식 count 기능 존재는 runtime 또는 완전성의 자동 통과 증거가 아니다. 실제 API의 수치적 한계, endpoint/count 실패, 독립 작은 spectrum 검증이 연구 보고서에 기록되었다. Formulation owner는 approved MITC4 geometry에 대한 consistent 적분, derived block lumping·물리 관성·massless drilling/constraints, FEAST의 낮은 N개 계산·복원·실패 보존 및 modal evidence 식을 구현 가능한 계약으로 작성한다. 최종 numerical/reference acceptance는 다음 NR가 독립 검토한다. +Research checkpoint는 Root가 `a7c13ff` (`docs: record MITC4 mass and FEAST research evidence`)로 완료 문서 6개를 커밋했고 이후 clean을 확인했다. +Formulation owner의 중간 관찰은 기존 `Tphys/Tdrill`과 양의 nodal drilling 강성에 기반한 `Kpz=0` 증명, +곡면의 `C1` coupling을 유지하는 derived block lumping과 `3×3×3` mass 적분 차수 검토이다. +이는 작성 중인 정식화의 owner 관찰이며 formulation 또는 numerical gate 통과를 뜻하지 않는다. ### Research 및 baseline 이력 @@ -99,6 +114,9 @@ Root read-only 환경 조사에서 다음 설치 경로를 확인했다. 이 목 VS `18/Community` DevShell script/dll이 존재하며 Ninja는 현재 PATH에 없다. Planning/Executor는 각 실행 subprocess의 MSVC x64 Developer 환경과 dependency 환경을 명시해야 한다. Root는 global environment, Hook state/code를 변경하지 않았다. +추가 Root read-only 확인: Python `3.11.15`, oneMKL `mkl_rt.lib`/`bin/mkl_rt.3.dll` 및 FEAST 선언이 존재한다. +현재 작업 경로는 primary `C:/git/FESADev`의 linked worktree이며 branch는 `Eigen`이다. +Implementation profile은 `gpt-5.6-terra` / `xhigh` / `workspace-write`이고 실제 configure/link/runtime는 아직 미실행이다. 현재 `.harness/config.json`은 없고 preset과 `.harness/config.example.json`은 있다. Planning은 자동 감지 결과와 승인 MSVC preset을 대조하여 실행명령 및 Hook backend를 명시해야 한다. diff --git a/docs/mitc4-shell-feast-eigen/formulation-eigen.md b/docs/mitc4-shell-feast-eigen/formulation-eigen.md new file mode 100644 index 0000000..5ad3bdb --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/formulation-eigen.md @@ -0,0 +1,279 @@ +# 제약 후 질량 공간, 유한 spectrum과 FEAST + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `formulation-agent` +- Input contract revision: `r1` +- 기본 보고서: [formulation.md](formulation.md) + +[질량 유도 M1~M10](formulation-mass.md), [research evidence](research-evidence.md)의 +`S03`~`S08`, `P01`, `R03/R04`를 적용한다. 아래 reduction은 기존 stabilized stiffness와 +**derived lumped mass**의 pencil에 정확히 대응한다. + +## E1. 조립, 단위 scaling과 실제 global 제약 + +Element gather `A_e`를 stable source node/component 순서로 정의하면 +`K=sum A_e^T K_e A_e`, `M=sum A_e^T M_L,e A_e`이다. 이하 `M`은 항상 lumped이다. +Element contribution→stable COO key→고정 순서 reduction으로 두 행렬을 조립한다. +Lumped nodal block이므로 `M`의 node 간 block은 0이다. Worker는 global storage를 +동시에 갱신하지 않는다. Source identity와 equation index는 다른 번호다. + +혼합 단위를 가진 6 DOF를 그대로 Euclidean norm으로 합하지 않는다. +활성 shell의 기존 최대 edge 길이들 중 최대값 `ell>0 [L]`을 characteristic length로 +선택하고 `D=blockdiag(ell I3,I3)`를 node마다 둔다. `q=D y`에서 `y`는 무차원, +`Khat=D^T K D [ML²/T²]`, `Mhat=D^T M D [ML²]`이다. +이는 congruence이며 physics와 lambda를 변경하지 않는다. + +원 global homogeneous BC의 free injection을 `C`라 한다. 고정 DOF의 행은 0, +free DOF의 행은 하나의 1이며 free 순서는 DofManager의 stable 순서다. + +\[ +y=C y_f,\qquad K_f=C^TKhat C,\qquad M_f=C^TMhat C. \tag{E1} +\] + +Nonzero prescribed base state는 이 procedure의 입력 오류다. 먼저 local 회전을 임의 +삭제한 뒤 global BC를 적용하지 않는다. 특히 global `UR3`와 drilling은 같지 않다. + +## E2. Null/positive basis를 node마다 결정 + +각 active node의 원 질량 null은 M8로부터 `z_i=[0;d_i]` 한 방향이다. +따라서 node별 실제 free 좌표에서 null이 존재하는 필요충분조건은 +**constrained rotational component마다 해당 `d_i` 성분이 정확히 0**인 것이다. +그때 `Z_i=C_i^T z_i`는 unit null vector이며 otherwise null dimension은 0이다. +Translation constraint는 이 판정에 영향을 주지 않는다. 모든 회전이 고정이면 null도 없다. + +이 판정은 analytic nullspace와 실제 입력 BC의 교집합이다. 작은 nonzero constrained +director 성분을 임계값으로 0으로 바꾸지 않는다. 거의 정렬된 경우 작은 양의 physical +mass가 남을 수 있으며 이를 보존한다. Numerical conditioning 검증을 통과하지 못하면 +명시적 실패로 처리하고 free DOF를 추가 삭제하지 않는다. + +각 node에서 `Z_i`의 Euclidean 직교 여공간 basis를 `P_i^f`라 한다. +회전 3개가 free이면 기존 tangent basis `(a_i,b_i)`를 사용할 수 있다. Free 회전 2개 +안에 null이 있으면 그 평면에서 `d_i`에 수직인 단위벡터 하나, 회전 1개가 null이면 +positive 회전 basis는 없다. Free translation axis는 그대로 유지한다. +Null이 없으면 `P_i^f=I`다. Source component 순서, basis sign/tie는 고정한다. +Householder 등 동등한 작은 orthogonal construction을 쓸 수 있으나 physical rank를 +수치 eigenvalue cutoff로 정하지 않는다. + +\[ +P=\operatorname{blockdiag}(P_i^f),\quad Z=\operatorname{blockdiag}(Z_i),\quad +[P\ Z]^T[P\ Z]=I,\quad M_p=P^TM_fP\succ0,\quad M_fZ=0. \tag{E2} +\] + +여기서 `P_i^f`와 [M2의 tangent projector](formulation-mass.md)는 서로 다른 기호다. +실제 positive dimension `n=cols(P)`, null dimension `nz=cols(Z)`이다. +Reference의 full clamped flat mesh에서는 625개 interior node, +`nf=3750`, `nz=625`, `n=3125`가 예상된다. 실제 assembly와 rank evidence로 확인한다. + +## E3. 기존 stiffness에서 decoupling의 정확한 증명 + +공통 node director는 [shell geometry](../../src/fesa/model/shell_geometry.cpp)가 한 번 +정의하고 [ElementFactory::CreateShell](../../src/fesa/elements/element_factory.cpp)이 +node identity로 각 element에 전달한다. [MITC4 kernel](../../src/fesa/elements/mitc4_shell.cpp)의 +`PhysicalTransformation20`, `DrillingTransformation4`, `EvaluateStiffness`는 M4를 구현한다. + +한 node에만 `[0;d_i]`가 있는 full vector `z_i`에 대해 `T_p A_e z_i=0`이다. +Drilling 부분은 해당 node에만 작용하므로 + +\[ +Khat z_i=\kappa_i z_i,\qquad +\kappa_i=\sum_{e\ni i}k_{d,e}>0,\qquad +K_f Z=Z\operatorname{diag}(\kappa_i). \tag{E3} +\] + +마지막 등식은 E2에서 `z_i`가 **실제로 free space에 있을 때** 성립한다. +따라서 + +\[ +K_{pz}=P^TK_fZ=0,\quad K_{zz}=Z^TK_fZ=\operatorname{diag}(\kappa_i)\succ0, +\quad K_p=P^TK_fP,\qquad K_p p=\lambda M_p p. \tag{E4} +\] + +Finite mode의 massless 성분은 `z=0`이다. 이 projection은 arbitrary small coupling을 +버리는 근사가 아니라 승인된 physical/drilling separation의 항등식이다. +Null이 없는 부분 제약 node에서는 `P=I`이고 기존 drilling contribution이 `K_p`에 +그대로 남는다. 이를 빼면 원 constrained stabilized pencil을 바꾸므로 금지한다. + +실제 floating-point matrix와 basis의 `M_f Z`, `K_fZ-Z diag(kappa)`, `P^T Z`를 +별도 evidence로 남긴다. 증명된 analytic null만 구조적으로 제거하고 계산된 tiny coupling을 +근거 없이 threshold로 버리지 않는다. 이 항등식의 roundoff 검증 및 복원 후 full free +residual이 NR 기준을 넘으면 assembly/director/conditioning 실패로 중단한다. +추가 massless mode를 찾아 제거하거나 기존 K를 재조정하지 않는다. + +## E4. 일반 Schur 식과 비정상 rank의 의미 + +E3의 구조가 없는 일반 symmetric pencil을 비교하면, `Kzz`가 가역일 때만 + +\[ +z=-K_{zz}^{-1}K_{zp}p,\quad +(K_{pp}-K_{pz}K_{zz}^{-1}K_{zp})p=\lambda M_p p. \tag{E5} +\] + +이는 massless row를 푼 정확한 elimination이며 massive DOF의 근사 Guyan reduction이 +아니다. 예를 들어 `K=[[6,2],[2,4]]`, `M=diag(2,0)`이면 +`lambda=5/2`, `z=-p/2`이다. 첫 행만 남기는 `lambda=3`은 잘못이다. +E5는 independent small-pencil 검산과 잘못된 projection을 잡는 기준이다. +이 Feature의 production shell 경로에는 E3이 적용되므로 일반 dense Schur 구현을 요구하지 +않는다. E3과 불일치하는 input을 E5로 자동 fallback하여 승인 geometry 문제를 숨기지 않는다. + +- `nz=0`: null 처리 없이 실제 constrained `Kf,Mf`의 문제다. +- Local positive rank 0: 모든 free DOF가 null이면 해당 node의 finite 좌표는 없고 + 양의 `Kzz`에 의해 그 free coordinate는 0으로 복원한다. Fully constrained node도 + finite 좌표 0개다. 다른 node의 유효 finite 좌표는 계속 보존한다. +- Global `n=0` 또는 `N>n`: 요청 모드가 존재할 수 없으므로 명시적 model/solve 실패다. + 정적 해석의 유효 `0×0 Kff` 계약과 이 양의 mode-count 요구를 혼동하지 않는다. +- 예상 `Kzz`가 singular/nonpositive이거나 활성 node에 mass contribution이 없음: + 유효 shell의 E3 전제가 깨진 것이다. Common `K/M` null이면 임의 lambda에 대한 + indeterminate direction이며 ordinary finite eigenmode가 아니다. 제거하거나 pseudoinverse, + stiffness/mass epsilon으로 정규화하지 않고 진단한다. +- 일반 indefinite `Kzz`의 singular/nonzero `Kpz` case는 descriptor-pencil의 추가 + constraint를 요구한다. 이번 positive stabilized shell과 다른 문제이며 자동 해석하지 않는다. + +## E5. SPD whitening, 복원과 sparsity + +`M_p`는 node별 최대 `6×6` SPD block이다. 각 block을 Cholesky하여 +`M_p=L L^T`를 얻고 다음을 정의한다. + +\[ +A=L^{-1}K_pL^{-T},\quad p=L^{-T}x,\quad +A x=\lambda I x,\quad +\phi=D C P L^{-T}x. \tag{E6} +\] + +Inverse를 dense global matrix로 만들지 않고 작은 block triangular solve로 congruence를 +구성한다. `phi`는 source node의 global 6 DOF로 복원되고 constrained entries는 정확히 0이다. +`phi^T M phi=x^T x`다. Identity mass를 전달하는 E6도 실제 lumped mass에서 얻은 +generalized SPD 문제다. Consistent mass 또는 인공 unit physical mass로 바꾼 것이 아니다. + +Projection/whitening은 node 간 topology를 늘리지 않는다. 기존 node coupling마다 작은 +dense block만 생기며 전체 `O(n²)` Schur matrix와 dense inverse를 피한다. +Sparse shifted FEAST factorization 자체의 fill은 별도 존재한다. Full `M_C`는 element별 +`24×24`와 세 `4×4` moment로 검증할 수 있고 global dense consistent matrix는 불필요하다. +Allocation/nnz/factorization memory 실패는 불완전 모드의 성공이 아니라 명시적 failure다. + +## E6. 유한 search interval과 요청 개수 + +요청 `N`은 `.inp *FREQUENCY`의 양의 정수이며 현재 reference는 10이다. +Reference Value/Freq/행수는 interval, scale, count 또는 parameter 선정에 사용하지 않는다. + +먼저 `s=||A||inf [T^-2]`를 안정된 합으로 계산한다. `s>0`이면 `B=A/s`로 두고, +반환값은 `lambda=s mu`다. `A=0`이면 `s=min_e E_e/(rho_e ell²)>0`라는 +모델 유래 time scale을 사용하며 `B=0`이다. 이 zero-matrix case도 N개의 0 모드를 +FEAST에서 계산·검증한다. Invalid/underflow/overflow scale을 임의 1로 바꾸지 않는다. + +각 행의 off-diagonal absolute sum을 `r_i`라 하면 Gershgorin에 의해 +`min_i(Bii-ri)<=mu<=max_i(Bii+ri)`다. 안정된 directed-outward accumulation 또는 +동등하게 증명된 roundoff bound를 포함하여 finite enclosure `[gL,gU]`를 만든다. +`B=0`에서는 알고리즘용 dimensionless enclosure `[-1,1]`을 사용한다. +Nonzero B의 endpoint margin은 NR가 정할 dimensionless coefficient와 `||B||inf` 및 +endpoint ULP로 결정하고, outward `nextafter`를 적용해 `a0=N`인 마지막 safe upper를 쓴다. + Representable midpoint가 없거나 NR endpoint separation 폭에 도달하면 subdivision을 + 끝낸다. 경계에 있는 반복 고유치의 일부만 count하도록 tolerance를 조정하지 않는다. +3. 불필요하게 먼 lower bound를 줄이기 위해 `a=a0`, 위에서 얻은 `b=hi`로 시작한다. + `v=(a+b)/2`의 prefix count가 0이면 `a=v`로 이동하고, 양수이면 이 하한 축소를 끝낸다. + 따라서 `(a0,a)`의 empty-prefix evidence를 잃지 않는다. 아주 작은 고립 cluster에서 + 넓은 구간이 검색 실패를 유발하는 Intel의 경고를 이 과정과 후검증으로 다룬다. +4. 최종 `(a,b)`에서 다시 count하여 `c>=N`이고 알려진 prefix와 일치함을 확인한다. + Capacity는 `m0=min(n,max(c+8,ceil(3c/2)))`로 한다. `c=n`이면 `m0=n`이다. + Checked integer arithmetic을 쓰며 큰 multiplicity도 전체 count를 수용한다. +5. Solve 성공 후 모든 `c`개를 독립 검증하고 정렬하여 첫 N개를 결과 candidate에 넣는다. + 같은 eigenvalue의 multiplicity를 지우거나 평균내지 않는다. N번째가 repeated/cluster의 + 내부에 있으면 내부 계산 group은 보존하고 출력 row는 정확히 N개다. + +Midpoint·endpoint 이동은 overflow-safe하게 수행한다. NR는 count-call budget, +endpoint separation coefficient와 perturbation 횟수를 구현 전에 고정한다. Budget은 +각 search 및 endpoint 재시도까지 포함하는 유한 정수다. `-5` 등의 endpoint 실패 시 +기록된 bracket 안에서 NR가 정한 간격으로 양옆의 endpoint 후보를 순서대로 평가하며, +성공한 prefix/count evidence 없이는 bracket을 갱신하지 않는다. 마지막 valid bracket이 +없거나 count monotonicity/total count가 맞지 않으면 실패다. Search 최적화 budget에 +도달하면 이미 검증된 enclosing bracket을 쓸 수 있으나 실패한 count를 성공으로 바꾸지 않는다. + +Postsolve에서는 returned `m=c`, finite paired vectors/values, Gram rank, interval 내부 +및 endpoints와의 separation을 확인한다. Endpoint에 너무 가깝거나 `info=1/2/3`, +count/solve mismatch이면 NR가 정한 유한 회수 안에서 safe bracket 확대·재count·capacity +확대만 허용한다. 매번 count/solve history를 보존한다. 그 뒤에도 불일치하면 실패하고 +부분 모드 또는 다른 eigensolver로 fallback하지 않는다. Formulation은 이 수학적 알고리즘을 +NR에 인계한다. 구현 진입 bundle은 다음 stage가 수치값·budget을 고정한 뒤 완성된다. + +Full enclosing bound, empty-prefix, interval count와 solve-count/Gram 검증은 낮은 N개의 +누락을 탐지하는 서로 다른 evidence다. Intel의 documented total count를 모든 conditioning, +endpoint 및 floating-point 상황의 completeness theorem으로 확대하지 않는다. +독립 known-spectrum의 zero/negative/cluster/repeated/size1/request=n case와 실제 +설치 runtime 검증이 필수 연결점이며 선택 및 수치 기준은 NR가 소유한다. + +## E7. FEAST 경계와 deterministic 실행 + +Actual eigenpairs는 `dfeast_scsrgv`로 E6의 `(A,I)` 또는 E6에서 동일하게 scale한 +`(B,I)`를 풀어 구한다. Real symmetric, SPD second matrix, `n>0`, +`00 [L]`, section의 material에서 결정된 일정 density `rho>0 [M/L³]`를 사용한다. +`E>0 [M/(LT²)]`, `-1=0`이다. Interpolated director를 normalization하여 M1의 geometry를 +변경하지 않는다. 기존 kernel의 `EvaluateGeometry`와 같은 Jacobian 및 부호를 사용한다. +기존 [정식화](../linear-static-mitc4-shell/formulation.md)의 §§3~5, 8~11이 +director 생성, tangent frame `(a_i,b_i,d_i)`, 기하 허용 조건과 MITC strain을 소유한다. + +전역 nodal 좌표는 `q_i=[u_X,u_Y,u_Z,theta_X,theta_Y,theta_Z]^T`이다. +`u [L]`, `theta [1]`이고 양의 director 변화는 `theta cross d`이다. 다음 map을 정의한다. + +\[ +S_i=-[d_i]_\times,\quad P_i=I-d_i d_i^T=S_i^TS_i,\quad +G_i(z)=[I_3\ \ zS_i],\quad H=[N_1G_1\ \cdots\ N_4G_4]. \tag{M2} +\] + +따라서 입자 변위/속도는 `u(X)=Hq`, `v(X)=H q_dot`이다. Physical nodal coordinates +`[u_X,u_Y,u_Z,alpha,beta]`에서 회전 열은 `[-z b_i, z a_i]`이다. +`alpha=a_i^T theta`, `beta=b_i^T theta`, `gamma=d_i^T theta`이며 +`S_i d_i=0`이다. 20↔24 변환은 기존 `PhysicalTransformation20`/`DrillingTransformation4` +그대로이다. MITC assumed shear와 `5/6` shear factor는 strain/stiffness에만 작용한다. +속도 보간과 질량에 이 factor를 적용하지 않는다. + +## M2. Strong/weak form과 기존 stiffness + +원형상·무응력 상태의 소변형 무감쇠 자유진동에 대해 continuum parent는 +`rho u_ddot = div sigma`, `sigma=C_ps:epsilon`, `sigma_33=0`이다. +자유 표면·자유 edge의 generalized traction은 0이고 essential data는 동차 global DOF +제약이다. 허용한 thickness 운동학과 MITC projection에 제한한 약형은 + +\[ +\int_{\Omega_0}\rho\,\delta u^T\ddot u\,dV+ +\int_{\Omega_0}\delta\bar e^T C_5\bar e\,dV+ +\delta\gamma^T K_d\gamma=0. \tag{M3} +\] + +원형상 elastic Hessian은 기존 stiffness다. + +\[ +C_5=\operatorname{diag}\left( +\frac{E}{1-\nu^2}\begin{bmatrix}1&\nu&0\\\nu&1&0\\0&0&(1-\nu)/2\end{bmatrix}, +\frac56\frac{E}{2(1+\nu)}I_2\right), +\quad K_{20}=\sum_{g\in2\times2\times2}\bar B_g^TC_5\bar B_gJ_gw_g, +\] +\[ +K_e=T_p^TK_{20}T_p+T_d^T(k_d I_4)T_d,\quad +k_d=10^{-3}\min\{(K_{20})_{rr}>0:r\text{는 tangent rotation}}. \tag{M4} +\] + +`bar e=[epsilon11,epsilon22,gamma12,gamma13,gamma23]`이고 M4는 새 선택이 아니라 +기존 [정식화 §12](../linear-static-mitc4-shell/formulation.md) 및 +[실제 kernel](../../src/fesa/elements/mitc4_shell.cpp)의 고정 계약이다. +Drilling energy는 수치 stabilization이며 물리 strain/stress가 아니다. +`K_e q_e`는 내부 elastic generalized force, `M_L,e q_ddot,e`는 inertia다. +최종 반이산식은 `M_L q_ddot + Kq=0`이다. Harmonic ansatz +`q(phi,tau)=phi cos(omega tau)`에서 `Kphi=lambda M_L phi`, `lambda=omega² [T^-2]`를 얻는다. +새 constitutive/history state, geometric stiffness, damping, preload, nonlinear tangent, +time integrator 또는 modal stress/reaction recovery는 없다. + +## M3. Consistent matrix와 충분한 quadrature + +`T_C=1/2 integral rho |H q_dot|² dV`에서 + +\[ +C^{(k)}_{ij}=\int_{\Omega_0}\rho N_iN_j z^k dV\quad(k=0,1,2), +\qquad +(M_C)_{ij}=\begin{bmatrix} +C^{(0)}_{ij}I_3&C^{(1)}_{ij}S_j\\ +C^{(1)}_{ij}S_i^T&C^{(2)}_{ij}S_i^TS_j +\end{bmatrix}. \tag{M5} +\] + +세 scalar moment matrix는 각각 symmetric `4×4`이다. 차원은 `C(k) [M L^k]`, +mass의 `uu/u-theta/theta-theta` block은 각각 `M/ML/ML²`이다. +`M_C [24×24]`는 global block 형식이며 20 physical mass의 congruence와 동일하다. +원본 `M_C`와 그것을 구성한 `C(0..2)`를 완성·검증한 후 lumping 입력으로 사용한다. +Global consistent sparse matrix를 eigen solve에 조립할 필요는 없지만 계산 원본을 +lumped 결과로 덮어쓰거나 별도의 mass를 생성한 뒤 consistent에서 유도했다고 부르지 않는다. + +M1은 각 자연 좌표에 최대 1차이다. Jacobian의 세 열의 최대 다항 차수는 각각 +`(0,1,1)`, `(1,0,1)`, `(1,1,0)`이므로 determinant의 성분별 최대 차수는 `(2,2,2)`다. +`Ni Nj z^k J`의 차수는 최대 `(4,4,k+2)`, 즉 `(4,4,4)`이다. 따라서 **질량에는 +3×3×3 Gauss–Legendre**를 사용한다. 각 축의 points는 +`[-sqrt(3/5),0,+sqrt(3/5)]`, weights는 `[5/9,8/9,5/9]`이다. +3-point rule의 5차 정확성으로 M5의 모든 항을 이 geometry에서 정확 적분한다 +(floating-point roundoff 제외). 추가 density/thickness 변화를 가정한 결론이 아니다. + +Loop 순서는 증가하는 `xi`, 그 안의 `eta`, 가장 안의 `zeta`, 이후 `i<=j`, `k=0,1,2`로 +고정하고 대칭 항을 복사한다. Mass 계산의 27개 실제 평가점에서도 기존 geometry +predicate를 적용한다. `J<=0`, nonfinite frame/basis 등의 실패를 weight 절댓값, +점 생략이나 flat replacement로 수리하지 않는다. 기존 stiffness 8-point 경로는 변경하지 +않는다. 이 검사는 27점에서의 positivity를 보장하며 volume 모든 위치의 injectivity에 +대한 새 theorem이나 기존 warp/curvature 범위의 확대를 주장하지 않는다. + +왜곡된 flat element라도 같은 식을 쓴다. 서로 다른 director가 있으면 `J(zeta)`의 1차 항 +때문에 `C(1)`이 0이 아닐 수 있다. Centered section만을 이유로 coupling을 버리거나 +`C(2)=t² C(0)/12`를 일반식으로 사용하지 않는다. + +## M4. 계산된 consistent moment에서 nodal block 유도 + +각 node의 세 row sum과 질량 block을 정의한다. + +\[ +m_i=\sum_j C^{(0)}_{ij},\quad h_i=\sum_j C^{(1)}_{ij},\quad +j_i=\sum_j C^{(2)}_{ij},\qquad +L_i=\begin{bmatrix}m_iI_3&h_iS_i\\h_iS_i^T&j_iP_i\end{bmatrix}, +\quad M_{L,e}=\operatorname{blockdiag}(L_1,L_2,L_3,L_4). \tag{M6} +\] + +이는 scalar moment row sum 후 tensor로 재구성하는 **nodal block lumping**이다. +Global 전체 행의 합, absolute row sum, diagonal scaling 또는 nodal quadrature와 +혼용하지 않는다. 같은 source node의 incident element block은 기존 source element 순서로 +합한다. 공통 `d_i` 때문에 조립 후에도 M6 형태다. Local와 global에서 diagonal이 아닌 +`6×6` coupling은 허용한 lumped mass의 일부다. + +`sum Nj=1`을 M5에 대입하면 정확히 + +\[ +(m_i,h_i,j_i)=\int\rho N_i(1,z,z^2)dV,\quad +L_i=\int\rho N_i G_i(z)^TG_i(z)dV. \tag{M7} +\] + +`m_i>0`, `j_i>0`, `m_i j_i-h_i²>0`이다. 마지막 부등식은 양의 measure에 대해 +`z`가 상수가 아닌 점(양의 두께 및 서로 다른 thickness Gauss점)과 strict +Cauchy–Schwarz에서 따른다. 이를 이용하면 + +\[ +q_i^TL_iq_i=m_i\left|u_i+\frac{h_i}{m_i}S_i\theta_i\right|^2+ +\left(j_i-\frac{h_i^2}{m_i}\right)|S_i\theta_i|^2. \tag{M8} +\] + +따라서 `L_i`의 rank는 5, null은 정확히 `[0;d_i]`의 span이다. +`zbar_i=h_i/m_i [L]`, `j_i-h_i²/m_i [ML²]`는 node에 할당된 thickness +measure의 centroid와 central tangent inertia다. 음/영 variance나 nonfinite를 clamp하지 +않고 mass 검증 실패로 처리한다. 모든 노드에 최소 한 활성 shell이 연결되어야 한다. + +M6의 유도 연결은 `C(k)` 원본→row sum→block reconstruction으로 추적한다. +동시에 M7을 독립 직접 적분하여 두 결과의 일치를 검증할 수 있다. +서로 다른 nodal frame의 rotary component를 직접 더하지 않는다. + +## M5. 보존되는 양과 근사되는 양 + +모든 등식은 동일 원형상·density와 quadrature measure에 관한 것이다. + +1. 총 병진 질량 `m=sum mi=integral rho dV` 및 모든 uniform translation의 kinetic + energy가 consistent와 정확히 같다. 각 방향의 total mass가 `m`이며 `trace(Muu)`를 + 총 질량이라고 정의하지 않는다. +2. Thickness scalar moment는 `sum hi=integral rho z dV`, + `sum ji=integral rho z² dV`다. 각 nodal tangent tensor는 `ji Pi`이고 drilling inertia는 + 0이다. 이는 물리 director의 회전 관성 정의이며 모든 rigid rotation의 전체 tensor를 + consistent와 같게 만드는 계약은 아니다. +3. Lumping measure의 위치를 `x_i(z)=X_i+z d_i`로 보면 spatial first moment + `sum_i(mi Xi+hi di)=integral rho X dV`이므로 center of mass가 보존된다. + Node의 `Xi`에만 `mi`를 놓고 `hi di`를 누락하면 곡면에서 이 등식이 깨진다. +4. `v_i(z)=u_dot_i+z S_i theta_dot_i`에 대해 Jensen identity가 다음을 준다. + +\[ +\dot q^T(M_L-M_C)\dot q= +\frac12\int\rho\sum_{i,j}N_iN_j|v_i-v_j|^2dV\ \ge0. \tag{M9} +\] + +두 kinetic energy의 차이는 M9의 절반이다. Equality는 positive-weight point마다 모든 +`v_i`가 같을 때 성립한다. 일반 속도장 및 rigid angular motion의 orbital inertia는 +달라질 수 있으며 lumped 값이 그 quadratic form에서 작아지지 않는다. +Rigid spatial rotation은 `u_i=Omega cross Xi`, `theta_i=Pi Omega`로 재현된다. +이때 M9는 nodal 위치 분산으로 생기는 angular-inertia 차이를 정확히 설명한다. +두 spectrum의 동일성, arbitrary mesh의 특정 수렴 차수 또는 Abaqus lumping 동등성을 +acceptance로 요구하지 않는다. Smooth refinement에서 차이가 감소하는지는 독립 evidence다. + +Proper orthogonal global rotation `Q`에 대해 `D_Q=blockdiag(Q,Q)`를 두면 +`S(Qd)=Q S(d) Q^T`, `L'_i=D_Q L_i D_Q^T`이며 consistent에도 같은 congruence가 +성립한다. 이는 tangent basis 선택과 독립적이다. Constraint도 같은 물리 공간으로 변환한 +경우에만 spectrum의 좌표 불변성을 비교한다. + +## M6. 직접 적분 가능한 평판 oracle + +평행 director와 affine 직사각형 면적 `A`에서는 + +\[ +C^{(0)}=\frac{\rho t A}{36} +\begin{bmatrix}4&2&1&2\\2&4&2&1\\1&2&4&2\\2&1&2&4\end{bmatrix}, +\quad C^{(1)}=0,\quad C^{(2)}=\frac{t^2}{12}C^{(0)}. \tag{M10} +\] + +각 node는 `mi=rho t A/4`, `hi=0`, `ji=rho t³ A/48`이다. +이는 production quadrature를 호출하지 않고 다항 적분으로 얻는 oracle다. +곡면에서는 M5~M9와 independent volume integration을 사용한다. +두께 `t` 변경 시 stiffness와 rotary inertia는 다른 차수로 변하므로 전체 spectrum에 +하나의 thickness power law를 강제하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen/formulation-verification.md b/docs/mitc4-shell-feast-eigen/formulation-verification.md new file mode 100644 index 0000000..81bf040 --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/formulation-verification.md @@ -0,0 +1,222 @@ +# 질량과 modal candidate의 검증식 및 Numerical Review 인계 + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `formulation-agent` +- Input contract revision: `r1` +- 기본 보고서: [formulation.md](formulation.md) + +[질량 식 M1~M10](formulation-mass.md), [축소·복원 식 E1~E8](formulation-eigen.md)의 +기호를 사용한다. 이 문서는 측정량과 zero branch를 정의하며 수치 acceptance 값과 +필수 benchmark 선정은 Numerical Review가 독립 검토하여 고정한다. +외부 기준의 수치는 [TOLERANCE](../TOLERANCE.md)를 그대로 적용한다. + +## V1. 공통 scale과 zero branch + +행렬·벡터 norm을 계산하기 전에 E1의 길이 congruence를 적용한다. 질량은 모두 +`ML²`, stiffness는 `ML²/T²` 단위가 된 행렬에서 norm을 계산한다. Element-only +oracle에서는 `ell=Le`를 사용하고 assembled 비교에는 동일 global `ell`을 사용한다. +Norm과 sum-of-squares는 overflow/underflow를 피하는 scaled accumulation을 사용한다. +입력/행렬/각 eigenpair가 finite인지 먼저 검사한다. + +이 문서의 모든 ratio `a/b`는 `b>0`에서만 계산한다. `a=b=0`이면 해당 항등식의 +zero-case metric은 0이다. `b=0,a!=0`이면 named zero-scale failure이며 무한값/NaN +metric으로 성공 결과를 만들지 않는다. `max(1,b)`, arbitrary floor 또는 zero clamp는 없다. + +대칭성은 `eta_sym(Q)=||Q-Q^T||F/||Q||F`이다. Diagonal copy로 생성한 symmetry와 +독립 quadratic-work 검증은 구분한다. Cross-basis equality `R=S`는 +`||R-S||F/(||R||F+||S||F)`로 측정한다. Mass/stiffness를 같은 norm의 분모에 직접 더하지 +않고 필요한 lambda나 시간 scale을 곱한다. + +## V2. 질량, rank와 보존 검증 + +- M10의 entrywise scalar oracle와 `M_C` quadratic form을 독립 적분과 비교한다. + 계수·부호/두께 차수가 같은지를 component별 확인한 뒤 전체 norm을 사용한다. +- M5에서 구성한 `M_C`와 원본 moment, M6의 row-sum 결과, M7의 independent direct + integration을 따로 비교한다. 변조한 C(1)/C(2)가 lumped 결과 및 검증에 반영되는지 + 확인하여 두 mass 계산이 끊긴 우회 경로를 잡는다. +- Mass original과 derived 모두 `d_i` 방향의 null action을 검사한다. + Element/global scaled matrix에서 `eta_null=||Mhat z||2/(||Mhat||F ||z||2)`를 쓴다. + Lumped는 M8의 양의 두 항 및 physical positive-space Cholesky로 rank5를 검증한다. + Consistent physical 20-coordinate matrix도 positive여야 한다. 잘못된 quadrature에 + 의한 추가 hourglass/null mass를 허용하지 않는다. +- `mi>0`, `ji>0`, `zi=hi/mi`, `vi=ji/mi-zi²>0`를 검사한다. + `vi/ell²`, `|hi|/sqrt(mi ji)`는 dimensionless conditioning evidence다. + 양의 `vi`를 낮은 rank로 바꾸는 기준을 두지 않는다. Direct centered integral + `integral rho Ni (z-zi)² dV`와 `ji-hi²/mi`의 일치는 cancellation을 드러낸다. +- Scaled node positive mass의 Cholesky reconstruction error와 reciprocal condition + estimate를 기록한다. 후자는 작은 block inverse action의 norm으로 계산할 수 있다. + 물리 positive/null rank는 E2로 정하고 ill-conditioning은 별도 실패다. +- 총 질량은 uniform translation의 `q^TMq/|u|²`, geometry 적분의 `m=sum mi`를 + 비교한다. Spatial centroid는 M5의 scalar moment로 얻은 + `sum(mi Xi+hi di)`와 독립 `integral rho X dV`를 비교한다. + 좌표 원점으로 인한 cancellation을 피하려면 한 source node `Xref`를 공통 원점으로 + 잡고 first moment 차이를 `m ell`로 나눈다. +- M9의 `Delta=q_dot^T(M_L-M_C)q_dot`와 nonnegative pairwise integral을 독립 비교한다. + Scale은 `q_dot^T M_L q_dot + q_dot^T M_C q_dot`이며 zero motion/null-only field는 + 별도 zero branch다. Arbitrary velocity에서 equality를 요구하지 않는다. + +## V3. Reduction과 full modal residual + +`y_f=C^T D^-1 phi`, `k=||Kf||F`, `m=||Mf||F`라 두면 + +\[ +r_f=K_f y_f-\lambda M_f y_f,\qquad +\eta_r=\frac{\|r_f\|_2}{(k+|\lambda|m)\|y_f\|_2}. \tag{V1} +\] + +이것이 **모든 원 free DOF**의 inertia/elastic force balance다. 물리 공간에 +project한 residual만으로 drilling/null 복원 오류를 놓치지 않는다. +`Kf y_f` 및 `Mf y_f`를 solve에 사용한 축소 matrix를 재사용하지 않고 원 조립값에서 +검산한다. `Mf`는 actual lumped이며 consistent로 바꾸면 잘못된 metric이다. +`lambda=0`에서도 `k>0`이면 유효한 denominator가 있다. `Kf=0,lambda=0`은 zero branch, +zero eigenvector는 normalization 이전부터 실패다. + +Whitened solve의 추가 metric은 `eta_w=||A x-lambda x||2 / +((||A||F+|lambda|)||x||2)`다. Backend `res/epsout`, eta_w, eta_r은 서로 다른 evidence다. +E3의 identity도 다음으로 검산한다. + +\[ +\eta_{KZ}=\frac{\|K_fZ-Z\operatorname{diag}(\kappa)\|_F} +{\|K_f\|_F\|Z\|_F+\|Z\operatorname{diag}(\kappa)\|_F},\quad +\eta_{MZ}=\frac{\|M_fZ\|_F}{\|M_f\|_F\|Z\|_F},\quad +\eta_{PZ}=\|P^TZ\|_F. \tag{V2} +\] + +`nz=0`이면 V2는 적용 대상 없음으로 기록한다. M8/E3의 analytic proof가 먼저이고 +V2 threshold만으로 새로운 nullspace를 발견하거나 coupling을 생략하지 않는다. +Kzz positivity와 `n/nz/nf`를 source node별 예상 null 여부와 연결한다. +Constraint metric은 `||(I-CC^T)D^-1 phi||2/||D^-1 phi||2`이며 source에 복원한 +constrained components 자체도 exact zero를 확인한다. + +## V4. Mass normalization, Gram, energy와 Rayleigh + +각 mode의 generalized mass `g_i=phi_i^T M phi_i=y_i^T Mf y_i`는 finite, strictly +positive여야 한다. `phi_i <- phi_i/sqrt(g_i)`로 normalization한 뒤 재계산한다. +계산된 전체 c개 column에 대해 + +\[ +G_{ij}=\phi_i^T M\phi_j,\quad +\eta_{norm,i}=|G_{ii}-1|,\quad +\eta_{orth,ij}=\frac{|G_{ij}|}{\sqrt{G_{ii}G_{jj}}}\ (i\ne j),\quad +\eta_G=\frac{\|G-I\|_F}{\sqrt c}. \tag{V3} +\] + +Column pairing과 linear independence를 확인하며 FEAST의 c와 N을 구분한다. +부족한 rank를 같은 vector 복사로 채우면 V3에서 실패한다. + +\[ +h_i=y_i^TK_fy_i,\quad R_i=h_i/g_i,\qquad +\eta_{energy,i}=\frac{|h_i-\lambda_i g_i|} +{(k+|\lambda_i|m)\|y_i\|_2^2}. \tag{V4} +\] + +`R_i [T^-2]`는 Rayleigh quotient다. V4는 eigenvalue가 0인 경우에도 쓸 수 있고 +`|R_i-lambda_i|/|lambda_i|`만을 강제하지 않는다. 단위 modal amplitude에서 elastic +energy는 `h_i/2`, peak kinetic energy는 `lambda_i g_i/2`다. Physical/drilling 분해가 +필요한 내부 검산에서는 `h_phys+h_drill=h_i`를 확인하되 별도의 drilling-energy +acceptance나 output quantity를 추가하지 않는다. + +## V5. Rigid mode, coordinate 및 density 불변식 + +Free valid shell/patch의 rigid fields는 `u_i=c+Omega cross Xi`, +`theta_i=(I-di di^T)Omega`이다. 그 span에는 세 병진과 세 회전이 있다. +각 vector의 scaled K action을 `||Khat y||2/(||Khat||F ||y||2)`로 검증하고 +mass Gram rank로 여섯 물리 움직임의 independence를 확인한다. +`Omega`의 full normal 성분을 UR에 넣어 drilling energy를 자극한 field는 이 테스트가 아니다. +Physical rigid zero eigenvalues는 finite mass 모드이고 E2의 massless drilling과 다르다. +Clamped reference에 여섯 zero mode를 요구하지 않는다. + +Global rigid coordinate rotation에서 두 질량과 **physical stiffness**의 congruence 및 +E1~E6 spectrum 불변성을 검사한다. Free rotation 3개 또는 rotation 3개 전체 고정의 +node로 이루어진 사례는 finite 공간의 drilling 항이 0이므로 이 검증에 적합하다. +기존 `kd=min(physical tangent diagonals)*10^-3`는 선택한 tangent basis에 의존할 수 있다. +따라서 재계산한 kd까지 임의 회전에서 동일 scalar라 가정하거나 부분 회전 BC에 남는 +stabilization의 좌표 불변성을 새로 주장하지 않는다. 같은 kd를 유지한 단순 tensor +변환이면 complete K도 congruent하지만 별도 geometry에서 kd를 재선정한 경우와 다르다. +기존 stabilization 의미를 유지하는 한계이며 coefficient를 바꾸지 않는다. +Rotation 후 이전 global component BC를 그대로 두고 같은 문제라고 주장하거나 +새 MPC 입력 기능을 추가하지 않는다. + +모든 density를 동일 `c_rho>0`로 바꾸고 geometry/material stiffness/BC를 유지하면 + +\[ +M_C'=c_\rho M_C,\quad M_L'=c_\rho M_L,\quad +\lambda_i'=\lambda_i/c_\rho,\quad +\Phi'=\Phi Q/\sqrt{c_\rho}. \tag{V5} +\] + +단일 simple eigenvalue에서는 Q가 sign이고 repeated group에서는 orthogonal mixing이다. +Eigenvalue scaling error는 `|c_rho lambda_i'-lambda_i|/s`로 측정한다 +(`s`는 baseline E6 operator time scale). Group vector 비교는 +`U=L^T P^T C^T D^-1 Phi`, `U'=L^T P^T C^T D^-1(sqrt(c_rho) Phi')`로 정의한 +projector 차이 `||UU^T-U'U'^T||F/sqrt(2r)`를 사용한다. r은 group dimension이다. +Dense projector를 구성하지 않고 orthonormal U/U'의 cross-Gram으로 같은 norm을 계산할 +수 있다. Arbitrary clustered-but-distinct vectors를 회전하여 다른 eigenpairs로 만들지 않는다. + +## V6. Lowest N, cluster, near-zero와 오류 판정 소유권 + +E6 count/solve history는 각 `(a,b)`, prefix empty evidence, status, count, m0, +returned m, loop/epsout, bounds source와 final selected ranks를 보존한다. +모든 returned pair에 interval separation을 검사하고 requested N개만 검사하지 않는다. +Near-zero/negative 분류 scale은 `s` 또는 그와 동등한 E6 operator scale이며 reference +최소값이나 arbitrary absolute frequency가 아니다. Raw lambda는 바꾸지 않는다. + +NR가 구현 전에 결정해야 할 항목은 다음과 같다. + +| 대상 | 수치값/필수 검사 소유권과 필요한 scale | +| --- | --- | +| Matrix symmetry, moment/oracle/centroid/M9 | V1/V2의 same-unit norm, total mass 및 `m ell`; roundoff/독립 적분 오차 분리 | +| Null/orthogonal basis, KZ/MZ, mass conditioning | M8/E2 analytic rank, V2 및 작은 positive block condition; near-null 삭제 금지 | +| Residual, Gram, energy, rigid modes | V1~V4, V5 K-action; machine precision·차원·conditioning 근거 | +| Near-zero/negative/cluster 분류 | `|lambda|/s`, pairwise `|lambda_i-lambda_j|/s`; raw value 보존 | +| FEAST control | Contour points/precision exponent/refinement bound, finite count/endpoint/solve retry budget | +| Endpoint safety | Operator scale와 ULP, count monotonicity, enclosing total n, solve/count 및 full-rank Gram | +| Independent test portfolio | 평판 M10, warped/director-varying M5~M9, 비축정렬/부분 BC/E5 오류 case, FEAST known spectra, density/rigid/좌표 tests | +| External reference | 원본 input+TXT Value, mode/frame identity와 singleton 여부, common family 및 blocking 판정 | + +Small independent pencil은 손으로 대각화 가능한 값을 사용하고 동일 production +mass/reduction/eigensolver를 기대값 계산에 호출하지 않는다. API wrapper의 injected status +검사와 실제 FEAST runtime known-spectrum 검사는 모두 필요하다. Size1, N=n, repeated +group>N, tight cluster, zero/negative, empty interval, insufficient subspace, count collision, +unresolved conditioning 및 allocation/index failure가 해당 공식 계약을 검증한다. +Case의 구체적 목록·숫자는 NR가 정하고 Planning이 tests와 TDD steps에 연결한다. + +외부 비교는 지정 [원본 input](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine.inp)과 +[원본 TXT](../../reference/shellNL-eigen-meshfine/shellNL-eigen-meshfine%20eigenvalues.txt)의 +`Value`만 사용한다. `lambda [T^-2]`, source `Step-2`, mode 1..10이 의미적 대응이다. +Frequency 재계산, mode shape correlation이나 다른 mass variant의 더 가까운 결과 선택으로 +이를 대체하지 않는다. Mode/frame은 NR/I/O가 common same-frame family 규칙에 맞춰 +정의하고 missing/extra/duplicate/nonfinite를 tolerance 전에 거부한다. +Schema 경로/저장 field/public diagnostic 이름은 I/O owner의 계약이다. + +## V7. 실행 evidence와 남는 위험 + +Formulation 단계에서는 승인 문서와 실제 source를 read-only로 대조하고 자체 수식을 +전개했다. 다음 입력은 변경하지 않았다: requirements/research, 관리문서, source/tests/build, +Harness, 공통 tolerance 및 원본 reference. External solver, CMake/CTest, Harness, FEAST +runtime, numerical reference comparison은 실행하지 않았다. 이 문서는 수치 통과 evidence가 아니다. + +`Get-Content`, scoped `rg`로 M4의 변환·stabilization과 공통 nodal frame 전달을 확인했다. +한 scoped `rg` 호출은 존재하지 않는 `runtime_element_factory.cpp`와 PowerShell literal +glob 경로 때문에 exit `1`이었다. `rg --files`/`rg -n ... src/fesa`로 실제 +`element_factory.cpp`, `shell_geometry.cpp`를 찾아 재조회했고 exit `0`이었다. +Intel parameter/API/status의 공식 문서를 2026-09-06 다시 열어 count 의미, +endpoint/count failure와 m0 capacity를 확인했다(E7의 URL 및 research S05~S07). + +`Get-FileHash`는 exit `0`이며 원본 SHA-256은 upstream과 같다. +Input: `913b1abc604e62bc5f995bf5523924e17ea03925102a7bd22d39226ba0ea7339`. +TXT: `20d97ca3fd51f5b956f2c1ed7565557c68f74e61e41b913748515ef43a0f7f0b`. + +Owned 4개 문서를 `python -B -` read-only here-script(`pathlib`, `re`, +`urllib.parse.unquote`)로 정적 검사했다. Owner/Feature/revision, 26개 requirement +coverage, 상대 링크 실재, trailing whitespace/final newline, display-math delimiter와 +언어 혼입을 검사했다. Exit `0`, documents `4`, local links `38`, requirements `26`, +issues `0`이다. `git diff --check`도 exit `0`이며 Coordinator 소유 `coordination.md`의 +LF/CRLF warning만 출력되었다. 새 untracked owned 문서의 whitespace는 위 Python 검사로 +별도 확인했다. `git status --short`에서 owned 4개와 타 owner coordination 변경을 구분했으며 +stage/commit 또는 타 owner 수정은 하지 않았다. + +잔여 위험은 매우 얇은 shell/거의 정렬된 부분 BC의 mass conditioning, geometry quadrature +검사점 밖의 전역 injectivity 한계, floating-point FEAST count/endpoint와 repeated subspace, +count scratch 및 shifted factorization memory다. NR가 위 metric·수치 기준·case를 고정하고 +Implementation이 실제 설치 backend와 reference evidence를 제시해야 해소된다. diff --git a/docs/mitc4-shell-feast-eigen/formulation.md b/docs/mitc4-shell-feast-eigen/formulation.md new file mode 100644 index 0000000..42814fb --- /dev/null +++ b/docs/mitc4-shell-feast-eigen/formulation.md @@ -0,0 +1,69 @@ +# MITC4 질량행렬과 FEAST 고유치 정식화 + +- Feature ID: `mitc4-shell-feast-eigen` +- Owner: `formulation-agent` +- Input contract revision: `r1` +- 요청 outcome: `pass`; 다음 owner: `numerical-review-agent`. +- 상태: 독립 numerical review 요청이며 자기 승인이나 workflow 전이가 아니다. + +필수 입력은 [FEATURED_AGENTS](FEATURED_AGENTS.md), [PRD](PRD.md), [ADR](ADR.md), +[requirements](requirements.md), [requirements evidence](requirements-evidence.md), +[research](research.md), [research evidence](research-evidence.md)이다. +[프로젝트 지침](../../AGENTS.md), [프로젝트 PRD](../PRD.md), [ARCHITECTURE](../ARCHITECTURE.md), +[공통 ADR](../ADR.md), [TOLERANCE](../TOLERANCE.md), [agent 계약](../SOLVER_AGENT_DESIGN.md), +[문서 소유권](../FEATURE_DOCUMENTATION.md)을 적용했다. + +## 핵심 계약 + +1. 기존 원형상 MITC4 운동학·강성·director·global 6 DOF 의미를 유지한다. + Physical 3 translation/2 tangent rotation의 consistent mass와 구성 scalar moments를 + 같은 Jacobian으로 계산한다. Trilinear mapping의 mass integrand는 각 축 최대 4차이므로 + mass는 3×3×3 Gauss로 충분하며 곡면의 odd-thickness coupling을 유지한다. + 식과 단위·strong/weak form: [mass M1~M5](formulation-mass.md). +2. 계산된 consistent moment를 row-sum하여 global nodal 6×6 block lumped mass를 만든다. + 총 병진 질량·spatial centroid·할당된 thickness moments를 보존하고 drilling은 정확한 null이다. + 일반 운동에너지 차이는 nonnegative Jensen identity로 명시한다. + 보존/근사 범위와 독립 평판 oracle: [mass M6~M10](formulation-mass.md). +3. 실제 homogeneous global constraints를 먼저 적용한다. Free space에 완전히 포함된 + director null만 분리한다. 기존 nodal stabilization에 의해 Kpz=0, Kzz>0임을 입증하여 + finite spectrum을 nodal projection으로 보존하며 부분 BC에 남는 stabilization은 유지한다. + Sparse block whitening, rank 예외와 global 복원: [eigen E1~E5](formulation-eigen.md). +4. Actual FEAST mass와 모든 modal 검증은 derived lumped다. `.inp`의 N을 유지하고 + finite enclosure·prefix count·cluster capacity·count/solve 일치와 독립 eigenpair 검증을 + 결합한다. Endpoint/conditioning 한계를 count theorem으로 과장하지 않는다. + Backend 경계와 bounded search, 상태 보존: [eigen E6~E8](formulation-eigen.md). + +## Requirement coverage + +아래 ID는 모두 `FEM-REQ-MITC4-EIGEN-` 접두사다. Requirements matrix의 acceptance 원본을 +복제하지 않으며 formulation의 기여와 다음 owner를 구분한다. + +| IDs | 정식화/검증 연결 | 후속 확인 | +| --- | --- | --- | +| `001`, `002`, `004` | mass M1~M4: 원형상, 기존 MITC4·director·재료·기하·단위 | NR, I/O | +| `003` | mass M1/M5: 양의 일정 rho와 section별 연결 전제 | I/O semantic validation | +| `005`, `006`, `026` | mass M5~M10, verification V2: consistent→lumped, coupling, positivity/null, 보존/근사 | NR independent oracle | +| `007`, `008` | eigen E1~E5, verification V3: stable assembly, 실제 BC/null, finite spectrum 및 복원 | NR rank/conditioning | +| `009`, `010`, `011`, `012` | eigen E6~E8, verification V6: 낮은 N, multiplicity, 실제 FEAST, 유한 실패 | NR numerical controls, real runtime | +| `013`, `014`, `018` | verification V1~V5: lumped residual/Gram/energy/rigid/density/좌표, source/global 복원 | NR, Physics | +| `015`, `016` | mass M2 및 eigen E1/E6: 무감쇠 단일 procedure·동차 BC·input N authority | I/O exact syntax/no-op/exclusion | +| `017`, `019` | eigen E8: lambda/normalization 의미, source identity, candidate/final 보존 | I/O additive schema/failure | +| `020`, `021`, `022` | verification V6: 지정 TXT Value-only, identity 사전검사/common tolerance | NR family, I/O mapping | +| `023`, `024`, `025` | 기존 K 경로 유지 및 owned 수식/evidence 연결; 실행 결과는 주장하지 않음 | Planning TDD/MSVC/회귀, Physics/Release closure | + +## Evidence와 handoff + +실제 kernel의 PhysicalTransformation20/DrillingTransformation4와 kd 선택식, +ElementFactory의 공통 nodal director 전달을 대조했다. 원본 두 reference의 SHA-256은 +requirements/research와 일치한다. 출처와 실제 read/hash 명령·미실행/위험은 +[verification V7](formulation-verification.md)에 있다. +Source/reference/upstream을 편집하지 않았고 수치 실행 결과를 통과로 보고하지 않는다. + +현재 새 physics/scope/compatibility 선택이나 사용자 미결정은 없다. +Numerical Review는 [verification V6](formulation-verification.md)의 dimensionless metric, +zero branch, analytic rank와 finite algorithm을 독립 검토하여 threshold, FEAST control/budget, +필수 benchmark 및 reference mode/frame family를 고정한다. I/O는 영속 schema를 정의한다. +이번 formulation stage는 완결된 수학 계약을 NR에 인계하며, 실제 구현 진입에 필요한 +전체 계약 bundle은 NR의 수치 기준과 후속 I/O/planning 이후 완성된다. +Count의 floating-point 한계, near-null conditioning, shifted sparse fill와 보수적 count +scratch 비용은 아직 실제 runtime evidence가 필요하다. Release readiness를 주장하지 않는다.