BeginPackage["Gibbs`"] (** Vector Cross Product **) Cross::usage = "Cross[vec1, vec2] gives the vector product of the 3-vectors vec1 and vec2." Begin["LinearAlgebra`CrossProduct`private`"] Cross[v1_?VectorQ, v2_?VectorQ] := Module[{m=Minors[{v1,v2},2][[1]]}, {m[[3]], -m[[2]], m[[1]]} ] /; Length[v1]==Length[v2]==3 (* Properties of cross products. *) Cross/: Cross[a_,b_]^2 := a.a b.b - (a.b)^2 Cross[a_,a_] = 0 Cross[a_ + b_, c_] := Cross[a,c] + Cross[b,c] Cross[a_, b_ + c_] := Cross[a,b] + Cross[a,c] Cross[a_,0] = 0 Cross[0,a_] = 0 Cross[{0,0,0},a_] ={0,0,0} Cross[a_,{0,0,0}] ={0,0,0} Cross[(n_?NumberQ) a_, b_] := n Cross[a, b] Cross[a_, (n_?NumberQ) b_] := n Cross[a, b] Cross[a_,Cross[b_,c_]] := (a.c) b - (a.b) c Cross[Cross[a_,b_],c_] := (a.c) b - (b.c) a Unprotect[Dot] (* Properties of dot products. *) a_ . ((n_?NumberQ) b_) := n (a.b) ((n_?NumberQ) a_) . b_ := n (a.b) a_ . (b_ + c_) := a.b + a.c (a_ + b_) . c_ := a.c + b.c a_ . b_ := b . a /; !OrderedQ[{a,b}] Dot[a_,0] = 0 Dot[0,a_] = 0 Dot[{0,0,0},a_] =0 Dot[a_,{0,0,0}] =0 (* a_ . {0,0,0} = 0 {0,0,0} . a_ = 0 *) a_ . Cross[a_,b_] = 0 a_ . Cross[b_,a_] = 0 Cross[a_,b_] . a_ = 0 Cross[b_,a_] . b_ = 0 Cross[a_,b_] . c_ := a . Cross[b,c] a_ . Cross[b_,c_] := b . Cross[c,a] /; !OrderedQ[{a,b}] a_ . Cross[b_,c_] := c . Cross[a,b] /; !OrderedQ[{a,c}] (* This rule must be given after other rules involving Cross are defined. *) Cross[a_,b_] := -Cross[b,a] /; !OrderedQ[{a,b}] End[] (* LinearAlgebra`CrossProduct`Private` *) Protect[Cross,Dot] EndPackage[ ] (* LinearAlgebra`CrossProduct` *) (*:Limitations: none known. *) (*:Examples: Cross[ { a, b, c }, { d, e, f } ] Cross[ { a, b, c }, Cross[ { d, e, f }, { g, h, i } ] ] *) Curl[{v1_,v2_,v3_}]:= { D[v3,y]-D[v2,z], D[v1,z]-D[v3,x], D[v2,x]-D[v1,y] } Div[{v1_,v2_,v3_}]:= D[v1,x]+D[v2,y]+D[v3,z] Grad[s_]:= {D[s,x], D[s,y], D[s,z]} /. {0,0,0}->grad[s] Grad[a_?NumberQ]:=0 Curl[Grad[s_]]:=0 Curl[grad[s_]]:=0 Div[Curl[s_]]:=0 Curl[-Grad[s_]]:=0 Curl[-grad[s_]]:=0 Div[-Curl[s_]]:=0 Grad[0]=0 Curl[0]=0 Div[0]=0 Grad[a_+b_]:=Grad[a]+Grad[b] Curl[a_+b_]:=Curl[a]+Curl[b] Div[a_+b_]:=Div[a]+Div[b] grad[a_+b_]:=grad[a]+grad[b]