grgclass.sl 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081
  1. %==========================================================================%
  2. % GRGclass.sl Assignment, Macro Functions, Classification %
  3. %==========================================================================%
  4. % GRG 3.2 Standard Lisp Source Code (C) 1988-96 Vadim V. Zhytnikov %
  5. %==========================================================================%
  6. % This file is distributed without any warranty. You may modify it but you %
  7. % are not allowed to remove author's name and/or distribute modified file. %
  8. %==========================================================================%
  9. %------- Assignment Command 09.91,03.94 -------------------------------
  10. %
  11. % Assignment Command in forms
  12. % Tetrad T0=..., ...;
  13. % Tetrad T(j)=..., ...;
  14. % T(j)=..., ...;
  15. % T0=..., ...;
  16. %
  17. (de seti!> (lst)
  18. (prog (w wl wa wr was)
  19. (setq ![newabbr!] nil)
  20. (setq w (seek!> lst '(!=)))
  21. (cond ((or (null w) (null(car w)) (null(cdr w)))
  22. (prog2 (setq ![er!] 2204) (return !!er!!))))
  23. (setq wa (car w))
  24. (setq wl (length wa))
  25. (cond
  26. ((or (eqn wl 1) % t0 = ...
  27. (and(eqn wl 2)(pairp(car wa)))) % t(j) = ...
  28. (progn
  29. (setq wa(cond((eqn wl 1) (car wa))
  30. (t (cadr wa))))
  31. (cond((not(idp wa))
  32. (prog2(setq ![er!] 2204)(return !!er!!))))
  33. (setq was wa)
  34. (setq wa (explode2 wa))
  35. (cond((eqn wl 1)(setq wr(selid!> wa nil))))
  36. (setq wa(incomiv!> wa))
  37. (cond((not(flagp wa '!+ivar))
  38. (cond
  39. (wr(progn(doub!> was)(setq ![er!] 8604)(return !!er!!)))
  40. ((or(flagp wa '!+grgmac)(gettype!> wa))
  41. (progn(doub!> was)(setq ![er!] 3000)(return !!er!!)))
  42. (t(progn
  43. (cond((flagp was '!+grg)(prog2(doub!> was)(msg!> 8603))))
  44. (setq ![abbr!] (cons wa ![abbr!]))
  45. (setq ![newabbr!] wa)
  46. (global (ncons wa))
  47. (flag (ncons wa) '!+ivar)
  48. (flag (ncons wa) '!+abbr))))))
  49. (return(datr!> lst wa)))) % ---> datr> ...
  50. ((atom(car wa))(prog2
  51. (setq w(cons(car wa)(cdr w)))
  52. (setq wa(cdr wa))))
  53. (t (prog2 (setq w(cons(cadr wa)(cons(car wa)(cdr w))))
  54. (setq wa(cddr wa)))))
  55. (setq wa(reverse wa))
  56. (setq was wa)
  57. (setq wa (assocf!> wa ![datl!]))
  58. (cond((or(null wa)(pairp(car wa)))
  59. (progn(setq ![er!] 6030)(doubl!> was)(return !!er!!))))
  60. (setq wa(car wa))
  61. (return(datr!> w wa)))) % ---> datr> ...
  62. % 03.94, 05.96 ... WN - Internal Variable, LST - Text
  63. (de datr!> (lst wn)
  64. (proc (w wl wr ww)
  65. (cond ((null lst) (return nil))
  66. ((setq w (constrp!> wn)) % constrained!
  67. (progn (doubo!> wn) (setq ![er!] w) (return !!er!!))))
  68. (setq lst (memlistbr!> '!, lst))
  69. (cond ((eq lst !!er!!) (prog2 (setq ![er!] 2202) (return !!er!!))))
  70. (while!> lst
  71. (setq w (seek1!> (car lst) '!=))
  72. (cond((or (null w) (null(car w)) (null(cdr w)))
  73. (prog2 (setq ![er!] 2204) (return !!er!!))))
  74. (setq wl (reverse (car w)))
  75. (setq wr (cdr w))
  76. (cond((or (not(idp(car wl)))
  77. (and (cdr wl) (not(pairp(cadr wl))))
  78. (greaterp (length wl) 2))
  79. (prog2 (setq ![er!] 2204) (return !!er!!))))
  80. (setq ww
  81. (cond ((cdr wl) (transi!> wn wl wr))
  82. (t (trans!> wn (car wl) wr))))
  83. (cond ((eq ww !!er!!) (cond (![newabbr!] (forget1!> ![newabbr!])))
  84. (return !!er!!)))
  85. (cond
  86. ((eq wn '!#!G) (mtype!>))
  87. ((eq wn '!#!G!I) (mitype!>))
  88. ((eq wn '!#!T) (ftype!>))
  89. ((eq wn '!#!D) (fitype!>)))
  90. (setq lst (cdr lst)) )))
  91. % Normal Form ...
  92. % 11.94 ... WN Internal var, WL Left, WR Right
  93. (de trans!> (wn wl wr)
  94. (prog (wi wc)
  95. (cond((and (flagp wn '!+equ) (not(memq '!= wr)))
  96. (prog2 (setq ![er!] 2208) (return !!er!!))))
  97. (setq wi (get wn '!=idxl)) % index types list
  98. (setq wc (transn!> wl wn wi)) % id = ... translation
  99. (cond ((eq wc !!er!!) (return !!er!!)))
  100. (return (trans0!> wn wc wr)) ))
  101. % 11.94 ... WN Internal var, WL indices, WR Right
  102. (de trans0!> (wn wc wr)
  103. (prog (wss wi wt we wnn)
  104. (setq wss (get wn '!=sidxl)) % symmetry list
  105. (setq wi (get wn '!=idxl)) % index types list
  106. (setq wt (gettype!> wn)) % expression type
  107. (cond((null(eval wn)) % prepare space for storing if not exists
  108. (prog2(setq wnn t)(set wn (mkbox!> wn)))))
  109. (cond (wc (setq wc (syaidx!> wc wss))))
  110. (cond((and wi (null wc)) (return nil)))
  111. (setq wr (cschtr!> wr (flagp wn '!+equ)))
  112. (setq ![extvar!] nil)
  113. (cond((flagp wn '!+equ) (setq we (translateeq!> wr))) % expr translation
  114. (t (setq we (translate!> wr))))
  115. (cond ((equal we !!er!!)
  116. (cond (wnn (set wn nil)))
  117. (return !!er!!))
  118. ((null we)
  119. (cond ((null wt) (put wn '!=type 0))))
  120. ((null wt)
  121. (setq wt (car we))
  122. (put wn '!=type wt))
  123. ((not(eqn wt (car we))) % incorrect expression type
  124. (cond(wnn(set wn nil)))
  125. (expects!> wt)
  126. (setq ![er!] 2100) (return !!er!!)))
  127. % storing of the data component
  128. (putel!> (cond(we(cdr we))(t nil)) (eval wn) (cond(wc wc)(t '(0))))
  129. (return t)))
  130. % Perform Sign Changing [CS] and Complex Conjugations [CH] ...
  131. (de cschtr!> (wr we)
  132. (cond((and ![ch!] ![cs!])
  133. (cond (we (progn (setq wr (seek1!> wr '!=))
  134. (list (csch0!>(reverse(car wr))) (csch0!>(cdr wr)))))
  135. (t (csch0!> wr))))
  136. (![cs!]
  137. (cond (we (progn (setq wr (seek1!> wr '!=))
  138. (list (cs0!>(reverse(car wr))) (cs0!>(cdr wr)))))
  139. (t (cs0!> wr))))
  140. (![ch!]
  141. (cond (we (progn (setq wr (seek1!> wr '!=))
  142. (list (ch0!>(reverse(car wr))) (ch0!>(cdr wr)))))
  143. (t (ch0!> wr))))
  144. (t wr)))
  145. % aux functions ...
  146. (de cs0!> (w) (list2 '!- (ncons w)))
  147. (de ch0!> (w) (list2 '!~ (ncons w)))
  148. (de csch0!> (w) (list '!- '!~ (ncons w)))
  149. % Message about wrong type of the expression ...
  150. (de expects!> (wt)
  151. (progn
  152. (cond((eqn wt 0) (prin2 "Algebraic expression"))
  153. ((eqn wt -1) (prin2 "Vector"))
  154. (t (prin2 wt) (prin2 "-form")))
  155. (prin2 " is expected.")
  156. (terpri)))
  157. % w - id = ... wn - internal variable wi - index types list
  158. (de transn!> (w wn wi)
  159. (prog(wa wb wc wd wl wf)
  160. (setq wb(explode2 w))
  161. (setq wa(cdr(explode2 wn)))
  162. (setq wf(selid!> wb nil)) % wb - id wf - indices
  163. (cond((not(equal wb wa))
  164. (progn(expid!> wa)(setq ![er!] 2101)(return !!er!!))))
  165. (cond((null wf)(cond((null wi)(return nil)) % scalar data ...
  166. (t(prog2(setq ![er!] 2102)(return !!er!!))))))
  167. (setq wf (mapcar wf 'digorerr!>))
  168. (cond((memq !!er!! wf)
  169. (prog2(setq ![er!] 2102)(return !!er!!))))
  170. (cond ((eq (goodidxl!> wf wi) !!er!!) (return !!er!!)))
  171. (return wf)))
  172. % aux fun ...
  173. (de digorerr!> (w)
  174. (cond((digit w)(compress (ncons w)))
  175. (t !!er!!)))
  176. % w is expected ...
  177. (de expid!> (w)
  178. (progn (mapc w 'prin2)
  179. (prin2 " is expected.")
  180. (terpri)))
  181. % Verifies correct range of indices ...
  182. (de goodidxl!> (wb wi)
  183. (cond ((and (null wb) (null wi)) t)
  184. ((null wb) (setq ![er!] 21023) !!er!!)
  185. ((null wi) (setq ![er!] 21024) !!er!!)
  186. ((lessp (dimid!>(car wi) )(car wb)) (setq ![er!] 21022) !!er!!)
  187. (t (goodidxl!> (cdr wb) (cdr wi)))))
  188. % Verifies correct range the index ...
  189. (de goodid1!> (w wt)
  190. (cond((lessp(dimid!> wt)w) nil)
  191. (t t)))
  192. % Tensorial Form ...
  193. % WN - Internal Variable WL - Left WR - Right
  194. (de transi!> (wn wl wr)
  195. (proc (wt wi w wll wa wii)
  196. (setq wll(cons nil(get wn '!=idxl)))
  197. (setq wt (car wl))
  198. (setq wi (cadr wl))
  199. (setq wt (explode2 wt))
  200. (cond((not(equal wt(cdr(explode2 wn))))
  201. (progn(expid!>(cdr(explode2 wn)))
  202. (setq ![er!] 2101)(return !!er!!))))
  203. (setq wi(memlist!> '!, wi))
  204. (cond((eq wi !!er!!) (prog2(setq ![er!] 2202)(return !!er!!))))
  205. (cond((not(eqn(length wi)(length(get wn '!=idxl))))
  206. (prog2 (cond (![newabbr!] (doubo!> ![newabbr!])
  207. (setq ![er!] 22071))
  208. (t (setq ![er!] 2207)))
  209. (return !!er!!))))
  210. (setq wii nil)
  211. (while!> wi
  212. (setq wii
  213. (cons (prog2 (setq wll(cdr wll)) (sumintr!> (car wi) (car wll)))
  214. wii))
  215. (setq wi (cdr wi)))
  216. (setq wi (reverse wii)) % here now the list of indices in lhs
  217. (cond((memq !!er!! wi)(return !!er!!)))
  218. (setq ![extvar!] (mkextvars!> wi)) % prepare list of ext. vars.
  219. (cond((memq !!er!! ![extvar!]) (return !!er!!))
  220. ((null ![extvar!]) % only numerical indices ...
  221. (return (trans0!> wn (mklitind!> wi) wr))))
  222. (cond((flagp wn '!+equ)(setq wr (pretranseq!> wr))) % pre translation
  223. (t (setq wr (pretrans!> wr))))
  224. (cond((eq wr !!er!!)(return !!er!!)))
  225. (setq ![idl!] wi) (setq ![texpr!] wr)
  226. (setq w(cond((null(eval wn))(mkbox!> wn))
  227. (t(eval wn))))
  228. (setq w (errorset!> (list 'allcoll!> (list 'quote w)
  229. (list 'quote wn)
  230. nil
  231. (list 'quote (get wn '!=idxl))
  232. (list 'function 'transel!>)
  233. ) ![erst1!] ![erst2!] ))
  234. (remsubindex!> ![idl!])(setq ![texpr!] nil)
  235. (cond((atom w)(prog2(setq ![er!] w)(return !!er!!)))
  236. (t(set wn(car w))))
  237. (return t)))
  238. % Prepare List of Ext. vars ...
  239. (de mkextvars!> (lst)
  240. (cond((null lst) nil)
  241. ((atom(car lst))(consmemer!>(car lst)(mkextvars!>(cdr lst))))
  242. (t(appmemer!>(car lst)(mkextvars!>(cdr lst))))))
  243. (de appmemer!> (wa wb)
  244. (prog2 (while!> wa
  245. (setq wb (consmemer!> (car wa)wb))
  246. (setq wa (cdr wa)))
  247. wb))
  248. (de consmemer!> (w lst)
  249. (cond((and(idp w)(memq w lst))
  250. (prog2(setq ![er!] 2205)(cons !!er!! lst)))
  251. ((idp w) (cons w lst))
  252. (t lst)))
  253. (de mklitind!> (lst)
  254. (mapcar lst 'mklitind1!>))
  255. (de mklitind1!> (w)
  256. (cond ((numberp w) w)
  257. (t (eval(cons 'plus w)))))
  258. % Translate the element ...
  259. (de transel!> (lst wi wn)
  260. (cond((and (syaidxp!> wi (get wn '!=sidxl))
  261. (coidxp!> wi ![idl!]) )
  262. (progn
  263. (putindex!> wi)
  264. (cond((flagp wn '!+equ)(setq lst(unievaluateeq!> ![texpr!])))
  265. (t (setq lst(unievaluate!> ![texpr!]))))
  266. (remsubindex!> ![idl!])
  267. (cond((null(gettype!> wn))(put wn '!=type (car lst))))
  268. (cond((and lst(not(eqn(car lst)(gettype!> wn))))
  269. (prog2 (expects!>(gettype!> wn))
  270. (err!> 2100))))
  271. (cond(lst(cdr lst))
  272. (t nil))))
  273. (t lst)))
  274. % Summed index treatment if exists ...
  275. (de sumintr!> (w wl)
  276. (cond((atom wl) % tetrad or holonomic index
  277. (cond((or(cdr w)(not(or(idp(car w))(numberp(car w)))))
  278. (prog2(setq ![er!] 2206) !!er!!))
  279. ((and(numberp(car w))(not(goodid1!>(car w)wl)))
  280. (prog2(setq ![er!] 21022) !!er!!))
  281. (t(car w))))
  282. ((null(cdr w)) % spinor or enumerating index
  283. (cond((not(or(idp(car w))(numberp(car w))))
  284. (prog2(setq ![er!] 2206) !!er!!))
  285. ((and(numberp(car w))(not(goodid1!>(car w)wl)))
  286. (prog2(setq ![er!] 21022) !!er!!))
  287. (t(car w))))
  288. (t(prog nil % summed spinor index
  289. (setq w(memlist!> '!+ w))
  290. (cond((or(eq w !!er!!)(not(eqn(length w)(dimid!> wl))))
  291. (prog2(setq ![er!] 2206) (return !!er!!))))
  292. (setq w (mapcar w 'auxfun1!>))
  293. (cond((memq !!er!! w)
  294. (prog2(setq ![er!] 2206)(return !!er!!)))
  295. (t(return w)))))))
  296. (de auxfun1!> (w)
  297. (cond((or (cdr w) (and (not(idp(car w))) (not(numberp(car w)))))
  298. !!er!!)
  299. ((and (numberp(car w)) (greaterp(car w)1)) !!er!!)
  300. (t(car w))))
  301. % Compares current list of indices WI with concrete values in WL ...
  302. (de coidxp!> (wi wl)
  303. (cond((and(null wi)(null wl)) t)
  304. (t(and (coidxp1!> (car wi)(car wl))
  305. (coidxp!> (cdr wi)(cdr wl))))))
  306. (de coidxp1!> (wi wl)
  307. (cond((numberp wl)
  308. (cond((eqn wi wl)t)
  309. (t nil)))
  310. ((pairp wl)
  311. (prog2 (setq wl (putindex2!> wl))
  312. (cond((or (lessp wi (car wl))
  313. (lessp(length(cdr wl))(difference wi (car wl))))
  314. nil)
  315. (t t))))
  316. (t t)))
  317. % Preparing Ext. vars for translator ...
  318. (de putindex!> (wi)
  319. (proc(w)
  320. (setq w ![idl!])
  321. (while!> wi
  322. (cond((numberp(car w)) nil)
  323. ((atom(car w))(put (car w) '!=subind (car wi)))
  324. (t(putindex1!> (car w) (car wi))))
  325. (setq w(cdr w)) (setq wi(cdr wi)))))
  326. (de putindex1!> (wa wb)
  327. (proc nil
  328. (setq wa (putindex2!> wa))
  329. (setq wb (difference wb (car wa)))
  330. (setq wa (cdr wa))
  331. (setq wb (add1 wb))
  332. (while!> wa
  333. (put (car wa) '!=subind
  334. (cond((lessp(length wa)wb) 1)
  335. (t 0)))
  336. (setq wa(cdr wa)))))
  337. (de putindex2!> (w)
  338. (proc (wn wr)
  339. (setq wn 0)
  340. (while!> w
  341. (cond
  342. ((numberp(car w)) (setq wn (plus wn (car w))))
  343. (t(setq wr (cons(car w)wr))))
  344. (setq w (cdr w)))
  345. (return(cons wn (reversip wr)))))
  346. % Removing Ext. vars. after translation ...
  347. (de remsubindex!> (w)
  348. (cond((null w) nil)
  349. ((pairp(car w))
  350. (prog2 (remsubindex!>(car w)) (remsubindex!>(cdr w))))
  351. ((idp(car w))(prog2
  352. (remprop (car w) '!=subind)
  353. (remsubindex!>(cdr w))))
  354. (t(remsubindex!>(cdr w)))))
  355. %----- Macro Functions. 08.01.91, 05.96 -------------------------------
  356. % Solution ...
  357. (de getsoln!> (lst)
  358. (cond((cdr lst) (prog2(doub!> '!S!o!l)(err!> 2105)))
  359. ((null(car lst)) (getsoln1!> 0))
  360. ((not(zerop(caar lst))) (prog2(doub!> '!S!o!l)(err!> 2023)))
  361. ((not(numberp(cdar lst))) (prog2(doub!> '!S!o!l)(err!> 2106)))
  362. (t(getsoln1!> (cdar lst)))))
  363. (de getsoln1!> (wn)
  364. (cond((null ![sol!]) (err!> 2113))
  365. (t(proc (w wnn)
  366. (setq wnn wn)
  367. (setq w ![sol!])
  368. (while!> (and w (not(zerop wn)))
  369. (setq w (cdr w))
  370. (setq wn (sub1 wn)))
  371. (cond((or(null w)(not(zerop wn)))
  372. (prog2 (doub!> wnn) (err!> 2114))))
  373. (return(cona1!> 0 (get1equ!>(car w))))))))
  374. %----- Classify command 06.96 ------------------------------------------
  375. (de classify!> (lst)
  376. (proc (w wc wi)
  377. (cond ((null lst) (return nil)))
  378. (cond ((eq (setq w (dgood!> lst)) !!er!!) (return !!er!!)))
  379. (setq w (altdata!> w))
  380. (while!> w
  381. (setq wc (car w))
  382. (cond
  383. ((not(zerop(get wc '!=type)))
  384. (setq ![er!] 9100) (doubo!> wc) (return !!er!!))
  385. ((null(eval wc))
  386. (abse!> wc) (go lab)))
  387. (setq wi (get wc '!=idxl))
  388. (cond
  389. ((null wi) (cmsg!> wc) (scaltype!> (eval wc)))
  390. ((eqn (length wi) 1)
  391. (cond
  392. ((eqn (dimid!> (car wi)) 2) (cmsg!> wc) (emtype!> (eval wc)))
  393. ((eqn (dimid!> (car wi)) 4) (cmsg!> wc) (petrov!> (eval wc)))
  394. (t (setq ![er!] 9101) (doubo!> wc) (return !!er!!))))
  395. ((eqn (length wi) 2)
  396. (cond
  397. ((and (eqn (dimid!> (car wi)) 2) (eqn (dimid!> (cadr wi)) 2))
  398. (cmsg!> wc) (riccisclass!> (eval wc)))
  399. ((and (eqn (dimid!> (car wi)) 1) (eqn (dimid!> (cadr wi)) 1))
  400. (cmsg!> wc) (vectype!> (eval wc)))
  401. (t (setq ![er!] 9101) (doubo!> wc) (return !!er!!))))
  402. (t (setq ![er!] 9101) (doubo!> wc) (return !!er!!)))
  403. lab
  404. (setq w (cdr w)))))
  405. (de cmsg!> (w)
  406. (progn (gprinreset!>)
  407. (gprils!> '("Classifying"))
  408. (pn0!> w)
  409. (gprils0!> '(":"))
  410. (gterpri!>)))
  411. %----- Petrov classification. 08.01.91, 06.96 --------------------------
  412. (de petrov!> (lst)
  413. (prog (w0 w1 w2 w3 w4 wc wr)
  414. (cond (!*trace
  415. (prin2 "Petrov classification ...") (terpri)
  416. (prin2 " Using algorithm by F.W.Letniowski & R.G.McLenaghan") (terpri)
  417. (prin2 " Gen. Rel. Grav. 20 (1988) 463-483") (terpri)))
  418. (setq w0 (aeval (nz!> (getel1!> lst 0 ))))
  419. (setq w1 (aeval (nz!> (getel1!> lst 1 ))))
  420. (setq w2 (aeval (nz!> (getel1!> lst 2 ))))
  421. (setq w3 (aeval (nz!> (getel1!> lst 3 ))))
  422. (setq w4 (aeval (nz!> (getel1!> lst 4 ))))
  423. (setq wc (plus (times 16 (to1!> w0))
  424. (times 8 (to1!> w1))
  425. (times 4 (to1!> w2))
  426. (times 2 (to1!> w3))
  427. (times 1 (to1!> w4)) ))
  428. (cond (!*trace
  429. (prin2 "Case ") (prin2 wc) (prin2 ": ")
  430. (foreach!> x in (list w0 w1 w2 w3 w4) do (progn
  431. (prin2 " ") (cond ((zerop x) (prin2 0)) (t (prin2 "N")))))
  432. (prin2 " =>")
  433. (terpri) ))
  434. (setq wr
  435. (cond
  436. ((eqn wc 0) (finis!> "0" ))
  437. ((eqn wc 1) (finis!> "N" ))
  438. ((eqn wc 2) (finis!> "III" ))
  439. ((eqn wc 3) (finis!> "III" ))
  440. ((eqn wc 4) (finis!> "D" ))
  441. ((eqn wc 5) (finis!> "II" ))
  442. ((eqn wc 6) (finis!> "II" ))
  443. ((eqn wc 7) (alter!> (list 'plus (list 'times 2 w3 w3)
  444. (list 'times -3 w2 w4))
  445. "2*W3^2-3*W2*W4" "D" "II"))
  446. ((eqn wc 8) (finis!> "III" ))
  447. ((eqn wc 9) (finis!> "I" ))
  448. ((eqn wc 10) (finis!> "I" ))
  449. ((eqn wc 11) (alter!> (list 'plus (list 'times 27 w4 w4 w1)
  450. (list 'times 64 w3 w3 w3))
  451. "27*W4^2*W1+64*W3^3" "II" "I"))
  452. ((eqn wc 12) (finis!> "II" ))
  453. ((eqn wc 13) (alter!> (list 'plus (list 'times w1 w1 w4)
  454. (list 'times 2 w2 w2 w2))
  455. "W1^2*W4+2*W2^3" "II" "I"))
  456. ((eqn wc 14) (alter!> (list 'plus (list 'times 9 w2 w2)
  457. (list 'times -16 w1 w3))
  458. "9*W2^2-16*W1*W3" "II" "I"))
  459. ((eqn wc 15) (scase15!> w0 w1 w2 w3 w4))
  460. ((eqn wc 16) (finis!> "N" ))
  461. ((eqn wc 17) (finis!> "I" ))
  462. ((eqn wc 18) (finis!> "I" ))
  463. ((eqn wc 19) (alter!> (list 'plus (list 'times w0 w4 w4 w4)
  464. (list 'times -27 w3 w3 w3 w3))
  465. "W0*W4^3-27*W3^4" "II" "I"))
  466. ((eqn wc 20) (finis!> "II" ))
  467. ((eqn wc 21) (alter!> (list 'plus (list 'times 9 w2 w2)
  468. (list 'times -1 w0 w4))
  469. "9*W2^2-W0*W4" "D" "I"))
  470. ((eqn wc 22) (alter!> (list 'plus (list 'times w3 w3 w0)
  471. (list 'times 2 w2 w2 w2))
  472. "W3^2*W0+2*W2^3" "II" "I"))
  473. ((eqn wc 23) (scase23!> w0 w1 w2 w3 w4))
  474. ((eqn wc 24) (finis!> "III" ))
  475. ((eqn wc 25) (alter!> (list 'plus (list 'times w4 w0 w0 w0)
  476. (list 'times -27 w1 w1 w1 w1))
  477. "W4*W0^3-27*W1^4" "II" "I"))
  478. ((eqn wc 26) (alter!> (list 'plus (list 'times 27 w0 w0 w3)
  479. (list 'times 64 w1 w1 w1))
  480. "27*W0^2*W3+64*W1^3" "II" "I"))
  481. ((eqn wc 27) (scase27!> w0 w1 w2 w3 w4))
  482. ((eqn wc 28) (alter!> (list 'plus (list 'times 2 w1 w1)
  483. (list 'times -3 w2 w0))
  484. "2*W1^2-3*W2*W0" "D" "II"))
  485. ((eqn wc 29) (scase29!> w0 w1 w2 w3 w4))
  486. ((eqn wc 30) (scase30!> w0 w1 w2 w3 w4))
  487. ((eqn wc 31) (scase31!> w0 w1 w2 w3 w4))
  488. ))
  489. (return wr)))
  490. (de to1!> (w)
  491. (cond ((zerop w) 0)
  492. (t 1)))
  493. (de finis!> (w)
  494. (progn
  495. (prin2 "Petrov type is ")
  496. (prin2 w)
  497. (prin2 ".")
  498. (terpri)
  499. w))
  500. (de alter!> (w wp w0 w1)
  501. (prog2
  502. (setq w (aeval w))
  503. (cond ((zerop w) (iszero!> wp 2) (finis!> w0))
  504. (t (isnonzero!> wp 2 w) (finis!> w1)))))
  505. (de iszero!> (wp wl)
  506. (cond (!*trace
  507. (spaces wl)
  508. (prin2 wp)
  509. (prin2 " = 0 =>")
  510. (terpri))))
  511. (de isnonzero!> (wp wl w)
  512. (cond (!*trace
  513. (spaces wl)
  514. (prin2 wp)
  515. (cond (!*showexpr
  516. (prin2 " = ") (terpri)
  517. (algpri!> " ") (algpri!> w) (algterpri!>)
  518. (spaces (sub1 wl))))
  519. (prin2 " is nonzero =>")
  520. (terpri))))
  521. (de zt!> (we wp wl)
  522. (cond ((zerop we) (prog2 (iszero!> wp wl) t))
  523. (t (prog2 (isnonzero!> wp wl we) nil))))
  524. (de scase15!> (w0 w1 w2 w3 w4)
  525. (prog (wi wf1 wf2 wdh)
  526. (setq wi (aeval (list 'plus (list 'times 3 w2 w2)
  527. (list 'times -4 w1 w3))))
  528. (setq wf1 (aeval (list 'plus (list 'times 2 w2 w3)
  529. (list 'times -3 w1 w4))))
  530. (cond
  531. ((zt!> wi "I=3*W2^2-4*W1*W3" 2)
  532. (cond
  533. ((zt!> wf1 "F1=2*W2*W3-3*W1*W4" 4) (return(finis!> "III")))
  534. (t (return(finis!> "I")))))
  535. (t (cond
  536. ((zt!> wf1 "F1=2*W2*W3-3*W1*W4" 4) (return(finis!> "I")))
  537. (t (setq wf2 (aeval (list 'plus (list 'times 9 w2 w4)
  538. (list 'times -8 w3 w3))))
  539. (cond
  540. ((zt!> wf2 "F2=9*W2*W4-8*W3^2" 6) (return(finis!> "I")))
  541. (t (setq wdh (aeval (list 'plus (list 'times 3 wf1 wf1)
  542. (list 'times 2 wi wf2))))
  543. (cond
  544. ((zt!> wdh "D^=3*F1^2+2*I*F2" 8)
  545. (return(finis!> "II")))
  546. (t (return(finis!> "I"))))))))))))
  547. (de scase30!> (w0 w1 w2 w3 w4)
  548. (prog (wi wf1 wf2 wdh)
  549. (setq wi (aeval (list 'plus (list 'times 3 w2 w2)
  550. (list 'times -4 w1 w3))))
  551. (setq wf1 (aeval (list 'plus (list 'times 2 w2 w1)
  552. (list 'times -3 w3 w0))))
  553. (cond
  554. ((zt!> wi "I=3*W2^2-4*W1*W3" 2)
  555. (cond
  556. ((zt!> wf1 "F1=2*W2*W1-3*W3*W0" 4) (return(finis!> "III")))
  557. (t (return(finis!> "I")))))
  558. (t (cond
  559. ((zt!> wf1 "F1=2*W2*W1-3*W3*W0" 4) (return(finis!> "I")))
  560. (t (setq wf2 (aeval (list 'plus (list 'times 9 w2 w0)
  561. (list 'times -8 w1 w1))))
  562. (cond
  563. ((zt!> wf2 "F2=9*W2*W0-8*W1^2" 6) (return(finis!> "I")))
  564. (t (setq wdh (aeval (list 'plus (list 'times 3 wf1 wf1)
  565. (list 'times 2 wi wf2))))
  566. (cond
  567. ((zt!> wdh "D^=3*F1^2+2*I*F2" 8)
  568. (return(finis!> "II")))
  569. (t (return(finis!> "I"))))))))))))
  570. (de scase23!> (w0 w1 w2 w3 w4)
  571. (prog (wi wjh wf3 wdt)
  572. (setq wi (aeval (list 'plus (list 'times w0 w4)
  573. (list 'times 3 w2 w2))))
  574. (setq wjh (aeval (list 'plus (list 'times 4 w2 w4)
  575. (list 'times -3 w3 w3))))
  576. (cond
  577. ((zt!> wi "I=W0*W4+3*W2^2" 2)
  578. (cond
  579. ((zt!> wjh "J^=4*W2*W4-3*W3^2" 4) (return(finis!> "III")))
  580. (t (return(finis!> "I")))))
  581. (t (cond
  582. ((zt!> wjh "J^=4*W2*W4-3*W3^2" 4) (return(finis!> "I")))
  583. (t (setq wf3 (aeval (list 'plus (list 'times w0 wjh)
  584. (list 'times -2 w2 wi ))))
  585. (cond
  586. ((zt!> wf3 "F3=W0*J^-2*W2*I" 6) (return(finis!> "I")))
  587. (t (setq wdt (aeval (list 'plus (list 'times w4 wi wi)
  588. (list 'times -3 wjh wf3))))
  589. (cond
  590. ((zt!> wdt "D~=W4*I^2-3*J^*F3" 8)
  591. (return(finis!> "II")))
  592. (t (return(finis!> "I"))))))))))))
  593. (de scase29!> (w0 w1 w2 w3 w4)
  594. (prog (wi wjh wf3 wdt)
  595. (setq wi (aeval (list 'plus (list 'times w0 w4)
  596. (list 'times 3 w2 w2))))
  597. (setq wjh (aeval (list 'plus (list 'times 4 w2 w0)
  598. (list 'times -3 w1 w1))))
  599. (cond
  600. ((zt!> wi "I=W0*W4+3*W2^2" 2)
  601. (cond
  602. ((zt!> wjh "J^=4*W2*W0-3*W1^2" 4) (return(finis!> "III")))
  603. (t (return(finis!> "I")))))
  604. (t (cond
  605. ((zt!> wjh "J^=4*W2*W0-3*W1^2" 4) (return(finis!> "I")))
  606. (t (setq wf3 (aeval (list 'plus (list 'times w4 wjh)
  607. (list 'times -2 w2 wi ))))
  608. (cond
  609. ((zt!> wf3 "F3=W4*J^-2*W2*I" 6) (return(finis!> "I")))
  610. (t (setq wdt (aeval (list 'plus (list 'times w0 wi wi)
  611. (list 'times -3 wjh wf3))))
  612. (cond
  613. ((zt!> wdt "D~=W0*I^2-3*J^*F3" 8)
  614. (return(finis!> "II")))
  615. (t (return(finis!> "I"))))))))))))
  616. (de scase27!> (w0 w1 w2 w3 w4)
  617. (prog (wv wu ww wi wj wd)
  618. (setq wv (aeval (list 'plus (list 'times w0 w3 w3)
  619. (list 'times -1 w1 w1 w4))))
  620. (cond
  621. ((zt!> wv "V=W0*W3^3-W1^2*W4" 2)
  622. (setq wu (aeval (list 'plus (list 'times w0 w4)
  623. (list 'times 2 w1 w3))))
  624. (cond
  625. ((zt!> wu "U=W0*W4+2*W1*W3" 4) (return(finis!> "D")))
  626. (t
  627. (setq ww (aeval (list 'plus (list 'times w0 w4)
  628. (list 'times -16 w1 w3))))
  629. (cond
  630. ((zt!> ww "W=W0*W4-16*W1*W3" 6) (return(finis!> "II")))
  631. (t (return(finis!> "I")))))))
  632. (t
  633. (setq wi (aeval (list 'plus (list 'times w0 w4)
  634. (list 'times -4 w1 w3))))
  635. (setq wj (aeval (list 'plus (list 'times -1 w0 w3 w3)
  636. (list 'times -1 w1 w1 w4))))
  637. (cond
  638. ((ZT!> WI "I=W0*W4-4*W1*W3" 4)
  639. (cond
  640. ((zt!> wj "J=-W0*W3^2-W1^2*W4" 6) (return(finis!> "III")))
  641. (t (return(finis!> "I")))))
  642. ((zt!> wj "J=-W0*W3^2-W1^2*W4" 6) (return(finis!> "I")))
  643. (t
  644. (setq wd (aeval (list 'plus (list 'times wi wi wi)
  645. (list 'times -27 wj wj ))))
  646. (cond
  647. ((zt!> wd "D=I^3-27*J^2" 8) (return(finis!> "II")))
  648. (t (return(finis!> "I"))))))))))
  649. (de scase31!> (w0 w1 w2 w3 w4)
  650. (prog (wh wf we wa wi wq wj wg wz wss wd)
  651. (setq wh (aeval (list 'plus (list 'times w0 w2 )
  652. (list 'times -1 w1 w1 ))))
  653. (cond
  654. ((zt!> wh "H=W0*W2-W1^2" 2)
  655. (setq wf (aeval (list 'plus (list 'times w0 w3 )
  656. (list 'times -1 w1 w2 ))))
  657. (setq we (aeval (list 'plus (list 'times w0 w4 )
  658. (list 'times -1 w2 w2 ))))
  659. (cond
  660. ((zt!> wf "F=W0*W3-W1*W2" 4)
  661. (cond
  662. ((zt!> we "E=W0*W4-W2^2" 6) (return(finis!> "N")))
  663. (t (return(finis!> "I")))))
  664. ((zt!> we "E=W0*W4-W2^2" 6)
  665. (setq wq (aeval (list 'plus (list 'times 37 w2 w2 )
  666. (list 'times 27 w1 w3 ))))
  667. (cond
  668. ((zt!> wq "Q=37*W2^2+27*W1*W3" 8) (return(finis!> "II")))
  669. (t (return(finis!> "I")))))
  670. (t
  671. (setq wa (aeval (list 'plus (list 'times w1 w3 )
  672. (list 'times -1 w2 w2 ))))
  673. (setq wi (aeval (list 'plus we (list 'times -4 wa ))))
  674. (cond
  675. ((zt!> wi "A=W1*W3-W2^2; I=E-4*A" 8) (return(finis!> "I")))
  676. (t
  677. (setq wj (aeval (list 'plus (list 'times w4 wh )
  678. (list 'times -1 w3 wf )
  679. (list 'times w2 wa ))))
  680. (setq wd (aeval (list 'plus (list 'times wi wi wi )
  681. (list 'times -27 wj wj ))))
  682. (cond
  683. ((zt!> wd "J=W4*H-W3*F+W2*A; D=I^3-27*J^2" 10)
  684. (return(finis!> "II")))
  685. (t (return(finis!> "I")))))))))
  686. (t
  687. (setq wf (aeval (list 'plus (list 'times w0 w3 )
  688. (list 'times -1 w1 w2 ))))
  689. (setq we (aeval (list 'plus (list 'times w0 w4 )
  690. (list 'times -1 w2 w2 ))))
  691. (setq wa (aeval (list 'plus (list 'times w1 w3 )
  692. (list 'times -1 w2 w2 ))))
  693. (setq wi (aeval (list 'plus we (list 'times -4 wa ))))
  694. (cond
  695. ((zt!> wi "E=W0*W4-W2^2; A=W1*W3-W2^2; I=E-4*A" 4)
  696. (setq wf (aeval (list 'plus (list 'times w0 w3 )
  697. (list 'times -1 w1 w2 ))))
  698. (setq wj (aeval (list 'plus (list 'times w4 wh )
  699. (list 'times -1 w3 wf )
  700. (list 'times w2 wa ))))
  701. (cond
  702. ((zt!> wj "F=W0*W3-W1*W2; J=W4*H-W3*F+W2*A" 6)
  703. (return(finis!> "III")))
  704. (t (return(finis!> "I")))))
  705. (t
  706. (setq wf (aeval (list 'plus (list 'times w0 w3 )
  707. (list 'times -1 w1 w2 ))))
  708. (setq wg (aeval (list 'plus (list 'times w0 wf )
  709. (list 'times -2 w1 wh ))))
  710. (cond
  711. ((zt!> wg "G=W0*F-2*W1*H" 6)
  712. (setq wz (aeval (list 'plus (list 'times w0 w0 wi )
  713. (list 'times -12 wh wh ))))
  714. (cond
  715. ((zt!> WZ "Z=W0^2*I-12*H^2" 8) (return(finis!> "D")))
  716. (t
  717. (setq wss (aeval (list 'plus (list 'times w0 w0 wi )
  718. (list 'times -3 wh wh ))))
  719. (cond
  720. ((zt!> wss "S=W0^2*I-3*H^2" 10)
  721. (return(finis!> "II")))
  722. (t (return(finis!> "I")))))))
  723. (t
  724. (setq wj (aeval (list 'plus (list 'times w4 wh )
  725. (list 'times -1 w3 wf )
  726. (list 'times w2 wa ))))
  727. (cond
  728. ((zt!> wj "J=W4*H-W3*F+W2*A" 8) (return(finis!> "I")))
  729. (t
  730. (setq wd (aeval (list 'plus (list 'times wi wi wi )
  731. (list 'times -27 wj wj ))))
  732. (cond
  733. ((zt!> wd "D=I^3-27*J^3" 10)
  734. (return(finis!> "II")))
  735. (t (return(finis!> "I"))))))))))))))
  736. %------- EM Type 06.96 ----------------------------------------------------
  737. (de emtype!> (lst)
  738. (prog (w0 w1 w2 wc wr wd)
  739. (cond (!*trace
  740. (prin2 "EM strength classification ...") (terpri)))
  741. (setq w0 (aeval (nz!> (getel1!> lst 0 ))))
  742. (setq w1 (aeval (nz!> (getel1!> lst 1 ))))
  743. (setq w2 (aeval (nz!> (getel1!> lst 2 ))))
  744. (setq wc (plus (times 4 (to1!> w0))
  745. (times 2 (to1!> w1))
  746. (times 1 (to1!> w2)) ))
  747. (cond (!*trace
  748. (prin2 "Case ") (prin2 wc) (prin2 ": ")
  749. (foreach!> x in (list w0 w1 w2) do (progn
  750. (prin2 " ") (cond ((zerop x) (prin2 0)) (t (prin2 "N")))))
  751. (prin2 " =>")
  752. (terpri) ))
  753. (setq wr
  754. (cond
  755. ((eqn wc 0) (emfinis!> "0"))
  756. ((eqn wc 1) (emfinis!> "N"))
  757. ((eqn wc 2) (emfinis!> "I"))
  758. ((eqn wc 3) (emfinis!> "I"))
  759. ((eqn wc 4) (emfinis!> "N"))
  760. ((eqn wc 5) (emfinis!> "I"))
  761. ((eqn wc 6) (emfinis!> "I"))
  762. ((eqn wc 7)
  763. (setq wd (aeval (list 'plus (list 'times w0 w2)
  764. (list 'times -1 w1 w1))))
  765. (cond
  766. ((zt!> wd "D=F0*F2-F1^2" 2) (emfinis!> "N"))
  767. (t (emfinis!> "I"))))))
  768. (return wr)))
  769. (de emfinis!> (w)
  770. (progn
  771. (prin2 "EM type is ")
  772. (prin2 w)
  773. (prin2 ".")
  774. (terpri)
  775. w))
  776. %------- Ricci spinor classification 06.96 --------------------------------
  777. (de riccisclass!> (lst)
  778. (prog (f00 f01 f02 f11 f12 f22 w0 w1 w2 w3 w4 wc wr wpp wi6 ww
  779. wq ws1 ws2 ws3 ws4 ws5 ws6 ws7 wip wi7)
  780. (cond (!*trace
  781. (prin2 "Ricci Spinor classification ...") (terpri)
  782. (prin2 " Using algorithm by G.C.Joly, M.A.H.McCallum & W.Seixas") (terpri)
  783. (prin2 " Class. Quantum Grav. 7 (1990) 541-556") (terpri)
  784. (prin2 " Class. Quantum Grav. 8 (1991) 1577-1585") (terpri)))
  785. (setq f00 (aeval (nz!> (getel2!> lst 0 0))))
  786. (setq f01 (aeval (nz!> (getel2!> lst 0 1))))
  787. (setq f02 (aeval (nz!> (getel2!> lst 0 2))))
  788. (setq f11 (aeval (nz!> (getel2!> lst 1 1))))
  789. (setq f12 (aeval (nz!> (getel2!> lst 1 2))))
  790. (setq f22 (aeval (nz!> (getel2!> lst 2 2))))
  791. (setq wc (mapcar (list f00 f01 f02 f11 f12 f22) 'to1!>))
  792. (cond (!*trace
  793. (prin2 "Case ")
  794. (foreach!> x in wc do (prin2 x))
  795. (prin2 " =>")
  796. (terpri) ))
  797. % Special cases ...
  798. (setq wr
  799. (cond
  800. ((equal wc '(0 0 0 0 0 0)) (rfin!> "0" "[(1111)]"))
  801. ((equal wc '(0 0 0 1 0 0)) (rfin!> "D" "[(11)(1,1)]"))
  802. ((equal wc '(0 0 1 0 0 0)) (rfin!> "D" "[11(1,1)]"))
  803. ((equal wc '(0 0 0 0 0 1)) (rfin!> "0" "[(112)]"))
  804. ((equal wc '(1 0 0 0 0 0)) (rfin!> "0" "[(112)]"))
  805. ((equal wc '(0 0 0 1 0 1)) (rfin!> "D" "[(11)2]"))
  806. ((equal wc '(1 0 0 1 0 0)) (rfin!> "D" "[(11)2]"))
  807. ((equal wc '(0 0 1 0 0 1)) (rfin!> "II" "[112]"))
  808. ((equal wc '(1 0 1 0 0 0)) (rfin!> "II" "[112]"))
  809. ((equal wc '(0 0 0 0 1 0)) (rfin!> "N" "[(13)]"))
  810. ((equal wc '(0 1 0 0 0 0)) (rfin!> "N" "[(13)]"))
  811. ((equal wc '(0 0 0 1 1 0)) (rfin!> "D" "[(11)2]"))
  812. ((equal wc '(0 1 0 1 0 0)) (rfin!> "D" "[(11)2]"))
  813. ((equal wc '(0 0 0 0 1 1)) (rfin!> "N" "[(13)]"))
  814. ((equal wc '(1 1 0 0 0 0)) (rfin!> "N" "[(13)]"))
  815. ((equal wc '(0 1 0 0 0 1)) (rfin!> "I" "[11ZZ~]"))
  816. ((equal wc '(1 0 0 0 1 0)) (rfin!> "I" "[11ZZ~]"))
  817. ))
  818. (cond (wr (return wr)))
  819. % General case ...
  820. % PP type first ...
  821. (setq w0 (aeval(wff!> 0 lst)))
  822. (setq w1 (aeval(wff!> 1 lst)))
  823. (setq w2 (aeval(wff!> 2 lst)))
  824. (setq w3 (aeval(wff!> 3 lst)))
  825. (setq w4 (aeval(wff!> 4 lst)))
  826. (cond (!*trace
  827. (prin2 "Making Petrov-Plebanski (PP) classification ...")
  828. (terpri)))
  829. (setq wpp (petrov!> (list w0 w1 w2 w3 w4)))
  830. % Segre type ...
  831. (setq wr
  832. (cond
  833. ((equal wpp "0" )
  834. (setq ww (aeval (list 'plus
  835. (list 'times f11 f11)
  836. (list 'times -1 f12 (gfab!> 1 0 lst)))))
  837. (cond
  838. ((zt!> ww "W=F11'^2-F10'*F12'" 2) (rfin!> wpp "[(112)]"))
  839. ((zt!> f00 "F00" 4) (rfin!> wpp "[1(11,1)]"))
  840. ((zt!> f22 "F22" 4) (rfin!> wpp "[1(11,1)]"))
  841. (t (rfincond!> wpp "[(111),1]"
  842. " if W>0 and "
  843. "[1(11,1)]"
  844. " if W<0"))))
  845. ((equal wpp "I" ) (rfincond!> wpp "[111,1]"
  846. " if D>0 and "
  847. "[11ZZ~]"
  848. " if D<0"))
  849. ((equal wpp "II" ) (rfin!> wpp "[112]"))
  850. ((equal wpp "III") (rfin!> wpp "[13]"))
  851. ((equal wpp "N" )
  852. (setq wi6 (aeval (list 'plus
  853. (list 'times (gfab!> 0 0 lst) (gfab!> 2 2 lst))
  854. (list 'times 2 (gfab!> 1 1 lst) (gfab!> 1 1 lst))
  855. (list 'times -2 (gfab!> 0 1 lst) (gfab!> 2 1 lst))
  856. (list 'times -2 (gfab!> 1 0 lst) (gfab!> 1 2 lst))
  857. (list 'times (gfab!> 0 2 lst) (gfab!> 2 0 lst)))))
  858. (cond
  859. ((zt!> wi6 "I6" 2) (rfin!> wpp "[(13)]"))
  860. (t (rfin!> wpp "[1(12)]"))))
  861. ((equal wpp "D" )
  862. (setq wi6 (aeval (list 'plus
  863. (list 'times (gfab!> 0 0 lst) (gfab!> 2 2 lst))
  864. (list 'times 2 (gfab!> 1 1 lst) (gfab!> 1 1 lst))
  865. (list 'times -2 (gfab!> 0 1 lst) (gfab!> 2 1 lst))
  866. (list 'times -2 (gfab!> 1 0 lst) (gfab!> 1 2 lst))
  867. (list 'times (gfab!> 0 2 lst) (gfab!> 2 0 lst)))))
  868. (cond
  869. ((zt!> wi6 "I6" 2) (rfin!> wpp "[(11)ZZ~]"))
  870. (t
  871. (setq wip (aeval (list 'plus
  872. (list 'times w0 w4)
  873. (list 'times -4 w1 w3)
  874. (list 'times 3 w2 w2))))
  875. (setq ww (aeval (list 'plus
  876. (list 'times f11 f11)
  877. (list 'times -1 f12 (gfab!> 1 0 lst)))))
  878. (setq wq (aeval
  879. (list 'plus wip
  880. (list 'times -3 (list 'expt (list 'plus w2 ww) 2)))))
  881. (cond
  882. ((zt!> wq "Q" 4)
  883. (setq ws1 (aeval (list 'plus
  884. (list 'times (gfab!> 2 0 lst) (gfab!> 1 2 lst))
  885. (list 'times -1 (gfab!> 1 0 lst) (gfab!> 2 2 lst)))))
  886. (setq ws2 (aeval (list 'plus
  887. (list 'times (gfab!> 0 0 lst) (gfab!> 2 2 lst))
  888. (list 'times -1 (gfab!> 2 0 lst) (gfab!> 0 2 lst)))))
  889. (setq ws3 (aeval (list 'plus
  890. (list 'times (gfab!> 1 0 lst) (gfab!> 0 2 lst))
  891. (list 'times -1 (gfab!> 0 0 lst) (gfab!> 1 2 lst)))))
  892. (setq ws4 (aeval (list 'plus
  893. (list 'times (gfab!> 0 0 lst) (gfab!> 1 1 lst))
  894. (list 'times -1 (gfab!> 1 0 lst) (gfab!> 0 1 lst)))))
  895. (setq ws5 (aeval (list 'plus
  896. (list 'times (gfab!> 0 1 lst) (gfab!> 1 2 lst))
  897. (list 'times -1 (gfab!> 0 2 lst) (gfab!> 1 1 lst)))))
  898. (setq ws6 (aeval (list 'plus
  899. (list 'times (gfab!> 1 1 lst) (gfab!> 2 2 lst))
  900. (list 'times -1 (gfab!> 1 2 lst) (gfab!> 2 1 lst)))))
  901. (setq wi7 (aeval (list 'plus
  902. (list 'times f01 ws1)
  903. (list 'times f11 ws2)
  904. (list 'times (gfab!> 2 1 lst) ws3))))
  905. (cond
  906. ((and (zt!> ws1 "S1" 6)
  907. (zt!> ws2 "S2" 6)
  908. (zt!> ws3 "S3" 6))
  909. (cond
  910. ((and (zt!> ws4 "S4" 6)
  911. (zt!> ws5 "S5" 6)
  912. (zt!> ws6 "S6" 6))
  913. (rfin!> wpp "[(11)(1,1)]"))
  914. (t (rfin!> wpp "[(11)2]"))))
  915. ((zt!> wi7 "I7" 6) (rfin!> wpp "[(11)2]"))
  916. (t (rfin!> wpp "[11ZZ~]"))))
  917. (t (rfincond!> wpp "[(11)ZZ~]"
  918. " if S7<0 and "
  919. "[(11)1,1] or [11(1,1)]"
  920. " if S7>0"))))
  921. ))))
  922. (return wr)))
  923. (de rfin!> (wpp wss)
  924. (progn
  925. (prin2 "Petrov-Plebanski type is ")
  926. (prin2 wpp)
  927. (prin2 ".") (terpri)
  928. (prin2 "Segre type is ")
  929. (prin2 wss)
  930. (prin2 ".")
  931. (terpri)
  932. (cons wpp wss)))
  933. (de rfincond!> (wpp wss1 wcc1 wss2 wcc2)
  934. (progn
  935. (prin2 "PP type is ")
  936. (prin2 wpp)
  937. (prin2 ".") (terpri)
  938. (prin2 "Segre type is ")
  939. (prin2 wss1)
  940. (prin2 wcc1)
  941. (prin2 wss2)
  942. (prin2 wcc2)
  943. (prin2 ".")
  944. (terpri)
  945. (cons wpp (cons wss1 wss2))))
  946. (de gfab!> (wa wb lst)
  947. (cond ((lessp wb wa) (nz!>(coalg!>(getel2!> lst wb wa))))
  948. (t (nz!> (getel2!> lst wa wb)))))
  949. (de ffabsum!> (wa wb lst)
  950. (list 'quotient
  951. (list 'plus
  952. (list 'times (gfab!> wa 0 lst) (gfab!> wb 2 lst))
  953. (list 'times (gfab!> wa 2 lst) (gfab!> wb 0 lst))
  954. (list 'times -2 (gfab!> wa 1 lst) (gfab!> wb 1 lst)) )
  955. 4))
  956. (de wff!> (wa lst)
  957. (cond
  958. ((eqn wa 0) (ffabsum!> 0 0 lst))
  959. ((eqn wa 1) (list 'quotient
  960. (list 'plus (ffabsum!> 0 1 lst) (ffabsum!> 1 0 lst))
  961. 2))
  962. ((eqn wa 2) (list 'quotient
  963. (list 'plus (ffabsum!> 0 2 lst) (ffabsum!> 2 0 lst)
  964. (list 'times 4 (ffabsum!> 1 1 lst)))
  965. 6))
  966. ((eqn wa 3) (list 'quotient
  967. (list 'plus (ffabsum!> 1 2 lst) (ffabsum!> 2 1 lst))
  968. 2))
  969. ((eqn wa 4) (ffabsum!> 2 2 lst))
  970. ))
  971. %--------- Vector and Scalar classification 06.96 -------------------------
  972. (de scaltype!> (lst)
  973. (prog (w)
  974. (setq w (aeval(nz!>(car lst))))
  975. (cond ((zerop w) (prin2 "Scalar is 0.") (terpri))
  976. (t (prin2 "Scalar is nonzero.") (terpri)))
  977. (return (to1!> w))))
  978. (de vectype!> (lst)
  979. (prog (v01 v10 v00 v11 w)
  980. (setq v00 (aeval (gfab!> 0 0 lst)))
  981. (setq v01 (aeval (gfab!> 0 1 lst)))
  982. (setq v10 (aeval (gfab!> 1 0 lst)))
  983. (setq v11 (aeval (gfab!> 1 1 lst)))
  984. (setq w (aeval (list 'plus (list 'times 2 v01 v10)
  985. (list 'times -2 v00 v11))))
  986. (cond
  987. ((zt!> w "2*V01'*V10'-2*V00'*V11'" 2)
  988. (prin2 "Vector is Null.") (terpri))
  989. (t (prin2 "Vector is Time or Space-like.") (terpri)))
  990. (return (to1!> w))))
  991. %=========== End of GRGclass.sl =========================================%