nx_gm_xpbd_correct_gate_t138.nx source
↩ module page · 104 lines · 6247 B
1// Private analytic correction gate, not whole-character acceptance.
2import "nx_gm_cloth_lib_t138.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("Rigid free/free analytic1000" as *u8,rigid==1000,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("Pinned/free analytic1000" as *u8,gm_dist(v,0,1)==1000 && 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("Shared helper unchanged returns dsum units" 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("Compliant equilibrium1500 at1 and8 iterations" as *u8,soft1==1500 && 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("Capsule axis separates deterministically" as *u8,hit0==1 && v[0]*v[0]+v[1]*v[1]>=10000,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("Contact preserves outward and tangent velocity" as *u8,hit1==1 && v[0]==102 && w[0]==7 && w[1]==11,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 let ws:*i64=sys_mmap(4096) as *i64
55 let masses:*i64=sys_mmap(16) as *i64
56 masses[0]=ST_Q12;masses[1]=ST_Q12*3
57 ca_reset(v,w)
58 let mr:i64=gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,0,0,masses,2,ws,512)
59 gv_check("Unequal inverse masses correction250/750" as *u8,mr==0 && v[0]==250 && v[3]==1250,ctr)
60 ca_reset(v,w);e[1]=2
61 let bad:i64=gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,0,0,masses,2,ws,512)
62 gv_check("Invalid index refuses before caller mutation" as *u8,bad<0 && v[0]==0 && v[3]==2000 && w[0]==0,ctr)
63 e[1]=1
64 let shortws:i64=gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,0,0,masses,2,ws,1)
65 gv_check("Insufficient workspace refuses" as *u8,shortws<0 && v[3]==2000,ctr)
66 let badtime:i64=gm_xpbd_step_checked(v,w,2,e,1,p,0,0,0,1,0,0,masses,2,ws,512)
67 gv_check("Nonpositive timestep refuses" as *u8,badtime<0 && v[3]==2000,ctr)
68 v[3]=GMC_MAX
69 let overflow:i64=gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US,1,0,0,masses,2,ws,512)
70 gv_check("Arithmetic overflow refuses without partial commit" as *u8,overflow==0-2 && v[3]==GMC_MAX && v[0]==0,ctr)
71 ca_reset(v,w)
72 gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US*2,8,4096,4096,0 as *i64,0,ws,512)
73 gv_check("Double-dt compliant analytic1200" as *u8,gm_dist(v,0,1)==1200,ctr)
74 ca_reset(v,w)
75 gm_xpbd_step_checked(v,w,2,e,1,p,0,0,ST_DT_REF_US/2,8,4096,4096,0 as *i64,0,ws,512)
76 let halfdist:i64=gm_dist(v,0,1)
77 ca_print("halfdt_compliant_distance=" as *u8,halfdist)
78 gv_check("Half-dt compliant analytic1800 within2 mesh quanta" as *u8,halfdist>=1798 && halfdist<=1802,ctr)
79 ca_reset(v,w)
80 var tick:i64=0
81 while tick<10 {gm_xpbd_step_checked(v,w,1,e,0,p,0,100,10000,0,0,0,0 as *i64,0,ws,512);tick=tick+1}
82 let z10:i64=v[2];let vs10:i64=w[2]*100
83 ca_reset(v,w);tick=0
84 while tick<5 {gm_xpbd_step_checked(v,w,1,e,0,p,0,400,20000,0,0,0,0 as *i64,0,ws,512);tick=tick+1}
85 ca_print("physical100ms_10ms_z=" as *u8,z10);ca_print("physical100ms_20ms_z=" as *u8,v[2])
86 gv_check("Equal physical time free flight: analytic5000 plus semiimplicit errors500/1000" as *u8,z10==5500 && v[2]==6000 && vs10==100000 && w[2]*50==100000,ctr)
87 v[0]=50;v[1]=0;v[2]=0;w[0]=0-7;w[1]=11;w[2]=0
88 gm_capsule_project(v,w,1,0,0,0-1000,0,0,1000,100)
89 gv_check("Inward normal removed; tangent preserved" as *u8,w[0]==0 && w[1]==11,ctr)
90 v[0]=50;v[1]=0;v[2]=0;w[0]=0;w[1]=11;w[2]=0
91 let moving:i64=gm_capsule_project_checked(v,w,1,0,0,0-1000,0,0,1000,100,p,0,5,0,0,ws,512)
92 gv_check("Moving collider relative normal respected" as *u8,moving==1 && w[0]==5 && w[1]==11,ctr)
93 v[0]=50;v[1]=0;v[2]=0;w[0]=7;w[1]=11;w[2]=0
94 let conflict:i64=gm_capsule_project_checked(v,w,1,0,0,0-1000,0,0,1000,100,p,1,0,0,0,ws,512)
95 gv_check("Pinned contact conflict explicit without mutation" as *u8,conflict==0-6 && v[0]==50 && w[0]==7,ctr)
96 ca_reset(v,w);tick=0
97 while tick<4 {gm_xpbd_step_checked(v,w,2,e,1,p,1,0,ST_DT_REF_US,8,4096,4096,0 as *i64,0,ws,512);tick=tick+1}
98 let spring4:i64=v[3]
99 ca_reset(v,w);tick=0
100 while tick<2 {gm_xpbd_step_checked(v,w,2,e,1,p,1,0,ST_DT_REF_US*2,8,4096,4096,0 as *i64,0,ws,512);tick=tick+1}
101 ca_print("spring_equal_time_4small=" as *u8,spring4);ca_print("spring_equal_time_2large=" as *u8,v[3])
102 gv_check("Spring equal physical time matches implicit discrete recurrence750/880 within4 units" as *u8,st_abs(spring4-750)<=4 && st_abs(v[3]-880)<=4,ctr)
103 return gv_verdict("GM-XPBD-PRIVATE-CORRECTION" as *u8,ctr,"Analytic fixed-point solver and capsule fixtures; not whole-character or served acceptance." as *u8)
104}