diff --git a/docs/business-rules.md b/docs/business-rules.md index db73b5d..98cadb0 100644 --- a/docs/business-rules.md +++ b/docs/business-rules.md @@ -53,6 +53,32 @@ procedure의 검증을 모두 통과한 candidate만 accepted state와 history 시점부터 적용한다. 반력은 열저장까지 포함한 full residual의 constrained projection이다. 중앙면 양쪽 flux trace는 서로 다른 위치이며 평균하지 않는다. +## MITC4 drilling의 선택과 인공 모멘트 + +현재 모델 전체는 한 코드 설정으로 직접 초기 director 스프링 또는 기존 상대 비틀림을 +선택한다. 기본값은 직접 스프링이며 선형·비선형 정적·정적 pressure·frequency·HHT에 +같이 적용한다. Beam·Hex8·DS4에는 적용하지 않는다. Runtime·section별 선택은 현재 없다. + +직접 방식에서 `d0`는 초기 global 단위 director, `phi`는 전체 global rotation vector다. +`gamma=d0·phi`, `Udrill=0.5*kd*sum(gamma²)`, `frot=kd*gamma*d0`, +`Krot=kd*d0*d0^T`다. 병진·절점 간 coupling·drilling force의2차 방향미분은 exact zero다. +Kd는 BC 전 초기 physical rotary 대각8개의 overflow 방지 평균에 `1e-3`을 곱해 고정한다. +Zero 대각도 평균에 포함하며 음수/nonfinite·전부 zero·nonpositive kd는 실패다. +Floor·density 치환·trial 재조정은 없다. 유한 강체 회전의 인공 에너지·모멘트는 허용한다. + +직접 HHT hidden 식은 실제 관성의 normalized null `n(phi)`에 대해 +`sum_e kd*gamma_ei*(n·d_ei0)-n·Fext_rot`이며 같은 trial의 고차 미분을 사용한다. +공유 node의 외력 항은 한 번만 뺀다. 일정 drilling 접선이 null의 고차 미분을 없애지는 않는다. +기존 방식의 계산은 polar1·관성3차 근사와 기존 판정을 보존하며 정확도 실패를 자동 수정하지 않는다. + +내부 spatial `Mdrill=sum[x cross fdrill_trans+Jl(phi)^(-T)*fdrill_rot]`를 source 순서로 +누적한다. 선형은 reference 위치/작은 회전, 비선형/HHT는 현재 위치/기존 SO(3) 변환이다. +기존 raw 평형은 그대로이고 보정 평형은 `[raw_force,raw_moment-Mdrill]`다. +직접 방식의 기존 전역 gate만 보정값을 사용하고 기존 방식은 raw를 사용한다. +기존 scale·exact-zero·허용치는 유지하며 인공 모멘트를 분모에 더하지 않는다. +비선형 정적의 전역 수치 gate는 기존 reference 비교기에 있으며 procedure에 새 gate를 만들지 않는다. +Marker 없는 옛 결과의 방식은 미상이다. 선형/HHT 변위 비교기에는 새 평형 수치 family를 만들지 않는다. + ## 외부 수치 비교 먼저 source identity·row 집합·component·schema·단위·좌표·위치와 finite 여부를 검사한다. diff --git a/docs/contracts.md b/docs/contracts.md index 868b542..392ac9c 100644 --- a/docs/contracts.md +++ b/docs/contracts.md @@ -95,6 +95,40 @@ Schema·필수 field·dtype·shape·inventory·finite 불일치는 읽기나 비 누락을 0·NaN·기본 marker로 채워 이용하지 않는다. Mode shape는 응답 변위가 아니며 frequency와 raw lambda도 다른 양이다. 작은 음의 lambda를 abs/clamp하여 raw 값을 바꾸지 않는다. +## MITC4 drilling 추가 진단 + +기존 feature/procedure/schema 번호를 유지한다. 새 MITC4 구조 결과는 실제 계산한 state의 +방식을 저장하며 writer가 현재 코드 기본값으로 추정하지 않는다. Beam·Hex8·thermal의 +metadata·dataset·report 계약에는 아래 필드를 추가하지 않는다. + +| 위치 | 필드 | 형식과 의미 | +| --- | --- | --- | +| `/metadata` attribute | `mitc4_drilling_formulation` | UTF-8 scalar; `direct-initial-director-spring` 또는 `legacy-corotated-twist` | +| `/metadata` attribute | `drilling_diagnostics_version` | U64LE scalar, 1 | +| `/steps/Step-1/frames//global` | `drilling_moment` | F64LE `[3]`, global spatial 내부 복원모멘트 XYZ, force×length | +| 같은 위치 | `equilibrium_with_drilling` | F64LE `[6]`, raw force XYZ와 raw moment에서 drilling moment를 차감한 XYZ | + +기존 `global/equilibrium`이 있는 선형/비선형 정적·HHT의 모든 frame에 두 dataset을 +추가하며 HHT frame0도 포함한다. Eigen에는 두 metadata attribute만 추가하고 가상 평형 +frame을 만들지 않는다. Raw equilibrium의 기존 값·단위·의미는 유지한다. + +일반 reader의 두 marker가 모두 없는 옛 파일은 옛 계약으로 읽고 진단은 미상/null이다. +한 marker만 있거나 알 수 없는 방식/version·필수 dataset 누락·dtype/shape/finite 오류는 +실패다. 모든 applicable frame에서 보정 force는 raw와 같고 보정 moment는 binary64의 +`raw-Mdrill`과 정확히 같아야 한다. 작은 값에 absolute tolerance를 더해 허용하지 않는다. +새 candidate self-check는 actual state로 marker 필요 여부를 판단하므로 두 marker를 +모두 삭제해도 옛 파일로 오인해 통과시키지 않는다. Write·close·readback·최종 교체 실패는 +이전 최종 HDF5를 보존한다. + +기존 MITC4 JSON report는 schema/version·기존 키를 유지하고 `drilling_diagnostics`를 +추가한다. 옛 markerless 결과는 `null`이다. 새 값은 `formulation` 문자열, `version:1`, +`frames` 배열이다. 각 frame은 `storage_step:"Step-1"`, 정수 `frame_index`, +숫자 배열 `raw_equilibrium[6]`, `drilling_moment[3]`, `equilibrium_with_drilling[6]`을 +가지며 storage frame 번호 순서로 나열한다. 기존 C++ typed report도 같은 정보를 보존한다. +Eigen typed 진단의 frames는 빈 배열이며 별도 eigen JSON API를 새로 만들지 않는다. +비선형 정적의 기존 moment family만 marker에 따라 판정값을 고른다. 선형/HHT 비교기는 +진단을 사전검사하며 기존 family·U blocking/UR warning·수치 verdict를 유지한다. + ## C++ consumer와 비교 도구 공개 interface는 `include/fesa`의 backend-neutral 값과 `Status`/`Result`를 사용한다. diff --git a/docs/engineering-notes.md b/docs/engineering-notes.md index cd5bc26..f7c8160 100644 --- a/docs/engineering-notes.md +++ b/docs/engineering-notes.md @@ -1,5 +1,34 @@ # 재현된 함정과 대응 +## 작은 직접 스프링에서 중간 곱이 먼저 사라진 경우 + +양의 subnormal kd에 먼저 `0.5*kd`를 계산하면 energy의 AD 미분에서 force/tangent가 +사라질 수 있다. 직접 force와 일정 tangent는 명시적 선형식으로 계산하고 energy는 +`0.5*gamma*(kd*gamma)`로 평가한다. 양의 작은 scale을 floor로 올리는 대응은 하지 않는다. +독립 tiny-scale oracle로 energy·force·tangent를 각각 검사했다. + +## 관성 null과 drilling primitive가 달라진 경우 + +Cubic 관성의 실제 null은 정확 SO(3)의 closed null과 다르다. 직접 스프링의 hidden +미분에 후자를 사용하면 실제 관성과 다른 제약을 풀게 된다. 실제 cubic Exp/Jacobian의 +normalized solve와 그 미분을 사용한다. 별도 physical force의 null 투영도 정확히0이라고 +가정할 수 없어 `n^T(full force-external)`로 canonical drilling scalar를 재구성하지 않는다. +Full mass/null·triad·physical residual gate는 그대로 남으며 이 선택이 기존 D3 실패를 해결하지는 않는다. + +## 빈 null과 미평가 scalar를 혼동한 경우 + +방향 응답을 요청하지 않은 assembly의 canonical scalar가 비어 있다는 이유만으로 +all-rotation-fixed/all-fixed 초기화를 거부했던 회귀를 재현했다. Scalar는 실제 admissible +null이 소비할 때 요구한다. 필요한 scalar의 누락/Inf는 계속 실패이며 미평가를0으로 채우지 않는다. +방식이 다른 cache도 typed configuration identity로 구별한다. + +## 새 candidate를 옛 markerless 파일로 오인한 경우 + +호환 reader만으로 새 파일을 검사하면 marker 두 개를 모두 지운 candidate가 옛 파일로 +읽힐 수 있다. Writer self-check는 actual state의 진단 존재를 별도로 요구한다. +양 marker/양 dataset 삭제와 write/readback close 실패 주입에서 이전 final bytes 보존을 확인했다. +일반 옛 파일 reader의 null 진단은 유지하며 형식 검사를 위한 tolerance floor를 추가하지 않는다. + ## 긴 임시 경로가 출력 충돌처럼 보인 경우 Integration 검증에서 TMP 아래 lease 경로가 260/261자가 되어 `output-busy`가 발생했다. diff --git a/docs/hht-implicit-dynamics/README.md b/docs/hht-implicit-dynamics/README.md index 03faa99..d6209b4 100644 --- a/docs/hht-implicit-dynamics/README.md +++ b/docs/hht-implicit-dynamics/README.md @@ -2,6 +2,22 @@ ## 범위와 현재 상태 +2026-10-20 현재 drilling 기본값은 `gamma_i=d_i0·phi_i`의 직접 작은 스프링이며 +기존 상대 비틀림도 모델 전체의 코드 설정으로 선택한다. 직접 경로는 drilling용 +polar/swing/twist를 생략하고 physical 회전·관성·고정 null 기저·시간적분은 유지한다. +직접 hidden scalar는 실제 cubic 관성이 계산한 normalized null `n_i(phi)`에 대해 +`sum_e kd*gamma_ei*(n_i·d_i0)-n_i·Fext_rot`다. 그 같은 식의 gradient·Hessian· +필요한 3차 방향미분을 사용한다. 초기 director를 현재 null로 고정하지 않는다. + +현재 source `6bbbb2b`를 전체 실행한 Debug Native/CTest는 각각1035개 중 +1024 PASS·기존10 FAIL·1 INCONCLUSIVE SKIP이며 별도 Python164개는 PASS다. +정식729node·101frame Direct Release 해석과 외부9node U의101 families 비교는 +CLI0/비교0, 최대 정규화 RMS0.2282326248391787%로 통과했고 UR 경고200개를 유지했다. +기존 방식은 별도 Debug의 관련 검사와 실제 소형3frame HHT 출력을 확인했다. +729node 기존 방식의 외부 U 재해석은 이번에 하지 않았다. 과거 결과를 현재 PASS로 승계하지 않는다. +기존10개 물리 실패·N7 미판정·정식 자료 누락이 남으므로 전체 검증 완료는 아니다. +아래 2026-10-19 수용 기록은 이전 수렴 실험의 결정이며 현재 전체 PASS를 뜻하지 않는다. + 2026-10-19 후속 사용자 승인으로 이번 수렴 규칙 실험은 **Abaqus 변위 검증 통과·실패10개 보류로 조건부 완료**한다. [수용 범위](../tracking/decisions/0011-tolerance-experiment-acceptance.md)를 따르며, 아래 미해결 물리 검사· N7와 실제 FAIL/SKIP은 보존한다. 전체 상태729절점·101프레임 진단과 관측 시간 비교는 @@ -76,7 +92,7 @@ Schema identity는 `(hht-implicit-dynamics,hht-implicit-dynamics,2)`다. `reduced-coordinate-HHT-with-physical-rate-reconstruction`, `mass_formulation=nodal-lumped-kinetic`, `acceleration_convention=physical-endpoint-and-auxiliary-separated`다. -모든 result dataset version도 2이며 A의 quantity_semantics는 +기존 schema2 result dataset의 version은2이며 A의 quantity_semantics는 `full-chart-HHT-filter-combination-not-predictor-driver`다. 잘못된 marker·혼합 version·mass· inventory·nonfinite는 dynamic-output-schema 실패다. Historical v1 reader branch는 과거 full-coordinate 결과만 읽으며 marker를 보충하거나 v2로 재표시하지 않는다. @@ -92,6 +108,13 @@ inventory·nonfinite는 dynamic-output-schema 실패다. Historical v1 reader br | nodal/reaction | [N,6]; support-on-structure spatial RF/RM, moment는 Jl^-T 변환 | | element/shell/local_frame, generalized_strain, section_resultant, stress | [E,4,3,3], [E,4,8], [E,4,8], [E,4,3,3]; stress는 bottom/middle/top × S11/S22/S12 | | global/energy, global/equilibrium | [5] kinetic/physical/drill/work/defect, [6] 관성 포함 force/moment balance | +| global/drilling_moment, global/equilibrium_with_drilling | [3] 내부 spatial drilling moment, [6] raw force와 raw moment에서 drilling moment를 차감한 진단; frame0 포함 | + +새 MITC4 출력에는 실제 방식의 UTF-8 `mitc4_drilling_formulation`과 U64LE +`drilling_diagnostics_version=1`을 metadata에 추가한다. 기존 schema2와 raw equilibrium은 +유지한다. 직접 방식의 기존 전역 gate만 보정 moment를 사용하고 기존 방식은 raw 판정이다. +Marker 없는 옛 결과는 방식 미상이며 새 진단을 추정하지 않는다. 변위 비교기는 새 진단의 +모든 frame을 사전검사하지만 새 평형 수치 family나 verdict를 만들지 않는다. Row는 model source inventory와 결합한다. Generalized moment와 spatial moment, physical a와 A, drilling force와 physical stress를 혼합하지 않는다. 영 BC는 q/v/a/A exact zero다. diff --git a/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md b/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md index 7c9600f..75437e3 100644 --- a/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md +++ b/docs/hht-implicit-dynamics/formulation-fixed-null-basis.md @@ -16,12 +16,18 @@ component selector를 아래 고정 ON 기저로 대체한다. 기존 ## 1. 적용 가정과 물리 계약 Total Lagrangian MITC4, 큰 변위·유한회전·작은 탄성 변형률, 등방 선형 탄성, -objective drilling potential, `nodal-lumped-kinetic`, 기존 공간 적분·두께 적분과 +선택한 drilling potential, `nodal-lumped-kinetic`, 기존 공간 적분·두께 적분과 fixed-initial total rotation vector를 유지한다. 재료 history update는 없다. 관성·내력·공간 각속도·단면력은 [기존 물리 정식화](formulation.md)와 [관성 상세](formulation-inertia.md)가 소유한다. 좌표 변경은 constitutive law, mass measure, drilling stiffness 또는 recovery formula를 바꾸지 않는다. +2026-10-20 기본 직접 스프링은 별도로 승인한 numerical potential 변경이다. +고정 기저·partial-BC 교집합·graph/rate 복원·regularity 계약은 유지하며, hidden primitive만 +직접 힘과 실제 cubic 관성 null에서 일관되게 계산한다. 기존 objective twist를 선택하면 +그 현행 계산과 판정을 보존한다. 현재 null을 초기 director로 고정하거나 partial BC를 +full clamp로 바꾸어 새 스프링의 rank/regularity 실패를 피하지 않는다. + Full node-major ordering은 `q_i=(u_x,u_y,u_z,phi_X,phi_Y,phi_Z)`다. `u`: length, `phi`: rad, `v=dot q`, `a=ddot q`이며 `v_phi`와 `a_phi`는 공간 각속도·각가속도가 아니다. Zero fixed BC를 제거한 공간에서 diff --git a/docs/hht-implicit-dynamics/formulation-inertia.md b/docs/hht-implicit-dynamics/formulation-inertia.md index fcfdbbb..b367d16 100644 --- a/docs/hht-implicit-dynamics/formulation-inertia.md +++ b/docs/hht-implicit-dynamics/formulation-inertia.md @@ -10,6 +10,14 @@ ## 1. 회전과 관성의 미분 +2026-10-20 drilling 선택 변경은 아래 관성의 수학 유도나 현행 cubic 근사 차수를 바꾸지 +않는다. 기본 직접 스프링의 hidden 미분은 실제 cubic 관성 null을 사용한다. 아래 정확 +SO(3) 유도와 현재 근사 구현의 D3/null 항등식 검증 상태를 구분한다. +직접 스프링은 유한 강체 회전에서 인공 내부 spatial moment `Mdrill`을 허용하므로, +아래 objective total energy의 무일 가정은 직접 drilling에 적용하지 않는다. +Raw 관성 포함 평형을 보존하고 직접 방식의 기존 전역 gate에는 moment에서 `Mdrill`을 +차감한다. 기존 방식은 raw 판정이며 physical mass·momentum·a/A·history 정의는 그대로다. + `P=[phi]_×`, `theta=|phi|`에 대해 \[ diff --git a/docs/hht-implicit-dynamics/formulation-reduced-coordinate.md b/docs/hht-implicit-dynamics/formulation-reduced-coordinate.md index 8aa87b4..2de3b57 100644 --- a/docs/hht-implicit-dynamics/formulation-reduced-coordinate.md +++ b/docs/hht-implicit-dynamics/formulation-reduced-coordinate.md @@ -15,7 +15,16 @@ physics와 graph/rate 계약은 유지하되, identity-coordinate 전용 설명 그대로 적용하지 않는다. 실제 augmented scaling·초기화·CA/N7의 새 basis 경계는 해당 상세 문서를 따른다. -기존 Total Lagrangian MITC4, objective numerical drilling potential, isotropic linear elasticity, nodal lumped kinetic measure, 공간 적분과 fixed-initial global chart를 유지한다. 좌표는 node-major `q=(u_x,u_y,u_z,phi_X,phi_Y,phi_Z)`, `v=dot q`, `a=ddot q`; 병진 단위는 length, 회전은 rad다. 질량 추가, damping, stiffness modification, stress averaging은 없다. 공개 load subset은 기존 constant global force, 구속은 fixed zero다. 아래 smooth F(t)의 시간미분은 C08a 내부 manufactured oracle에만 해당한다. +기존 Total Lagrangian MITC4, 선택한 numerical drilling potential, isotropic linear elasticity, nodal lumped kinetic measure, 공간 적분과 fixed-initial global chart를 유지한다. 좌표는 node-major `q=(u_x,u_y,u_z,phi_X,phi_Y,phi_Z)`, `v=dot q`, `a=ddot q`; 병진 단위는 length, 회전은 rad다. 질량 추가, damping, stress averaging은 없다. 공개 load subset은 기존 constant global force, 구속은 fixed zero다. 아래 smooth F(t)의 시간미분은 C08a 내부 manufactured oracle에만 해당한다. + +2026-10-20 기본 직접 스프링의 primitive는 +`psi_ei=kd*(d_i0·phi_i)*(n_actual(phi_i)·d_i0)`다. `n_actual`은 기존 +`EvaluateDynamicRotation`의 cubic Exp/Jacobian에서 계산한 `normalize(J_cubic^-1*d_cubic)`를 +사용하며, 아래 정확 SO(3)의 closed 식으로 대체하지 않는다. Shared node에서 요소별 +primitive를 source 순서로 합하고 `n_actual·Fext_rot`을 한 번만 뺀다. +Gradient·Hessian·3차 방향미분도 같은 primitive와 실제 null에서 유도한다. +Metric은 `sum_e kd*grad(gamma_ei)*grad(gamma_ei)^T`다. Force의 일정 접선을 이유로 +null의 고차 미분을 지우지 않는다. 다음 `k*S*gamma`는 기존 상대 비틀림 방식의 유도다. Zero constrained 성분을 정확히 제거한 free 공간에서 @@ -32,7 +41,14 @@ S_i=1/\|J_l^{-1}d_i\|. \tag{RC-02} \] -이는 기존 `drilling_constraint`의 scalar이며 raw twist gamma가 아니다. Physical force의 null work가 0인 정확 identity를 사용하므로 energy의 4차 tensor는 필요 없다. Translation force의 null work는 0이다. Shared node external term은 한번만 추가한다. +이는 기존 `drilling_constraint`의 scalar이며 raw twist gamma가 아니다. 이 유도는 physical force의 null work가 0인 정확 identity를 사용하므로 energy의 4차 tensor는 필요 없다. Translation force의 null work는 0이다. Shared node external term은 한번만 추가한다. + +현재 cubic 관성에서는 별도로 계산한 physical force의 null 투영이 이 정확 identity를 +항상 만족하지 않는다. 직접 방식의 hidden scalar를 `n^T(fphysical+fdrill-Fext)`로 +재구성하면 primitive 미분과 다른 식이 되므로 canonical scalar를 그대로 사용한다. +Full mass/null·physical residual·triad acceptance는 별도로 유지하며 근사 오차를 숨기지 않는다. +빈 admissible null inventory에는 scalar를 요구하지 않고, 필요한 null이 있을 때 미평가 +scalar를0으로 치환하거나 사용할 수 없는 directional 응답을 재사용하지 않는다. ## 2. Fixed graph와 부분 구속 diff --git a/docs/linear-static-mitc4-shell/README.md b/docs/linear-static-mitc4-shell/README.md index 3ffc967..67161d4 100644 --- a/docs/linear-static-mitc4-shell/README.md +++ b/docs/linear-static-mitc4-shell/README.md @@ -11,6 +11,13 @@ Composite·offset·material nonlinearity·mixed beam-shell은 이 기능 범위 ## 채택한 수식과 이유 +2026-10-20부터 모델 전체의 drilling 방식은 코드의 단일 설정으로 선택한다. +기본 `kDirectSpring`은 초기 global 단위 director `d0`와 전체 회전 `phi`에 대해 +`gamma=d0·phi`, `Udrill=0.5*kd*sum(gamma²)`를 사용한다. +`kLegacyCorotatedTwist`는 기존 상대 비틀림 방식이다. 선형 정적과 원형상 고유치의 +drilling block은 두 선택에서 같으며, 차이를 만들기 위해 physical 강성을 바꾸지 않는다. +직접 방식은 유한 강체 회전의 인공 에너지·모멘트를 허용한다. + 각 절점의 6 global DOF에서 director 접평면의 5 physical DOF를 분리한다. Bilinear geometry와 canonical edge-midpoint tying으로 공변 횡전단장을 보간한다. 이는 직접 shear interpolation의 locking을 줄이기 위한 MITC 선택이다. @@ -48,6 +55,11 @@ Key는 frame·instance·source node·component이며 row-set·finite·unit/locat 그 밖은 relative error `<=5%`, family `RMS(error)/S<=1%`를 동시에 요구한다. `S=0`은 exact zero다. UR 수치 실패는 warning이며 잘못된 identity를 허용하는 의미는 아니다. 내부 free residual·전역 force/moment balance는 normalized `1e-10` 한계다. +직접 방식의 기존 전역 gate는 raw moment에서 별도 내부 spatial drilling moment를 +차감한 값을 사용한다. 기존 방식은 raw 판정을 유지하며 분모·허용치는 같다. +기존 `global/equilibrium`은 raw 값이다. 새 파일에는 실제 방식과 진단 version, +`global/drilling_moment[3]`, `global/equilibrium_with_drilling[6]`을 추가한다. +선형 변위 비교기에 새 평형 수치 family를 추가하지 않고 진단의 형식·관계만 사전검사한다. ## 구현과 데이터 흐름 @@ -61,6 +73,11 @@ Procedure는 해석 상태, writer는 serialization을 소유하며 element에 e ## 검증 의미와 한계 +2026-10-20 source `6bbbb2b`의 두 방식 별도 실행에서 정식 S4 입력의 생성·U 비교를 +통과했고 실제 선형 변위도 정확히 같았다. 직접 방식의 인공 torque·보정 부호·실제 +불평형 거부 검사를 포함했다. 전체 Debug 검사는 Native/CTest 각각 +1035개 중1024 PASS·기존10 FAIL·1 INCONCLUSIVE SKIP으로 전체 수치 검증 통과는 아니다. + 과거 S4 reference는 147 blocking U rows와 평형·대칭·constitutive·physical energy 검사를 통과했다. 그때 중심 U3는 약 `-2.35504418e-5`, normalized free residual은 약 `1.08e-14`였다. 이는 당시 실행 evidence이며 이번 문서 정리에 따른 현재 build/test 통과 선언이 아니다. diff --git a/docs/linear-static-mitc4-shell/formulation.md b/docs/linear-static-mitc4-shell/formulation.md index ecb787b..3aa2574 100644 --- a/docs/linear-static-mitc4-shell/formulation.md +++ b/docs/linear-static-mitc4-shell/formulation.md @@ -5,7 +5,14 @@ > > 적용 경계: 물리 정식화와 당시 수치 stabilization 유도를 구분한다. 현재 공변 trace-average > scale·frozen lifecycle은 [고유치 질량·stabilization](../mitc4-shell-feast-eigen2/formulation-mass-stabilization.md)을 -> 함께 따른다. 이전 minimum-diagonal 식을 현재 기준으로 재도입하지 않으며 S3 partial-BC 보류를 유지한다. +> 함께 따른다. 이전 minimum-diagonal 식을 현재 기준으로 재도입하지 않는다. +> +> 2026-10-20 채택: 단일 코드 설정의 기본값은 초기 director 직접 스프링이며 기존 상대 +> 비틀림도 선택한다. 선형/eigen의 drilling block과 trace-average scale은 두 방식에서 같다. +> 직접 방식의 기존 전역 moment gate는 raw에서 별도 내부 drilling moment를 차감한다. +> 아래 초기 문서의 drilling 전용 출력 금지와 objective nonlinear 후보 설명은 당시 범위다. +> 현재는 실제 방식 metadata와 raw/인공/보정 평형을 별도로 저장하며, 직접 방식의 유한 +> 강체 회전 인공 에너지를 허용한다. 물리 MITC strain·constitutive·적분 유도는 유지한다. ## Metadata diff --git a/docs/mitc4-shell-feast-eigen2/README.md b/docs/mitc4-shell-feast-eigen2/README.md index d56b8aa..0569305 100644 --- a/docs/mitc4-shell-feast-eigen2/README.md +++ b/docs/mitc4-shell-feast-eigen2/README.md @@ -15,6 +15,9 @@ Mass는 `3×3×3` 적분의 scalar thickness moments를 row-sum하여 nodal `6× 3 병진·2 director 접평면 회전 관성과 warped geometry cross coupling을 보존한다. Numerical drill은 analytic mass null이며 인공 drilling inertia를 넣지 않는다. Stabilization scale은 초기 physical rotary diagonal 8개 trace 평균의 `10^-3`이다. +2026-10-20부터 모델 전체의 코드 설정은 직접 초기 director 스프링을 기본으로 하며 +기존 상대 비틀림도 선택할 수 있다. 원형상 eigen의 K/M과 drilling block은 두 방식에서 +같다. Artificial drilling mass를 추가하거나 서로 다른 spectrum을 만들지 않는다. Global 실제 BC를 먼저 적용하고 analytic null과 free 공간의 교집합만 제거한다. Partial rotational BC를 full clamp로 대체하지 않고 finite constrained spectrum을 유지한다. Positive nodal mass space를 whitening하고 sparse symmetric 문제를 FEAST에 전달한다. @@ -41,6 +44,9 @@ HDF5는 `schema_version=0`, `eigen_schema_version=1`, procedure `linear-frequenc 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를 보존한다. +실제 선택은 `/metadata`의 `mitc4_drilling_formulation`과 U64LE +`drilling_diagnostics_version=1`에 기록한다. Eigen에는 평형 frame이나 가상 drilling +moment dataset을 만들지 않는다. Typed 비교 report의 진단 frames도 빈 배열이다. | 원본 | 비교 계약 | | --- | --- | @@ -69,10 +75,16 @@ Domain→local K/M→ordered assembly→reduced solve→global phi 복원→all- ## 실제 evidence와 미해결 범위 +2026-10-20 source `6bbbb2b`의 두 방식 별도 실행에서 정식10-mode 생성·비교를 통과했고 +실제 eigen table은 정확히 같았다. 전체 Debug Native/CTest는 각각1035개 중 +1024 PASS·기존10 FAIL·1 INCONCLUSIVE SKIP이다. 해당 Value 비교 통과와 전체 물리 검증을 구분한다. + 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 정확도 개선은 후속 보류다. +S3 partial-BC의 public static은 직접 방식에서 인공 모멘트 차감 후 기존 gate를 통과한다. +기존 방식의 raw gate 실패는 명시적 검사로 보존했다. 이는 partial BC를 full clamp로 +바꾸거나 Value 허용치를 완화한 해결이 아니다. Abaqus Value 정확도 개선은 후속 보류다. 실제 512회 vendor 호출 또는 실제 HDF5 close-error의 모든 조합을 주입한 것은 아니다. Retained shell/shellNL 회귀와 내부 검증 의무를 유지하며 `reference/temp` 제외 예제를 재사용하지 않는다. diff --git a/docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md b/docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md index d554302..8acdfbc 100644 --- a/docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md +++ b/docs/mitc4-shell-feast-eigen2/formulation-mass-stabilization.md @@ -136,7 +136,14 @@ spectrum·static response의 공변성을 검증한다. 다른 BC를 같은 문 여섯 물리 rigid modes는 양의 mass를 갖는다. Pure numerical drill `[0;di]`는 mass=0, stiffness>0이다. Linear UR에 full spatial Omega를 넣는 field와 이 physical 대표값을 구분한다. -## S2. 비선형 objective potential과 고정 scale +## S2. 비선형 drilling 선택과 고정 scale + +2026-10-20 현재 기본값은 초기 global 단위 director `d_i0`를 사용한 직접 스프링이다. +`gamma_i=d_i0·phi_i`, `Pi_d=0.5*kd*sum(gamma_i²)`, +`r_i=kd*gamma_i*d_i0`, `K_ii=kd*d_i0*d_i0^T`이며 병진·절점 간 coupling은0이다. +Drilling polar/swing/atan2를 평가하지 않고 유한 강체 회전의 인공 모멘트를 허용한다. +S1의 초기 scale과 mass null은 유지한다. 원형상 선형/eigen block은 두 방식에서 같다. +다음 objective 유도는 선택 가능한 기존 상대 비틀림 방식에 한정한다. 기존 [nonlinear 정식화 §10](../nonlinear-static-newton-raphson/formulation.md)의 polar corotation, total nodal rotation, minimal swing 및 objective `gamma_i=atan2(s_i,c_i)`를 @@ -148,7 +155,9 @@ corotation, total nodal rotation, minimal swing 및 objective `gamma_i=atan2(s_i K_d=k_d\left(D_\gamma^TD_\gamma+\sum_i\gamma_iD^2\gamma_i\right). \tag{S2} \] -Polar/swing/atan2의 미분과 branch validation을 생략하지 않는다. Trial마다 scale을 바꾸지 않는다. +기존 방식에서는 polar/swing/atan2의 미분과 branch validation을 생략하지 않는다. +현행 구현의 polar1과 미분 정확도 실패를 보존하며 과거 polar12로 복원하지 않는다. +두 방식 모두 trial마다 scale을 바꾸지 않는다. 일반 nonlinear Hessian 전체의 SPD는 주장하지 않는다. 초기에도 Dgamma는 corotation coupling을 포함하므로 linear Td와 동일시하지 않는다. 기존 physical 선형극한, directional residual/Hessian, objective rigid orbit·state rollback을 검증한다. 새 eigen에는 이 nonlinear state를 전달하지 않는다. @@ -173,3 +182,7 @@ Static 대응 load는 node1의 tangent moment `m=(5/3)M0 b`, 다른 load=0이다 `d·m=0,mZ=M0`; `theta1Z=M0/Kff`, full residual `r=Kq-F`다. 회전 뒤 `m'=Qm`을 사용한다. Pure global eZ moment는 drilling 성분 때문에 기존 load 계약에 부합하지 않는다. Eigen의 constrained residual을 static reaction으로 출력하지 않는다. + +2026-10-20 현재 이 static 사례의 직접 방식은 별도 인공 spatial 모멘트를 차감한 기존 +gate를 통과하고, 기존 방식은 raw gate에서 계속 거부된다. S3의 K/M/lambda target이나 +partial BC를 바꾼 결과가 아니며 Value 비교 예외를 정적 평형에 적용하지 않는다. diff --git a/docs/nonlinear-static-newton-raphson/README.md b/docs/nonlinear-static-newton-raphson/README.md index e80d2ae..463ef56 100644 --- a/docs/nonlinear-static-newton-raphson/README.md +++ b/docs/nonlinear-static-newton-raphson/README.md @@ -2,6 +2,11 @@ ## 목적과 경계 +2026-10-20 현재 drilling 기본값은 초기 director의 직접 작은 스프링이다. +모델 전체의 한 코드 설정으로 기존 상대 비틀림도 선택하며 정적 pressure에도 같은 +선택을 적용한다. 직접 방식은 drilling의 polar/swing/twist 계산을 생략한다. +아래 polar 근사 실험의 실패는 보존한 기존 방식의 근거이며 직접 스프링 식을 뜻하지 않는다. + 2026-10-18 후속 사용자 지시의 [local 근사 실험](../abaqus-tolerance/local-kernel-experiment.md)에서 공유 nonlinear MITC4의 polar 반복을 12→1회로 변경했다. 후속 사용자 지시로 관련 접선 테스트 오차를 1e-3으로 완화한 뒤에도 drilling constraint의 gradient 항등식 검사가 @@ -20,8 +25,12 @@ 초기 director/frame에서 같은 trial의 기하·strain·internal force·consistent tangent를 계산한다. Rotation-vector generalized moment와 global spatial moment는 일의 짝이 다르다. 반력의 공개 moment 복구에서 chart 변환을 적용하며 성분명 변경으로 대체하지 않는다. -Physical MITC strain·constitutive response와 objective numerical drilling potential을 분리한다. +Physical MITC strain·constitutive response와 선택한 numerical drilling potential을 분리한다. Drilling scale은 초기 상태에서 정하고 trial마다 다시 tuning하지 않는다. +직접 방식은 `gamma_i=d_i0·phi_i`, `f_i=kd*gamma_i*d_i0`, +`K_ii=kd*d_i0*d_i0^T`다. 병진과 절점 간 drilling coupling은 exact zero다. +유한 강체 회전에도 인공 복원모멘트가 생기는 것을 허용한다. 기존 방식의 objective +유도와 polar1 구현을 이 직접 방식에 적용하지 않는다. 평형 residual은 internal minus external이며 follower load가 있으면 tangent는 `Kint-dFext/dq`다. Unsymmetric tangent를 대칭화하지 않는다. @@ -58,6 +67,11 @@ Accepted free residual은 matching external scale이 nonzero이면 infinity-norm exact-zero이면 typed absolute `<=1e-3` force 또는 force-length다. Factor-one 전역 force/moment balance는 각각 normalized `<=1e-8`이다. 이는 기존 comparator의 승인 계약이며 두 양을 하나의 `1e-10` 기준으로 요약하지 않는다. Linear 정적·HHT·eigen의 별도 gate는 바꾸지 않는다. +이 전역 수치 판정은 기존 reference 비교기의 책임이다. Procedure에 새 전역 gate를 +만들지 않는다. 비교기는 직접 방식 marker일 때 기존 moment family에 +`raw_moment-Mdrill`을, 기존 방식·marker 없는 옛 파일에는 raw 값을 사용한다. +`Mdrill`은 현재 위치의 병진 모멘트팔과 `Jl(phi)^(-T)`로 변환한 내부 drilling +모멘트의 source 순서 합이다. 분모에 인공 모멘트를 더하지 않는다. ## 구현과 상태 수명 @@ -73,8 +87,14 @@ Domain→non-owning model→stable full/free DOF→local trial response→ordere ## 검증에서 배운 점과 남은 경계 +2026-10-20 source `6bbbb2b`의 기본 직접 방식과 별도 기존 방식에서 정식 coarse +nonlinear 입력의 생성·기존 비교를 통과했다. 두 방식의 저장·reader·원자적 실패 보존도 +검사했다. 보존한 기존 방식의 gradient 항등식은 차이 약0.00329135로 계속 실패하며, +전체 Native/CTest 각각1035개는1024 PASS·10 FAIL·1 INCONCLUSIVE SKIP이다. +이는 현재 실행 결과이며 아래 과거 기록이나 coarse U 통과로 모든 비선형 검증을 대체하지 않는다. + 기존 nonlinear reference와 rollback·finite rotation·tangent·equilibrium 검증 기록이 있다. -이는 새 revision의 build/test 통과를 의미하지 않으며 이번 작업은 문서 정리만 수행한다. +과거 기록만으로 새 revision의 build/test 통과를 의미하지 않는다. Reaction은 단일 global 합만 맞춰 local reaction 정확성을 대체할 수 없다. 큰 자세 변화와 원점 이동에서 spatial moment balance를 함께 확인해야 한다. 외부 U 통과는 warning UR 또는 review RF/RM의 수치 일치를 뜻하지 않는다. diff --git a/docs/nonlinear-static-newton-raphson/formulation.md b/docs/nonlinear-static-newton-raphson/formulation.md index 60ded28..3a5c87c 100644 --- a/docs/nonlinear-static-newton-raphson/formulation.md +++ b/docs/nonlinear-static-newton-raphson/formulation.md @@ -5,7 +5,40 @@ > > 적용 경계: 물리 정식화와 당시 수치 stabilization 유도를 구분한다. 현재 공변 trace-average > scale·frozen lifecycle은 [고유치 질량·stabilization](../mitc4-shell-feast-eigen2/formulation-mass-stabilization.md)을 -> 함께 따른다. 이전 minimum-diagonal 식을 현재 기준으로 재도입하지 않으며 S3 partial-BC 보류를 유지한다. +> 함께 따른다. 이전 minimum-diagonal 식을 현재 기준으로 재도입하지 않는다. +> S3 partial-BC는 직접 방식의 보정 gate와 기존 방식의 raw gate를 구분한다. + +## 2026-10-20 drilling 채택 범위 + +기본값은 초기 global 단위 director `d_i0`와 total global rotation vector `phi_i`의 +직접 스프링이다. 아래 §10의 corotation·minimal swing·atan2 유도는 선택 가능한 +기존 상대 비틀림 방식의 원문으로 보존한다. 기존 구현은 기준 source +`52e321e15c70377d4318aace3f3bc64b3ea1a65c`의 polar1을 유지하며, 원문의 정확한 +객관성·미분 항등식이 이 근사 구현에서 모두 통과했다는 뜻은 아니다. + +```text +gamma_i = d_i0 · phi_i +kd = 1e-3 * average(initial physical K20 tangent-rotation diagonals, 8 entries) +Udrill = 0.5 * kd * sum_i gamma_i^2 +f_drill,i,rot = kd * gamma_i * d_i0 +K_drill,ii,rot,rot = kd * d_i0 * transpose(d_i0) +D² f_drill[v,v] = 0 +``` + +병진 force/tangent와 서로 다른 절점의 coupling은 exact zero다. Global URZ 또는 +현재 director를 `d_i0` 대신 사용하지 않는다. Scale은 BC 전 초기 physical K20에서 +기존 결정적 overflow 방지 평균으로 한 번 계산하며 zero 대각도 8개 평균에 포함한다. +음수/nonfinite 대각, 모두 zero인 대각, nonfinite/nonpositive kd는 실패다. +Clamp·floor·density 치환이나 trial별 재조정은 없다. + +직접 경로는 drilling의 polar/swing/twist/atan2를 평가하지 않는다. Physical strain· +geometry·관성 계산은 유지한다. 초기 director와 전체 회전 기준이므로 유한 강체 회전의 +인공 에너지·복원모멘트를 허용하며 아래 기존 방식의 self-equilibrated 성질을 요구하지 않는다. +내부 generalized drilling 힘은 현재 위치의 모멘트팔과 `Jl(phi)^(-T)` 변환으로 spatial +`Mdrill`을 만들고 source 순서로 누적한다. Raw 평형은 보존하고 직접 방식의 기존 moment +판정에만 `raw_moment-Mdrill`을 사용한다. 기존 방식은 raw 판정을 유지한다. +비선형 정적 procedure에는 원래 진단만 있었으며 수치 gate는 기존 reference 비교기에 있다. +새 procedure gate나 인공 모멘트를 포함한 정규화 분모를 만들지 않는다. ## 1. Metadata diff --git a/docs/operations.md b/docs/operations.md index 20ffee6..7ba5f24 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -72,6 +72,16 @@ foreach ($test_name in 'fesa_unit_tests','fesa_integration_tests','fesa_referenc 생성된 경로에서도 실제 최장 lease 경로를 확인한다. 너무 길면 승인된 짧은 작업 위치를 사용한다. +## MITC4 drilling 방식 변경 + +`src/fesa/elements/mitc4_drilling_internal.h`의 `kProductionDrillingMode` 한 곳을 바꾼다. +기본값은 `Mitc4DrillingMode::kDirectSpring`, 기존 방식은 +`Mitc4DrillingMode::kLegacyCorotatedTwist`다. 변경 후 solver·CLI·검사를 모두 rebuild한다. +같은 모델의 모든 MITC4 정적·pressure·frequency·HHT에 적용되며 CLI/INP/환경변수나 +section별 override는 현재 없다. 시험용 명시적 alternate mode 경로는 production 설정이 아니다. +서로 다른 mode의 실행물·DLL·입력 sibling 결과를 별도 위치에 두고 실제 metadata marker로 +선택을 확인한다. 선형 변위와 원형상 eigen값이 두 방식에서 같아도 정상이다. + ## CMake 보조 빌드 같은 VS x64 환경에서 로컬 CONFIG package 환경변수를 설정한 뒤 실행한다. diff --git a/docs/shell-surface-pressure-load/README.md b/docs/shell-surface-pressure-load/README.md index f589571..ca8002e 100644 --- a/docs/shell-surface-pressure-load/README.md +++ b/docs/shell-surface-pressure-load/README.md @@ -41,6 +41,11 @@ Follower 여부는 procedure로 결정하며 keyword 옵션을 조용히 무시 결과는 기존 linear schema0 또는 nonlinear schema1의 displacement/reaction·shell recovery다. 별도의 가상 pressure stress 또는 nodal averaged stress를 추가하지 않는다. Nonlinear 비교는 exact factor-one accepted frame만 사용한다. +MITC4의 직접 스프링 기본값과 기존 상대 비틀림 선택은 pressure에도 모델 전체로 적용한다. +Pressure force/tangent 정의는 그대로다. 새 방식 marker가 있는 nonlinear 비교의 기존 +moment family만 직접 방식의 `raw-Mdrill` 또는 기존 방식의 raw를 선택한다. +기존 scale·`1e-8` 기준과 U/UR 정책은 유지한다. 정식 pressure bundle 부재로 +실제 외부 pressure 비교는 아직 미완료이며 내부 pressure 검사가 이를 대신하지 않는다. | 원본 bundle | 비교 의미 | | --- | --- | diff --git a/docs/solver-core/README.md b/docs/solver-core/README.md index a08195d..f0b9db6 100644 --- a/docs/solver-core/README.md +++ b/docs/solver-core/README.md @@ -45,7 +45,7 @@ Named exception **`mitc4-eigen-first-implementation`**(2026-09-10 승인)은 eig Configure/build/test의 compiler·구성·build tree를 함께 맞추고 discovery0건·다른 compiler를 실패로 다룬다. MSVC runtime DLL staging을 확인하며 개발자 PATH의 우연한 성공을 배포 검증으로 삼지 않는다. Dense allocation 크기 곱 overflow는 할당 전에 검사한다. Header는 self-contained `.h`/guard, 파일·namespace snake_case, 타입·함수 PascalCase, 변수 snake_case, class member trailing `_`, Google 기반2-space format을 따른다. Vendor target에 FESA warning 정책을 강제하지 않는다. -현재 공백은 shell HHT의 최신 전체 검증·시간수렴, thermal 새 필수 reference, eigen S3 partial-BC 정적 충돌, 성능 목표 미달이다. 각 기능에 구체 한계를 보존한다. 기존1×1 PARDISO 반복의 heap failure는 SpMV 없는 baseline에서도 재현됐고 vendor 원인은 미확정이다. 기본 정책의 해당 크기에만 local1-thread/TLS 복원을 적용했으며 보조100회 성공을 라이브러리 전체 해결로 확대하지 않는다. +현재 공백은 shell HHT의 전체 물리·시간정확도, thermal 새 필수 reference, 기존 drilling 방식의 S3 partial-BC raw 정적 gate 한계, 성능 목표 미달이다. S3의 기본 직접 방식은 별도 인공 모멘트 차감으로 기존 gate를 통과하며 기존 방식의 raw 거부를 유지한다. 각 기능에 구체 한계를 보존한다. 기존1×1 PARDISO 반복의 heap failure는 SpMV 없는 baseline에서도 재현됐고 vendor 원인은 미확정이다. 기본 정책의 해당 크기에만 local1-thread/TLS 복원을 적용했으며 보조100회 성공을 라이브러리 전체 해결로 확대하지 않는다. ## 빌드와 직접 검사 diff --git a/docs/tracking/decisions/0012-mitc4-drilling-options.md b/docs/tracking/decisions/0012-mitc4-drilling-options.md new file mode 100644 index 0000000..2a7254e --- /dev/null +++ b/docs/tracking/decisions/0012-mitc4-drilling-options.md @@ -0,0 +1,39 @@ +# MITC4 drilling의 직접 스프링 기본값과 기존 방식 선택 + +## 상황 + +기존 비선형 상대 비틀림은 drilling의 polar·minimal swing·atan2와 고차 미분을 계산한다. +사용자는 이 계산을 생략하는 작은 직접 스프링을 기본값으로 요청했고, 초기 director와 +전체 회전 기준에서 유한 강체 회전의 인공 에너지·복원모멘트가 생기는 것을 허용했다. +기존 polar1·관성3차 근사와 정확도 실패는 별도 보존 대상이다. + +## 결정 + +모델 전체의 compile-time 설정 하나로 직접 초기 director 스프링 또는 기존 상대 비틀림을 +선택하며 기본값은 직접 방식이다. `gamma=d0·phi`, `U=0.5*kd*sum(gamma²)`를 사용하고 +초기 physical rotary 대각8개 평균의 `1e-3` scale을 고정한다. +선형·비선형 정적·pressure·frequency·HHT에 같이 적용한다. +직접 HHT hidden 미분은 실제 cubic 관성이 계산한 null과 같은 scalar에서 도출한다. + +인공 내부 spatial 모멘트를 별도로 기록한다. 기존 raw 평형을 보존하고 직접 방식의 기존 +moment gate는 raw에서 인공 모멘트를 차감한다. 기존 방식은 raw 판정·현재 계산을 유지한다. +기존 feature/procedure/schema와 외부 U/UR 기준을 바꾸지 않고 추가 marker와 진단으로 구분한다. + +## 검토한 대안 + +기존 상대 비틀림만 유지하면 drilling 회전 계산 생략 요구를 충족하지 못한다. +직접 스프링에 상대 회전 보정을 다시 넣으면 허용한 비객관성을 제거하는 대신 그 계산을 +다시 도입하게 된다. 현재는 모델·section별 runtime 입력을 늘리는 대신 한 코드 설정을 택했다. +Global URZ에만 스프링을 놓으면 기울어진 초기 director의 drilling을 나타내지 못하므로 쓰지 않는다. + +## 결과와 한계 + +직접 force의 병진·절점 간 coupling과2차 방향미분은0이지만 HHT null의 고차 미분은 필요하다. +인공 에너지를 physical stress/resultant/energy에 혼합하거나 spring 질량을 추가하지 않는다. +Raw 평형만 보고 직접 방식의 유한 강체 회전을 불평형으로 거부해서는 안 되며, 보정 분모에 +인공 모멘트를 더해 실제 불평형을 숨겨서도 안 된다. 옛 markerless 파일의 방식은 미상이다. +현재 선형/eigen block이 두 방식에서 같은 것은 정상이다. + +이 선택은 기존 근사 실험의 D3·Legacy constraint/C08·mass-null/triad 실패나 비선형 시간정확도를 +해결하는 결정이 아니다. 정식 Direct HHT U 통과와 전체 Debug의10 FAIL/1 SKIP은 함께 남는다. +공식 성능 개선이나 전체 solver correctness의 인증도 포함하지 않는다. diff --git a/docs/tracking/decisions/index.md b/docs/tracking/decisions/index.md index 6ac7aed..8ec304d 100644 --- a/docs/tracking/decisions/index.md +++ b/docs/tracking/decisions/index.md @@ -13,3 +13,4 @@ | `0009-hex8-numerics.md` | Mean-volume 강성·reference row-sum mass·high+low 상태를 사용한다. | | `0010-thermal-discretization.md` | 다섯 두께 온도점·consistent capacity·Backward Euler를 사용한다. | | `0011-tolerance-experiment-acceptance.md` | 이번 MITC4 HHT 실험은 변위 검증 통과·실패10개 보류로 수용하며 실제 FAIL/SKIP과 후속 검증을 보존한다. | +| `0012-mitc4-drilling-options.md` | 초기 director 직접 스프링을 기본으로 하고 기존 상대 비틀림을 코드로 선택한다. 인공 spatial 모멘트와 raw/보정 평형을 구별한다. | diff --git a/docs/tracking/findings.md b/docs/tracking/findings.md index 9d1051f..e86ec1d 100644 --- a/docs/tracking/findings.md +++ b/docs/tracking/findings.md @@ -1,5 +1,28 @@ # 해결되지 않은 문제 +## 2026-10-20 현재 실행과 미완료 경계 + +직접 스프링 기본 source `6bbbb2b`의 전체 Native/CTest는 각각1035개 중 +1024 PASS·10 FAIL·1 INCONCLUSIVE SKIP이다. 기존 실패를 ID뿐 아니라 현재 raw 수치와 +발생 단계로 대조했다. 새 직접 스프링 수식·저장 연결 검사는 통과했으며 아래 근사 문제를 +이번 변경에서 자동 복원하거나 허용치를 더 완화하지 않았다. + +- 관성 D3 두 검사의 첫 차이는 약0.22761592214, 명시 Legacy drilling gradient 차이는 + 약0.00329135061318이다. Legacy C08a hidden ratio는0.00123371144037로1e-3을 초과한다. +- C08 controller4개는 첫 격자(h=1/64,1/16,1/256,1/64)의 inc1에서100회 correction을 + 소진했다. 시간수렴·차수 판정 이전 실패이며 이전 통과로 대신하지 않는다. +- LargeDirect는 accepted inc1/t=.25/iteration5의 mass-null 실패, UniformTranslation의 + 유한회전 subrun은 inc2/t=.02의 triad/rotation mismatch가 유지됐다. +- N7 finest 비교 하나는 arithmetic/solve resolution의 INCONCLUSIVE SKIP이다. + +정식 직접 HHT의729nodes·101frames와9node U101 families는 이번에 실제 통과했지만 +비선형 q/v/physical a의 시간정확도와 위 독립 물리 실패를 해결하지는 않는다. +기존 방식의 대형 HHT 외부 U 재해석은 미실행이다. 별도 관련162검사 중7 FAIL은 기존5개와 +Direct 기본값 전용 검사를 잘못 포함한2개로 분리했다. 두 선택 오류도 실제 FAIL로 보존했다. +정식 fine/fine_02/pressure·새 thermal 자료는 없으며 `reference/temp`를 쓰지 않았다. +이 미완료는 승인된 근사 정확도 조사와 외부 자료 제공이 필요한 범위이므로, 이번 drilling +선택 구현을 전체 solver 검증 통과로 확대하지 않는다. + ## 이번 실험의 보류 결정 2026-10-19 사용자는 Abaqus U 비교를 이번 실험의 검증 통과로 수용하고 아래 실패10개를 @@ -74,14 +97,17 @@ - 다음 접근: 새 reference의 identity·시점·hash와 blocking 계약을 확정해 별도로 검증한다. 음수 온도 clamp·원본 보정·RMS 완화로 기존 기록을 통과로 바꾸지 않는다. -## Eigen partial-BC 정적 평형 충돌 +## 기존 drilling 방식의 partial-BC raw 정적 gate 한계 -- 조건·관측: MITC4 eigen의 S3 partial rotational BC 사례와 public static 평형 사이의 - 충돌이 기능 기록에 보류 상태로 남아 있다. -- 영향: 모드별 Value 5% 승인 예외가 이 정적 평형 문제나 Abaqus 알고리즘 동등성을 해결하지 않는다. -- 지금 해결하지 않는 이유: 수식·공개 정적 평형 계약의 별도 조사이며 문서만으로 고칠 수 없다. -- 다음 접근: 동일 source BC에서 static과 eigen의 null/finite 공간·힘/모멘트 의미를 독립 대조한다. - 부분 회전구속을 full clamp로 대체하지 않는다. +- 조건·관측: 보존한 S3 partial rotational BC의 public static 사례는 현재 기본 직접 방식에서 + raw 인공 모멘트를 별도로 복구·차감한 뒤 기존1e-10 gate를 통과한다. 기존 방식의 raw + gate는 같은 사례에서 계속 거부되며 명시 Legacy 검사와 별도 build의 실제 진단에 보존했다. +- 영향: 직접 방식의 해당 충돌은 해결했지만 기존 방식의 raw 수용 범위를 넓힌 것은 아니다. + Eigen Value5% 예외나 모든 partial-BC 비선형 모델의 성공을 뜻하지 않는다. +- 지금 남겨 두는 이유: 기존 방식의 수치 판정 보존이 승인된 계약이다. 그 gate를 자동으로 + 보정값으로 바꾸거나 부분 회전구속을 full clamp로 대체하지 않는다. +- 다음 접근: 기존 방식의 수용 범위를 변경하려면 같은 BC에서 null/finite 공간과 + generalized/spatial 힘·모멘트의 계약을 별도로 판정한다. ## 성능 목표 미달과 과거 회귀 diff --git a/docs/tracking/status.md b/docs/tracking/status.md index 3a4ae86..a5677da 100644 --- a/docs/tracking/status.md +++ b/docs/tracking/status.md @@ -1,5 +1,38 @@ # 구현과 검증 상태 +## 2026-10-20 MITC4 drilling 선택 + +초기 director 직접 스프링을 기본으로 하고 기존 상대 비틀림을 코드 한 곳에서 선택하는 +구현을 선형·비선형 정적·pressure·frequency·HHT와 저장·reader·비교기에 연결했다. +직접 방식의 비객관성은 허용하며 raw/인공/보정 spatial 평형을 구별한다. +아래 실행 근거의 제품 source는 `6bbbb2ba8c8078c7a637886201750753da0af5c0`이다. + +| 현재 실제 실행 | 결과와 captured exit | +| --- | --- | +| Native x64 Debug 전체 | unit915:904 PASS/10 FAIL/1 SKIP, exit1; integration74와 reference46은 모두 PASS, exit0/0 | +| CMake x64 Debug 전체 CTest | 같은1035 identity,1024 PASS/10 FAIL/1 SKIP, exit8 | +| 별도 Python 전체 |164 PASS, exit0; pytest9.1.1/NumPy2.4.6/h5py3.16.0의 격리 Python3.11 환경 | +| 기존 방식 별도 Debug 관련 검사 |162 unique=155 PASS/7 FAIL. 기존 물리5개와 Direct 기본값 전용 선택 오류2개를 분리하며 실제 FAIL은 보존 | +| 두 방식의 정식 linear/coarse-NL/eigen |실제 생성·기존 비교 모두 PASS. 현재 선형 변위와 eigen table은 두 방식에서 정확히 동일 | +| 직접 방식 정식 HHT |Release CLI0/비교0,729nodes·101frames, 외부9node U101 families PASS; 최대 정규화 RMS0.2282326248391787%, UR 경고200개 | +| 기존 방식 실제 HHT |별도 Debug 소형3frame CLI/readback PASS.729node 외부 U 재해석은 미실행 | + +두 Debug build와 별도 기존 방식 Debug/공식 Direct Release build는 exit0이며 실제 +MSVC19.51.36260.0 x64/v145, toolset directory14.51.36231과 probe false/OFF를 확인했다. +Compile source·등록/실행 identity·CL/link·staged/loaded DLL·원본 hash를 대조했다. +정식 원본34파일은 불변이고 실제10 HDF5/128평형 frame의 추가 marker·스키마·대수 관계를 검사했다. +실행 명령/exit·raw/XML·현재 실패 원인·선별/제외 목록과 hash는 +`.build/drilling-options-20261020/T4/`에 보존했다. 이 자료가 없는 checkout의 현재 실행 근거로 간주하지 않는다. + +Native/CTest의10 FAIL은 기존 D3·명시 Legacy constraint/C08·후속 mass-null/triad 원인과 +현재 수치/실패 단계를 대조했다. N7 하나는 해상도 INCONCLUSIVE SKIP이다. Legacy의 선택 오류2개는 +Direct mode literal 또는 production Direct 수용을 전제한 검사이며 기본 Direct 전체에서는 PASS했다. +반력·영운동·실제 Legacy marker는 별도 HHT 출력으로 확인했고, 오류 선택의 FAIL을 PASS로 바꾸지 않았다. +정식 fine/fine_02/pressure·새 thermal 자료 누락과 기존 NT11 수치 불일치도 남는다. +구현과 관련 실행은 확보했으나 전체 물리/시간정확도 검증 완료는 아니다. 성능 인증은 하지 않았다. + +## 2026-10-19 수렴 실험 기록 + 2026-10-19 후속 사용자 결정으로 이번 MITC4 HHT 실험은 **변위 검증 통과·실패10개 보류로 조건부 완료**한다. [수용 결정](decisions/0011-tolerance-experiment-acceptance.md)을 따르며 아래 전체 검사 raw 통계와 N7·자료 부재·미해결 물리 문제는 보존한다. 전체 물리/시간정확도 검증 통과로 확대하지 않는다. @@ -60,7 +93,7 @@ Fresh Refactor·통합 Native·통합 CMake 실행물에서 같은 scratch 입 2. 구성된 전체 실행 결과를 바탕으로 MITC4 local 미분/물리 실패와 실제 후보 후속 gate 실패를 분리한다. 후보 비선형 q/v/physical a 시간수렴·N7 및 후보 원본 비교를 확보한다. 전체 검사 실행 사실과 미해결 수치 검증을 구분하고, 자료가 필요한 비교는 확보 뒤 수행한다. -3. Eigen partial-BC 정적 평형 충돌과 thermal 외부 불일치의 영향을 각각 판정한다. +3. 기존 drilling 방식의 partial-BC raw 정적 gate 한계와 thermal 외부 불일치의 영향을 각각 판정한다. 기준 완화·질량 변경·원본 보정으로 해결하지 않는다. 4. 같은 물리·허용치·출력·정밀도를 보존한 상태에서 성능 회귀 원인을 조사하고 최종 source의 Release 시간과 수치 결과를 다시 측정한다. 검증되지 않은 가속을 완료로 기록하지 않는다.