diff --git a/collects/tests/mzscheme/benchmarks/shootout/nbody.ss b/collects/tests/mzscheme/benchmarks/shootout/nbody.ss index b15212faaf..f49cd2832e 100644 --- a/collects/tests/mzscheme/benchmarks/shootout/nbody.ss +++ b/collects/tests/mzscheme/benchmarks/shootout/nbody.ss @@ -77,56 +77,69 @@ Correct output N = 1000 is (set-body-vx! (car system) (/ (- px) +solar-mass+)) (set-body-vy! (car system) (/ (- py) +solar-mass+)) (set-body-vz! (car system) (/ (- pz) +solar-mass+))) - (loop-i (cdr i) - (+ px (* (body-vx (car i)) (body-mass (car i)))) - (+ py (* (body-vy (car i)) (body-mass (car i)))) - (+ pz (* (body-vz (car i)) (body-mass (car i)))))))) + (let ([i1 (car i)]) + (loop-i (cdr i) + (+ px (* (body-vx i1) (body-mass i1))) + (+ py (* (body-vy i1) (body-mass i1))) + (+ pz (* (body-vz i1) (body-mass i1)))))))) ;; ------------------------------- (define (energy system) (let loop-o ((o system) (e 0.0)) (if (null? o) e - (let ([e (+ e (* 0.5 (body-mass (car o)) - (+ (* (body-vx (car o)) (body-vx (car o))) - (* (body-vy (car o)) (body-vy (car o))) - (* (body-vz (car o)) (body-vz (car o))))))]) + (let* ([o1 (car o)] + [e (+ e (* (* 0.5 (body-mass o1)) + (+ (+ (* (body-vx o1) (body-vx o1)) + (* (body-vy o1) (body-vy o1))) + (* (body-vz o1) (body-vz o1)))))]) (let loop-i ((i (cdr o)) (e e)) (if (null? i) (loop-o (cdr o) e) - (let* ((dx (- (body-x (car o)) (body-x (car i)))) - (dy (- (body-y (car o)) (body-y (car i)))) - (dz (- (body-z (car o)) (body-z (car i)))) - (distance (sqrt (+ (* dx dx) (* dy dy) (* dz dz))))) - (let ([e (- e (/ (* (body-mass (car o)) (body-mass (car i))) distance))]) + (let* ((i1 (car i)) + (dx (- (body-x o1) (body-x i1))) + (dy (- (body-y o1) (body-y i1))) + (dz (- (body-z o1) (body-z i1))) + (distance (sqrt (+ (+ (* dx dx) (* dy dy)) (* dz dz))))) + (let ([e (- e (/ (* (body-mass o1) (body-mass i1)) distance))]) (loop-i (cdr i) e))))))))) ;; ------------------------------- (define (advance system dt) (let loop-o ((o system)) (unless (null? o) - (let loop-i ((i (cdr o))) - (unless (null? i) - (let* ((o1 (car o)) - (i1 (car i)) - (dx (- (body-x o1) (body-x i1))) - (dy (- (body-y o1) (body-y i1))) - (dz (- (body-z o1) (body-z i1))) - (distance (sqrt (+ (* dx dx) (* dy dy) (* dz dz)))) - (mag (/ dt (* distance distance distance))) - (dxmag (* dx mag)) - (dymag (* dy mag)) - (dzmag (* dz mag)) - (om (body-mass o1)) - (im (body-mass i1))) - (set-body-vx! o1 (- (body-vx o1) (* dxmag im))) - (set-body-vy! o1 (- (body-vy o1) (* dymag im))) - (set-body-vz! o1 (- (body-vz o1) (* dzmag im))) - (set-body-vx! i1 (+ (body-vx i1) (* dxmag om))) - (set-body-vy! i1 (+ (body-vy i1) (* dymag om))) - (set-body-vz! i1 (+ (body-vz i1) (* dzmag om))) - (loop-i (cdr i))))) + (let* ((o1 (car o)) + (o1x (body-x o1)) + (o1y (body-y o1)) + (o1z (body-z o1)) + (om (body-mass o1))) + (let loop-i ((i (cdr o)) + (vx (body-vx o1)) + (vy (body-vy o1)) + (vz (body-vz o1))) + (if (null? i) + (begin + (set-body-vx! o1 vx) + (set-body-vy! o1 vy) + (set-body-vz! o1 vz)) + (let* ((i1 (car i)) + (dx (- o1x (body-x i1))) + (dy (- o1y (body-y i1))) + (dz (- o1z (body-z i1))) + (distance (sqrt (+ (+ (* dx dx) (* dy dy)) (* dz dz)))) + (mag (/ dt (* (* distance distance) distance))) + (dxmag (* dx mag)) + (dymag (* dy mag)) + (dzmag (* dz mag)) + (im (body-mass i1))) + (let ([vx (- vx (* dxmag im))] + [vy (- vy (* dymag im))] + [vz (- vz (* dzmag im))]) + (set-body-vx! i1 (+ (body-vx i1) (* dxmag om))) + (set-body-vy! i1 (+ (body-vy i1) (* dymag om))) + (set-body-vz! i1 (+ (body-vz i1) (* dzmag om))) + (loop-i (cdr i) vx vy vz)))))) (loop-o (cdr o)))) (let loop-o ((o system))