liedf.red 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. module liedf;
  2. % Author: Eberhard Schruefer;
  3. global '(commutator!-of!-framevectors);
  4. newtok '((!| !_ ) liedf);
  5. infix liedf;
  6. %flag('(liedf),'nary); %Not done for now, but should be considered.
  7. flag('(liedf),'spaced);
  8. precedence liedf,innerprod;
  9. put('liedf,'simpfn,'simpliedf);
  10. put('liedf,'rtypefn,'getrtypeor);
  11. symbolic procedure simpliedf u;
  12. !*pf2sq partitliedf u;
  13. put('liedf,'partitfn,'partitliedf);
  14. symbolic procedure partitliedf u;
  15. liedfpf(partitop car u,partitop cadr u);
  16. symbolic procedure mkliedf(u,v);
  17. begin scalar x,y;
  18. return if x := opmtch(y := list('liedf,u,v))
  19. then partitop x
  20. else mkupf y
  21. end;
  22. symbolic procedure liedfpf(u,v);
  23. if null tvectorp u then
  24. rerror(excalc,9,
  25. "First argument of lie derivative must be a vector")
  26. else if null tvectorp v then
  27. addpf(exdfpf innerprodpf(u,v),
  28. innerprodpf(u,exdfpf v))
  29. else begin scalar x;
  30. for each k on u do
  31. for each l on v do
  32. x := addpf(liedftt(lt k,lt l),x);
  33. return x
  34. end;
  35. symbolic procedure liedftt(u,v);
  36. begin scalar x;
  37. return addpf(multpfsq(liedfk(car u,car v),multsq(tc u,tc v)),
  38. addpf(if x := innerprodpf(!*k2pf car u,exdf0 tc v)
  39. then car v .*
  40. multsq(!*pf2sq x,tc u) .+ nil
  41. else nil,
  42. if x := innerprodpf(!*k2pf car v,exdf0 tc u)
  43. then car u .*
  44. negsq multsq(!*pf2sq x,tc v) .+ nil
  45. else nil))
  46. end;
  47. symbolic procedure liedfk(u,v);
  48. if u eq v then nil
  49. else if eqcar(u,'partdf) and eqcar(v,'partdf) then nil
  50. else if basisvectorp u and basisvectorp v
  51. then if null ordop(u,v)
  52. then negpf liedfk(v,u)
  53. else if commutator!-of!-framevectors
  54. then get!-structure!-const(u,v)
  55. else mkliedf(u,v)
  56. else if eqcar(v,'liedf)
  57. then if ordop(u,cadr v) then mkliedf(u,v)
  58. else addpf(liedfpf(liedfk(u,cadr v),!*k2pf caddr v),
  59. liedfpf(!*k2pf cadr v,
  60. liedfpf(!*k2pf u,!*k2pf caddr v)))
  61. else if worderp(u,v) then mkliedf(u,v)
  62. else negpf mkliedf(v,u);
  63. symbolic procedure get!-structure!-const(u,v);
  64. %We currently assume that only the basis has structure consts.
  65. begin scalar x;
  66. return if x := assoc(list(cadadr u,cadadr v),
  67. commutator!-of!-framevectors)
  68. then !*pfsq2pf cdr x
  69. else nil
  70. end;
  71. endmodule;
  72. end;