nx_gm_xpbd_audit_t138.nx source
↩ module page · 55 lines · 3031 B
1// Private observation gate; GREEN means defects reproduced, NOT solver acceptance.
2import "nx_gm_cloth_lib.nx"
3import "nx_gate_verdict.nx"
4func ca_reset(v: *i64, w: *i64) -> i64 {
5 var i:i64=0
6 while i<6 {v[i]=0;w[i]=0;i=i+1}
7 v[3]=2000
8 return 0
9}
10func ca_print(s:*u8,n:i64)->i64 {gv_puts(s);gv_num(n);gv_puts("\n" as *u8);return 0}
11func main()->i64 {
12 let ctr:*i64=gv_ctr()
13 let v:*i64=sys_mmap(48) as *i64
14 let w:*i64=sys_mmap(48) as *i64
15 let bank:*i64=sys_mmap(48) as *i64
16 let e:*i64=sys_mmap(32) as *i64
17 let p:*i64=sys_mmap(8) as *i64
18 e[0]=0;e[1]=1;e[2]=1000;e[3]=GM_C_STRUCT;p[0]=0
19 ca_reset(v,w)
20 gm_xpbd_step_banked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,0,0,bank)
21 let rigid:i64=gm_dist(v,0,1)
22 ca_print("rigid_free_free_actual=" as *u8,rigid)
23 gv_check("OBS rigid one-edge distance1500 versus analytic1000" as *u8,rigid==1500,ctr)
24 ca_reset(v,w)
25 gm_xpbd_step_banked(v,w,2,e,1,p,1,0,ST_DT_REF_US,1,0,0,bank)
26 ca_print("rigid_pin_free_actual=" as *u8,gm_dist(v,0,1))
27 gv_check("OBS pinned/free denominator still2 gives1500 versus1000" as *u8,gm_dist(v,0,1)==1500 && v[0]==0,ctr)
28 ca_print("alpha_relative1_dsum2=" as *u8,st_alpha_tilde(4096,2,ST_DT_REF_US))
29 ca_print("alpha_relative1_dsum8192=" as *u8,st_alpha_tilde(4096,8192,ST_DT_REF_US))
30 gv_check("OBS helper returns dsum units2 not8192" as *u8,st_alpha_tilde(4096,2,ST_DT_REF_US)==2,ctr)
31 ca_reset(v,w)
32 gm_xpbd_step_banked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,4096,4096,bank)
33 let soft1:i64=gm_dist(v,0,1)
34 ca_print("soft_iteration1=" as *u8,soft1)
35 ca_reset(v,w)
36 gm_xpbd_step_banked(v,w,2,e,1,p,0,0,ST_DT_REF_US,8,4096,4096,bank)
37 let soft8:i64=gm_dist(v,0,1)
38 ca_print("soft_iteration8=" as *u8,soft8)
39 gv_check("OBS compliant equilibrium shrinks with iterations; analytic1500 remains" as *u8,soft1>soft8 && soft8<1500,ctr)
40 ca_reset(v,w);v[3]=1000
41 gm_xpbd_step_banked(v,w,2,e,1,p,0,0,ST_DT_REF_US,8,4096,4096,bank)
42 gv_check("CONTROL rest edge stays1000" as *u8,gm_dist(v,0,1)==1000,ctr)
43 v[0]=0;v[1]=0;v[2]=0;w[0]=0;w[1]=7;w[2]=0
44 let hit0:i64=gm_capsule_project(v,w,1,0,0,0-1000,0,0,1000,100)
45 ca_print("axis_hit=" as *u8,hit0);ca_print("axis_radial_squared=" as *u8,v[0]*v[0]+v[1]*v[1])
46 gv_check("OBS capsule axis reports hit but remains inside" as *u8,hit0==1 && v[0]==0 && v[1]==0,ctr)
47 v[0]=50;v[1]=0;v[2]=0;w[0]=7;w[1]=11;w[2]=0
48 let hit1:i64=gm_capsule_project(v,w,1,0,0,0-1000,0,0,1000,100)
49 ca_print("nonaxis_projected_x=" as *u8,v[0]);ca_print("outward_velocity_after=" as *u8,w[0]);ca_print("tangent_velocity_after=" as *u8,w[1])
50 gv_check("OBS contact zeroes outward and tangent velocity" as *u8,hit1==1 && v[0]==102 && w[0]==0 && w[1]==0,ctr)
51 v[0]=200;v[1]=0;v[2]=0;w[0]=7;w[1]=11;w[2]=0
52 let hit2:i64=gm_capsule_project(v,w,1,0,0,0-1000,0,0,1000,100)
53 gv_check("CONTROL outside contact leaves position and velocity" as *u8,hit2==0 && v[0]==200 && w[0]==7 && w[1]==11,ctr)
54 return gv_verdict("GM-XPBD-AUDIT-DEFECT-OBSERVATION" as *u8,ctr,"Observation fixture only. XPBD and complete contact acceptance remain RED; unchanged canonical owner." as *u8)
55}