code wiki / _hdl_build / nx_solarsim_gate.nx

nx_solarsim_gate.nx source

↩ module page · 93 lines · 5828 B

1// nx_solarsim_gate.nx -- NATIVE verify of the browser solar-system sim (base = mmap; the SAME base-relative code 2// runs in the sovereign WASM). Proves it is REAL physics, not animation: each planet is leapfrog-integrated under 3// the Sun's gravity, and we (1) measure each EMERGENT orbital period (steps to close the orbit) and show the 4// ratios match the REAL measured planetary periods (Kepler T~a^1.5) within 3%, (2) confirm the inner-faster 5// ordering, (3) confirm orbits stay bounded (no spiral/escape) with energy conserved, (4) raster a frame to PNG. 6// This is the "video games are simulators / full real physics" deliverable, browser-ready. license_tier: ORIGINAL expect_exit: 0 7import "nx_syscalls.nx" 8import "nx_solarsim.nx" 9import "nx_png.nx" 10 11func g_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 12func g_n(v: i64) -> i64 { var m: i64=v; if m<0{g_w("-");m=0-m} let t:*u8=sys_mmap(24); var k:i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i:i64=0; let o:*u8=sys_mmap(24); while i<k{o[i]=t[k-1-i];i=i+1}; sys_write(1,o,k); return 0 } 13func g_row(id: *u8, ok: i64, pass: *i64) -> i64 { g_w(" "); g_w(id); g_w(": "); if ok==1 { g_w("OK\n"); pass[0]=pass[0]+1 } else { g_w("FAIL\n") } return 0 } 14func iabs(x: i64) -> i64 { if x<0 { return 0-x } return x } 15 16// measure planet p's emergent orbital period (steps to return to a y=0 up-crossing with x>0), others frozen 17func measure_period(base: i64, p: i64) -> i64 { 18 init_impl(base) 19 let X: *i64=(base+O_X) as *i64; let Y: *i64=(base+O_Y) as *i64 20 var prev: i64=Y[p]; var step: i64=0 21 while step<300000 { 22 step_one_impl(base, p) 23 let cy: i64=Y[p] 24 if prev<0 { if cy>=0 { if X[p]>0 { if step>10 { return step } } } } 25 prev=cy; step=step+1 26 } 27 return 0 28} 29 30func main() -> i64 { 31 let pass: *i64 = sys_mmap(8) as *i64; pass[0]=0 32 g_w("=== NX-SOLARSIM native verify (real N-body solar system; SAME code runs in sovereign wasm) ===\n") 33 let base: i64 = sys_mmap(2*1048576) as i64 34 35 // ---- emergent periods from the gravity integration ---- 36 let T: *i64=sys_mmap(8*8) as *i64 37 var p: i64=0; while p<N { T[p]=measure_period(base, p); p=p+1 } 38 // real measured period ratios x1000 (T_planet / T_earth): from nx_sim_validation_real_gate's measured data 39 let rr: *i64=sys_mmap(8*8) as *i64 40 rr[0]=241; rr[1]=615; rr[2]=1000; rr[3]=1881; rr[4]=11860 41 let nmh: *i64=sys_mmap(8*8) as *i64 42 nmh[0]=("Mercury" as *u8) as i64; nmh[1]=("Venus " as *u8) as i64; nmh[2]=("Earth " as *u8) as i64; nmh[3]=("Mars " as *u8) as i64; nmh[4]=("Jupiter" as *u8) as i64 43 44 var kepler_ok: i64=1; var worst: i64=0 45 p=0 46 while p<N { 47 let mr: i64 = T[p]*1000/T[2] // measured ratio to Earth x1000 48 let err: i64 = iabs(mr - rr[p]) 49 if err > rr[p]*3/100 { kepler_ok=0 } // 3% tolerance 50 if err*1000/rr[p] > worst { worst = err*1000/rr[p] } 51 g_w(" "); g_w((nmh[p] as *u8)); g_w(" emergent T(steps)="); g_n(T[p]); g_w(" ratio/Earth(x1000)="); g_n(mr); g_w(" real="); g_n(rr[p]); g_w("\n") 52 p=p+1 53 } 54 // ordering: strictly increasing periods (inner faster) 55 var ordered: i64=1; p=1; while p<N { if T[p] <= T[p-1] { ordered=0 } p=p+1 } 56 57 // ---- stability + energy over a full inner-system run ---- 58 init_impl(base) 59 let e0: *i64=sys_mmap(8*8) as *i64; p=0; while p<N { e0[p]=energy_p(base,p); p=p+1 } 60 var t: i64=0; while t<300 { tick_impl(base, 0); t=t+1 } 61 let X: *i64=(base+O_X) as *i64; let Y: *i64=(base+O_Y) as *i64; let R0: *i64=(base+O_R0) as *i64 62 var bounded: i64=1; var econs: i64=1 63 p=0 64 while p<N { 65 let r: i64=isqrt(X[p]*X[p]+Y[p]*Y[p]) 66 if r < R0[p]*85/100 { bounded=0 } 67 if r > R0[p]*115/100 { bounded=0 } 68 let ec: i64=energy_p(base,p); var ae0: i64=e0[p]; if ae0<0 { ae0=0-ae0 } 69 let drift: i64=iabs(ec-e0[p])*1000/ae0 70 if drift > 50 { econs=0 } // <5% energy drift 71 p=p+1 72 } 73 74 // ---- raster a frame ---- 75 render_impl(base) 76 write_png((base + O_FB) as *i64, W, H, "knowledge/nx_solarsim.png" as *u8) 77 let fb: *i64=(base+O_FB) as *i64; let sun: i64=fb[CY*W+CX] 78 g_w(" worst Kepler ratio error="); g_n(worst); g_w("/1000 bounded="); g_n(bounded); g_w(" energy-conserved="); g_n(econs); g_w(" -> knowledge/nx_solarsim.png\n") 79 80 var ran: i64=0; if T[0]>0 { if T[4]>0 { ran=1 } } 81 g_row("SIM RUNS: all 5 planets leapfrog-integrated under the Sun's gravity and completed orbits" as *u8, ran, pass) 82 g_row("STABLE ORBITS: every planet's radius stays within 15% of its true semi-major axis (no spiral/escape) over a full inner-system run" as *u8, bounded, pass) 83 g_row("ENERGY CONSERVED: symplectic leapfrog keeps each planet's orbital energy bounded (drift < 5%)" as *u8, econs, pass) 84 g_row("EMERGENT KEPLER: the periods EMERGE from the gravity integration and match the REAL measured planetary periods within 3% (T~a^1.5)" as *u8, kepler_ok, pass) 85 g_row("INNER-FASTER ORDERING: T(Mercury)<Venus<Earth<Mars<Jupiter -- the real Kepler ordering, from physics not script" as *u8, ordered, pass) 86 g_row("RASTER: framebuffer drawn (Sun + planets), non-empty frame -> knowledge/nx_solarsim.png" as *u8, ((sun & 255)>200) as i64, pass) 87 var iface: i64=0; if ww()==W { if hh()==H { if fb_off()==O_FB { iface=1 } } } 88 g_row("WASM-READY: init/tick/render/ww/hh/fb_off interface intact -- the exact base-relative code wasm runs" as *u8, iface, pass) 89 90 g_w("NX-SOLARSIM-GATE rows=7 pass="); g_n(pass[0]) 91 if pass[0]==7 { g_w(" verdict=GREEN (real N-body solar system; emergent Kepler periods match real data; browser-ready)\n"); sys_exit(0); return 0 } 92 g_w(" verdict=RED\n"); sys_exit(1); return 1 93}