nbody binary arithmetic etc.
svn: r11319
This commit is contained in:
parent
85405bc80b
commit
13182685e6
|
@ -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+)))
|
||||
(let ([i1 (car i)])
|
||||
(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))))))))
|
||||
(+ 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)))
|
||||
(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))
|
||||
(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)))
|
||||
(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)))))
|
||||
(loop-i (cdr i) vx vy vz))))))
|
||||
(loop-o (cdr o))))
|
||||
|
||||
(let loop-o ((o system))
|
||||
|
|
Loading…
Reference in New Issue
Block a user