packages feed

egison-3.7.8: sample/math/geometry/vector-analysis.egi

(define $N 3)

(define $g [| [| 1 0 0 |] [| 0 1 0 |] [| 0 0 1 |] |])

(define $d
  (lambda [%X]
    !((flip ∂/∂) [| x y z |] X)))

(define $hodge
  (lambda [%A]
    (let {[$k (df-order A)]}
      (with-symbols {i j}
        (* (sqrt (abs (M.det g_#_#)))
           (foldl . (. (subrefs A (map 1#j_%1 (between 1 k)))
                       (subrefs (ε' N k) (map 1#i_%1 (between 1 N))))
                  (map 1#g~[i_%1]~[j_%1] (between 1 k))))))))

(define $δ
  (lambda [%A]
    (let {[$r (df-order A)]}
      (* (** -1 (+ (* N r) 1))
         (hodge (d (hodge A)))))))

(define $grad d)
(define $rot d)
(define $div δ)

(define $Δ
  (lambda [%A]
    (match (tensor-order A) integer
      {[,0 (δ (d A))]
       [,N (d (δ A))]
       [_ (+ (d (δ A)) (δ (d A)))]})))

(grad (+ (** x 2) (** y 2) (** z 2)))
;[| (* 2 x) (* 2 y) (* 2 z) |]

(rot [| (** y 2) (** x 2) 0 |])
;[| [| 0 (* 2 x) 0 |] [| (* 2 y) 0 0 |] [| 0 0 0 |] |]

(div [| (** y 2) (** x 2) 0 |])
;0

(rot [| (** x 2) (** y 2) (** z 2) |])
;[| [| (* 2 x) 0 0 |] [| 0 (* 2 y) 0 |] [| 0 0 (* 2 z) |] |]

(div [| (** x 2) (** y 2) (** z 2) |])
;(+ (* 2 z) (* 2 y) (* 2 x))

(rot [| (* x 2) (* y 2) (* z 2) |])
;[| [| 2 0 0 |] [| 0 2 0 |] [| 0 0 2 |] |]

(div [| (* x 2) (* y 2) (* z 2) |])
;6

(Δ (+ (** x 2) (** y 2) (** z 2)))
;6