home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 June / Chip_2002-06_cd1.bin / zkuste / derive / download / Setup.exe / %MAINDIR% / Users / Tensor.mth < prev    next >
Encoding:
Text File  |  2002-05-15  |  12.7 KB  |  338 lines

  1. "         The Derive Tensor Algebra and Analysis Package        "
  2.  
  3. "            Utility File Tensor.mth             "
  4.  
  5. "      Written by Hans A. Dudler (619 420-1787)   2 December 1994    "
  6.  
  7. "      Updated for Derive 5             10 November 2001    "
  8.  
  9. "    For detailed documentation, see the text file Tensor.doc    "
  10.  
  11. [InputMode:=Word,CaseMode:=Sensitive]
  12.  
  13. ;Expand tensor (rank r) into linear array
  14. lInarx(A,r):=IF(r>1,lInarx(APPEND(A),r-1),A)
  15.  
  16. ;Aux.fct.for iVl(L,r,d)
  17. iVlx(L,L1,iv,d,n):=IF(n<1,iv,iVlx(L1,FLOOR(L1,d),APPEND([L+1-d*L1],iv),d,n-1))
  18.  
  19. ;Index vector from lin.index "L"
  20. iVl(L,r,d):=iVlx(L-1,FLOOR(L-1,d),[],d,r)
  21.  
  22. ;Locate last "e" in "v"
  23. lOel(v,e,n):=IF(v SUB n=e OR n<1,n,lOel(v,e,n-1),lOel(v,e,n-1))
  24.  
  25. ;General vector nesting function
  26. vNestx(P,ivP,d,n):=IF(n<1,P,vNestx(VECTOR(P,ivP SUB n,d),ivP,d,n-1))
  27.  
  28. ;Aux.fct.for PERM_EL(v)
  29. aUgvp(v,e):=VECTOR(VECTOR(IF(iIp<jJp,v SUB iIp,IF(iIp>jJp,v SUB (iIp-1),e)),iI~
  30. p,DIMENSION(v)+1),jJp,DIMENSION(v)+1,1,-1)
  31.  
  32. ;Aux.fct.for PERM_EL(v)
  33. pVae(M,e,P,d,n):=IF(n>d,P,pVae(M,e,APPEND(P,aUgvp(M SUB n,e)),d,n+1))
  34.  
  35. ;Aux.fct.for PERM_EL(v)
  36. pErme(v,P,n):=IF(n>DIMENSION(v),P,pErme(v,pVae(P,v SUB n,[],DIMENSION(P),1),n+~
  37. 1))
  38.  
  39. ;All permutations of elem.of "v"
  40. PERM_EL(v):=pErme(v,[[]],1)
  41.  
  42. ;List of dummy index names
  43. iNdxa:=[iA1_,iA2_,iA3_,iA4_,iA5_,iA6_,iA7_,iA8_,iA9_,iAa_,iAb_,iAc_,iAd_,iAe_,~
  44. iAf_]
  45.  
  46. ;Dummy index vector
  47. iVa_(n):=VECTOR(iNdxa SUB iNd_,iNd_,n)
  48.  
  49. ;List of dummy index names
  50. iNdxb:=[iB1_,iB2_,iB3_,iB4_,iB5_,iB6_,iB7_,iB8_,iB9_,iBa_,iBb_,iBc_,iBd_,iBe_,~
  51. iBf_]
  52.  
  53. ;Dummy index vector
  54. iVb_(n):=VECTOR(iNdxb SUB iNd_,iNd_,n)
  55.  
  56. ;Elem.of Kronecker Delta
  57. EL_D(i,j):=IF(i=j,1,0)
  58.  
  59. ;Aux.fct.for EL_GD
  60. cEpm(iv1,iv2,pv,m,n):=IF(n>DIMENSION(iv1),pv,IF(iv2 SUB m=iv1 SUB n,cEpm(iv1,i~
  61. v2,APPEND(pv,[m]),1,n+1),cEpm(iv1,iv2,pv,IF(m<DIMENSION(iv1),m+1,1),IF(m<DIMEN~
  62. SION(iv1),n,m+1))))
  63.  
  64. ;Aux.fct.for EL_GD
  65. eOpi(v,i,m,n):=IF(n=DIMENSION(v),i,IF(v SUB m=v SUB n,0,eOpi(v,IF(v SUB m>v SU~
  66. B n,i,-i),IF(m<DIMENSION(v),m+1,n+2),IF(m<DIMENSION(v),n,n+1))))
  67.  
  68. ;Aux.fct.for EL_GD
  69. eGdx(v,d):=IF(DIMENSION(v)<d,0,eOpi(v,1,2,1))
  70.  
  71. ;Elem.of Generalized Kronecker Delta
  72. EL_GD(iv1,iv2):=eGdx(cEpm(iv1,iv2,[],1,1),DIMENSION(iv1))
  73.  
  74. ;Elem.of permutation symbol (epsilon)
  75. EL_E(iv):=eOpi(iv,1,2,1)
  76.  
  77. ;Dimension of a tensor
  78. DIM_T(A):=IF(DIMENSION(A)=4,4,DIMENSION(A),0)
  79.  
  80. ;Rank of a tensor
  81. RANK_T(A,n:=0):=LOOP(IF(NOT(VECTOR?(A)),RETURN(n)),A:=A SUB 1,n:+1)
  82.  
  83. ;Aux.fct.for EL_T(A,iv)
  84. eLt(A,iv,n):=IF(n>DIMENSION(iv),A,eLt(A SUB (iv SUB n),iv,n+1))
  85.  
  86. ;Extract elem.from tensor (iv:index vect.)
  87. EL_T(A,iv):=eLt(A,iv,1)
  88.  
  89. ;Kronecker Delta (tensor)
  90. DELTA(dim):=IDENTITY_MATRIX(dim)
  91.  
  92. ;Epsilon (permutation) tensor
  93. EPS(d):=LIM(vNestx(eOpi(iVa_(d),1,2,1),iVa_(d),dIm,d),dIm,d)
  94.  
  95. ;Generalized Kronecker Delta (tensor)
  96. GDELTA(ncov,d):=LIM(vNestx(eGdx(cEpm(iVa_(ncov),iVb_(ncov),[],1,1),ncov),APPEN~
  97. D(iVa_(ncov),iVb_(ncov)),dIm,2*ncov),dIm,d)
  98.  
  99. ;Inner prod.of two tensors
  100. IP_T(A,ivA,B,ivB,ivP):=vNestx(SUM(eLt(A,ivA,1)*eLt(B,ivB,1),sS,1,DIMENSION(A))~
  101. ,ivP,DIMENSION(A),DIMENSION(ivP))
  102.  
  103. ;Inner prod.of two tensors (short form)
  104. I_T(A,sA,B,sB):=IP_T(A,REPLACE_ELEMENT(sS,iVa_(RANK_T(A)),sA),B,REPLACE_ELEMEN~
  105. T(sS,iVb_(RANK_T(B)),sB),APPEND(DELETE_ELEMENT(iVa_(RANK_T(A)),sA),DELETE_ELEM~
  106. ENT(iVb_(RANK_T(B)),sB)))
  107.  
  108. ;Move (raise or lower) index
  109. MI_T(A,n,metric):=IP_T(metric,[iNdxa SUB n,sS],A,REPLACE_ELEMENT(sS,iVa_(RANK_~
  110. T(A)),n),iVa_(RANK_T(A)))
  111.  
  112. ;Elem.of inner product
  113. EL_IP_T(A,ivnA,B,ivnB):=SUM(eLt(A,ivnA,1)*eLt(B,ivnB,1),sS,1,DIMENSION(A))
  114.  
  115. ;Outer prod.of two tensors
  116. OP_T(A,ivA,B,ivB,ivP):=vNestx(IF(lOel(ivA,ivP SUB DIMENSION(ivP),DIMENSION(ivA~
  117. ))=0,VECTOR(eLt(B,ivB,1),ivP SUB DIMENSION(ivP),DIMENSION(B))*eLt(A,ivA,1),VEC~
  118. TOR(eLt(A,ivA,1),ivP SUB DIMENSION(ivP),DIMENSION(A))*eLt(B,ivB,1)),ivP,DIMENS~
  119. ION(A),DIMENSION(ivP)-1)
  120.  
  121. ;Outer prod.of two tensors (short form)
  122. O_T(A,B):=OP_T(A,iVa_(RANK_T(A)),B,iVb_(RANK_T(B)),APPEND(iVa_(RANK_T(A)),iVb_~
  123. (RANK_T(B))))
  124.  
  125. ;Transpose of a tensor
  126. TP_T(A,ivA,ivT):=vNestx(eLt(A,ivA,1),ivT,DIMENSION(A),DIMENSION(ivT))
  127.  
  128. ;Contraction of a tensor
  129. CT_T(A,ivA,ivC):=vNestx(SUM(eLt(A,ivA,1),sS,1,DIMENSION(A)),ivC,DIMENSION(A),D~
  130. IMENSION(ivC))
  131.  
  132. ;Contraction of a tensor (short form)
  133. C_T(A,s1,s2):=vNestx(SUM(eLt(A,REPLACE_ELEMENT(sS,REPLACE_ELEMENT(sS,iVa_(RANK~
  134. _T(A)),s1),s2),1),sS,1,DIMENSION(A)),IF(s2>s1,DELETE_ELEMENT(DELETE_ELEMENT(iV~
  135. a_(RANK_T(A)),s2),s1),DELETE_ELEMENT(DELETE_ELEMENT(iVa_(RANK_T(A)),s1),s2)),D~
  136. IMENSION(A),RANK_T(A)-2)
  137.  
  138. ;Contract inner product (summ.ind.sS,tT)
  139. CI_T(A,ivA,B,ivB,ivP):=vNestx(SUM(SUM(eLt(A,ivA,1)*eLt(B,ivB,1),sS,1,DIMENSION~
  140. (A)),tT,1,DIMENSION(A)),ivP,DIMENSION(A),DIMENSION(ivP))
  141.  
  142. ;Contract inner product (short form)
  143. C_I_T(A,sA,tA,B,sB,tB):=CI_T(A,REPLACE_ELEMENT(tT,REPLACE_ELEMENT(sS,iVa_(RANK~
  144. _T(A)),sA),tA),B,REPLACE_ELEMENT(tT,REPLACE_ELEMENT(sS,iVb_(RANK_T(B)),sB),tB)~
  145. ,APPEND(IF(tA>sA,DELETE_ELEMENT(DELETE_ELEMENT(iVa_(RANK_T(A)),tA),sA),DELETE_~
  146. ELEMENT(DELETE_ELEMENT(iVa_(RANK_T(A)),sA),tA)),IF(tB>sB,DELETE_ELEMENT(DELETE~
  147. _ELEMENT(iVb_(RANK_T(B)),tB),sB),DELETE_ELEMENT(DELETE_ELEMENT(iVb_(RANK_T(B))~
  148. ,sB),tB))))
  149.  
  150. ;Aux.fct.for NZEL_T(A)
  151. nZel(A1,r,d):=(ITERATE(IF(A1 SUB v1=0,[v2,v1+1],[APPEND(v2,[[iVl(v1,r,d),A1 SU~
  152. B v1]]),v1+1],[APPEND(v2,[[iVl(v1,r,d),A1 SUB v1]]),v1+1]),[v2,v1],[[],1],DIME~
  153. NSION(A1))) SUB 1
  154.  
  155. ;Extract non-zero elements from tensor
  156. NZEL_T(A):=nZel(lInarx(A,RANK_T(A)),RANK_T(A),DIMENSION(A))
  157.  
  158. ;Aux.fct.for GNZE_T(A)
  159. iNze(A1):=(ITERATE(IF(A1 SUB v2=0,[v1,v2+1],[APPEND(v1,[v2]),v2+1],[APPEND(v1,~
  160. [v2]),v2+1]),[v1,v2],[[],1],DIMENSION(A1))) SUB 1
  161.  
  162. ;Aux.fct.for GNZE_T(A)
  163. xNze1(A1,iNz,kEy,r,d):=ITERATE(IF(A1 SUB (iNz SUB v1)=kEy,[APPEND(v3,[iVl(iNz ~
  164. SUB v1,r,d)]),v2,v1+1],IF(A1 SUB (iNz SUB v1)=-kEy,[APPEND(v3,-[iVl(iNz SUB v1~
  165. ,r,d)]),v2,v1+1],[v3,APPEND(v2,[iNz SUB v1]),v1+1]),IF(A1 SUB (iNz SUB v1)=-kE~
  166. y,[APPEND(v3,-[iVl(iNz SUB v1,r,d)]),v2,v1+1],[v3,APPEND(v2,[iNz SUB v1]),v1+1~
  167. ],[v3,APPEND(v2,[iNz SUB v1]),v1+1])),[v3,v2,v1],[[],[],1],DIMENSION(iNz))
  168.  
  169. ;Aux.fct.for GNZE_T(A)
  170. xNze2(C,Z,kEy):=[APPEND(C SUB 1,[[Z SUB 1,kEy]]),Z SUB 2]
  171.  
  172. ;Aux.fct.for GNZE_T(A)
  173. xNze(A1,C,r,d):=xNze2(C,xNze1(A1,C SUB 2,A1 SUB (C SUB 2 SUB 1),r,d),A1 SUB (C~
  174.  SUB 2 SUB 1))
  175.  
  176. ;Aux.fct.for GNZE_T(A)
  177. gNze1(A1,C,r,d):=IF(DIMENSION(C SUB 2)=0,C SUB 1,gNze1(A1,xNze(A1,C,r,d),r,d))
  178.  
  179. ;Aux.fct.for GNZE_T(A)
  180. gNze(A1,r,d):=gNze1(A1,[[],iNze(A1)],r,d)
  181.  
  182. ;Extract and group non-zero elements
  183. GNZE_T(A):=gNze(lInarx(A,RANK_T(A)),RANK_T(A),DIMENSION(A))
  184.  
  185. ;Aux.fct.for OD_T(A,x)
  186. oDaux(A,ivA,x,d):=vNestx(DIF(eLt(A,ivA,1),x SUB dD_),APPEND(ivA,[dD_]),d,DIMEN~
  187. SION(ivA)+1)
  188.  
  189. ;Ordinary derivative of a tensor
  190. OD_T(A,x):=LIM(oDaux(A,iVa_(RANK_T(A)),x,dIm),dIm,DIMENSION(x))
  191.  
  192. ;Aux.fct.for CD_T(A,ncov,weight,x,C_ij_k)
  193. cDaux(A,ncov,weight,x,C_ij_k,rA,iv,ivR,dim):=OD_T(A,x)-SUM(IP_T(A,REPLACE_ELEM~
  194. ENT(sS,iv,iI_),C_ij_k,[iv SUB iI_,kK,sS],ivR),iI_,1,ncov)+SUM(IP_T(A,REPLACE_E~
  195. LEMENT(sS,iv,jJ_),C_ij_k,[sS,kK,iv SUB jJ_],ivR),jJ_,ncov+1,rA)-IF(weight=0,0,~
  196. weight*OP_T(A,iv,CT_T(C_ij_k,[iI,sS,sS],[iI]),[kK],ivR))
  197.  
  198. ;Covariant derivative of a tensor
  199. CD_T(A,ncov,weight,x,C_ij_k):=cDaux(A,ncov,weight,x,C_ij_k,RANK_T(A),iVa_(RANK~
  200. _T(A)),APPEND(iVa_(RANK_T(A)),[kK]),DIMENSION(x))
  201.  
  202. ;Aux.fct.for LD_T(A,v,ncov,weight,x)
  203. lDaux(A,v,ncov,weight,x,odv,rA,iv):=IP_T(OD_T(A,x),APPEND(iv,[sS]),v,[sS],iv)+~
  204. SUM(IP_T(A,REPLACE_ELEMENT(sS,iv,iI_),odv,[sS,iv SUB iI_],iv),iI_,1,ncov)-SUM(~
  205. IP_T(A,REPLACE_ELEMENT(sS,iv,jJ_),odv,[iv SUB jJ_,sS],iv),jJ_,ncov+1,rA)+IF(we~
  206. ight=0,0,weight*TRACE(odv)*A)
  207.  
  208. ;Lie derivative of a tensor
  209. LD_T(A,v,ncov,weight,x):=lDaux(A,v,ncov,weight,x,OD_T(v,x),RANK_T(A),iVa_(RANK~
  210. _T(A)))
  211.  
  212. ;Aux.fct.for DV (iv_zZ must contain zZ_)
  213. dIvt(A,iv_zZ,x):=SUM(DIF(eLt(A,iv_zZ,1),x SUB zZ_),zZ_,1,DIMENSION(x))
  214.  
  215. ;Aux.fct.for DV_T(A,...)
  216. dVrgx(A,ncov,weight,sA,x,C_ij_k,iv,ivD,C_i):=vNestx(dIvt(A,REPLACE_ELEMENT(zZ_~
  217. ,iv,sA),x),ivD,DIMENSION(x),DIMENSION(ivD))-IF(ncov<1,0,SUM(CI_T(A,REPLACE_ELE~
  218. MENT(tT,REPLACE_ELEMENT(sS,iv,iI_),sA),C_ij_k,[iv SUB iI_,tT,sS],ivD),iI_,1,nc~
  219. ov))+IF(ncov<0,0,SUM(IF(jJ_=sA,0,CI_T(A,REPLACE_ELEMENT(tT,REPLACE_ELEMENT(sS,~
  220. iv,jJ_),sA),C_ij_k,[sS,tT,iv SUB jJ_],ivD)),jJ_,ncov+1,DIMENSION(iv)))+IF(weig~
  221. ht=1,0,(1-weight)*IP_T(A,REPLACE_ELEMENT(sS,iv,sA),C_i,[sS],ivD))
  222.  
  223. ;Tensor divergence
  224. DV_T(A,ncov,weight,sA,x,C_ij_k):=dVrgx(A,ncov,weight,sA,x,C_ij_k,iVa_(RANK_T(A~
  225. )),DELETE_ELEMENT(iVa_(RANK_T(A)),sA),CT_T(C_ij_k,[iI,sS,sS],[iI]))
  226.  
  227. ;Aux.fct.for GC_T(A,x)
  228. eQel(v,i,n):=IF(i>0,n,IF(n<2,0,eQel(v,lOel(v,v SUB n,n-1),n-1)))
  229.  
  230. ;Aux.fct.for GC_T(A,x)
  231. sGnp(v):=SIGN(PRODUCT(PRODUCT(v SUB jJ-v SUB iI,jJ,iI+1,DIMENSION(v)),iI,1,DIM~
  232. ENSION(v)-1))
  233.  
  234. ;Aux.fct.for GC_T(A,x)
  235. dTgc(iv,A,x):=sGnp(iv)*DIF(eLt(A,DELETE_ELEMENT(iv,DIMENSION(iv)),1),x SUB (iv~
  236.  SUB DIMENSION(iv)))
  237.  
  238. ;Aux.fct.for GC_T(A,x)
  239. eLgc(Miv,A,x):=sGnp(Miv SUB 1)*SUM(dTgc(Miv SUB sSp,A,x),sSp,1,DIMENSION(Miv))
  240.  
  241. ;Aux.fct.for GC_T(A,x)
  242. gCaux(A,x,ivD,r):=LIM(vNestx(IF(eQel(ivD,0,r)>0,0,eLgc(pErme(ivD,[[]],1),A,x))~
  243. ,ivD,dIm,r),dIm,DIMENSION(x))
  244.  
  245. ;Generalized curl of a tensor
  246. GC_T(A,x):=gCaux(A,x,iVa_(RANK_T(A)+1),RANK_T(A)+1)
  247.  
  248. ;Jacobian matrix
  249. JACOB(x,x_):=VECTOR(VECTOR(DIF(x SUB iI,x_ SUB jJ),jJ,DIMENSION(x_)),iI,DIMENS~
  250. ION(x))
  251.  
  252. ;Aux.fct.for TF_T(A,..)
  253. tFidx(A,JC,ivA,ivc,ic):=vNestx(SUM(JC SUB sS SUB ic*eLt(A,ivc,1),sS,1,DIMENSIO~
  254. N(A)),ivA,DIMENSION(A),DIMENSION(ivA))
  255.  
  256. ;Aux.fct.for TF_T(A,..)
  257. tFaux(A,ivA,ncov,JM,JMc,n):=IF(n>DIMENSION(ivA),A,tFaux(tFidx(A,IF(n>ncov,JMc,~
  258. JM),ivA,REPLACE_ELEMENT(sS,ivA,n),ivA SUB n),ivA,ncov,JM,JMc,n+1))
  259.  
  260. ;Transf.tensor to new coord. x_
  261. TF_T(A,ncov,weight,JM,JM_):=tFaux(A,iVa_(RANK_T(A)),ncov,JM,JM_`,1)*IF(weight=~
  262. 0,1,DET(JM)^weight)
  263.  
  264. ;Christoffel symbol (1st kind)
  265. CHRIS1(g_ij,x):=1/2*VECTOR(VECTOR(VECTOR(DIF(g_ij SUB jJ SUB kK,x SUB iI)+DIF(~
  266. g_ij SUB kK SUB iI,x SUB jJ)-DIF(g_ij SUB iI SUB jJ,x SUB kK),kK,1,DIMENSION(g~
  267. _ij)),jJ,1,DIMENSION(g_ij)),iI,1,DIMENSION(g_ij))
  268.  
  269. ;Christoffel symbol (2nd kind)
  270. CHRIS2(g_ij,g__ij,x):=VECTOR(1/2*(VECTOR(VECTOR(VECTOR(DIF(g_ij SUB jJ SUB kK,~
  271. x SUB iI)+DIF(g_ij SUB kK SUB iI,x SUB jJ)-DIF(g_ij SUB iI SUB jJ,x SUB kK),kK~
  272. ,1,DIMENSION(g_ij)),jJ,1,DIMENSION(g_ij)),iI,1,DIMENSION(g_ij))) SUB lL . g__i~
  273. j,lL,1,DIMENSION(g_ij))
  274.  
  275. ;Elem.of Riemann curv.tensor (1st kind)
  276. EL_RIEM1(C_ijk,C_ij_k,x,i,j,k,l):=IF(i=j OR k=l,0,DIF(C_ijk SUB j SUB l SUB i,~
  277. x SUB k)-DIF(C_ijk SUB j SUB k SUB i,x SUB l)+C_ijk SUB i SUB l . C_ij_k SUB j~
  278.  SUB k-C_ijk SUB i SUB k . C_ij_k SUB j SUB l)
  279.  
  280. ;Riemann curvature tensor (1st kind)
  281. RIEM1(C_ijk,C_ij_k,x):=VECTOR(VECTOR(VECTOR(VECTOR(EL_RIEM1(C_ijk,C_ij_k,x,iI,~
  282. jJ,kK,lL),lL,DIMENSION(C_ijk)),kK,DIMENSION(C_ijk)),jJ,DIMENSION(C_ijk)),iI,DI~
  283. MENSION(C_ijk))
  284.  
  285. ;Aux.fct.for RIEM2
  286. vT3i1(A1,d,i2,i3):=VECTOR(A1 SUB iI_,iI_,d*(i2-1)+i3,d^3,d^2)
  287.  
  288. ;Elem.of Riemann curv.tensor (2nd kind)
  289. EL_RIEM2(C_ij_k,x,i,j,k,l):=IF(k=l,0,DIF(C_ij_k SUB j SUB l SUB i,x SUB k)-DIF~
  290. (C_ij_k SUB j SUB k SUB i,x SUB l)+vT3i1(APPEND(APPEND(C_ij_k)),DIMENSION(x),k~
  291. ,i) . C_ij_k SUB j SUB l-vT3i1(APPEND(APPEND(C_ij_k)),DIMENSION(x),l,i) . C_ij~
  292. _k SUB j SUB k)
  293.  
  294. ;Riemann curvature tensor (2nd kind)
  295. RIEM2(C_ij_k,x):=VECTOR(VECTOR(VECTOR(VECTOR(IF(kK=lL,0,DIF(C_ij_k SUB jJ SUB ~
  296. lL SUB iI,x SUB kK)-DIF(C_ij_k SUB jJ SUB kK SUB iI,x SUB lL)+vT3i1(APPEND(APP~
  297. END(C_ij_k)),DIMENSION(x),kK,iI) . C_ij_k SUB jJ SUB lL-vT3i1(APPEND(APPEND(C_~
  298. ij_k)),DIMENSION(x),lL,iI) . C_ij_k SUB jJ SUB kK),lL,DIMENSION(x)),kK,DIMENSI~
  299. ON(x)),jJ,DIMENSION(x)),iI,DIMENSION(x))
  300.  
  301. ;Aux.fct.for RICCI(C_ij_k,x)
  302. vT3i2(A1,d,i1,i3):=VECTOR(A1 SUB iI_,iI_,(i1-1)*d^2+i3,i1*d^2+i3-d,d)
  303.  
  304. ;Aux.fct.for RICCI(C_ij_k,x)
  305. rIcx(C_ij_k,x,T):=VECTOR(VECTOR(DIV(C_ij_k SUB iI SUB jJ,x)-DIF(T SUB iI,x SUB~
  306.  jJ)-SUM(vT3i2(APPEND(APPEND(C_ij_k)),DIMENSION(x),iI,sS) . C_ij_k SUB sS SUB ~
  307. jJ,sS,1,DIMENSION(x))+C_ij_k SUB iI SUB jJ . T,jJ,DIMENSION(x)),iI,DIMENSION(x~
  308. ))
  309.  
  310. ;Covariant Ricci tensor
  311. RICCI(C_ij_k,x):=rIcx(C_ij_k,x,VECTOR(TRACE(C_ij_k SUB kK),kK,DIMENSION(x)))
  312.  
  313. ;Aux.fct.for EINST(R_ij,..)
  314. eInstx(R_ij,g_ij,RH):=R_ij-RH*g_ij
  315.  
  316. ;Covariant Einstein tensor
  317. EINST(R_ij,g_ij,g__ij):=eInstx(R_ij,g_ij,TRACE(g__ij . R_ij)/2)
  318.  
  319. ;Aux.fct.for WEYL(R_ijkl,..)
  320. wEylx(R_ijkl,R_ij,g_ij,R,d):=VECTOR(VECTOR(VECTOR(VECTOR(eLt(R_ijkl,[iI,jJ,kK,~
  321. lL],1)+(g_ij SUB iI SUB lL*R_ij SUB kK SUB jJ+g_ij SUB jJ SUB kK*R_ij SUB lL S~
  322. UB iI-g_ij SUB iI SUB kK*R_ij SUB lL SUB jJ-g_ij SUB jJ SUB lL*R_ij SUB kK SUB~
  323.  iI+(g_ij SUB iI SUB kK*g_ij SUB lL SUB jJ-g_ij SUB iI SUB lL*g_ij SUB kK SUB ~
  324. jJ)*R/(d-1))/(d-2),lL,d),kK,d),jJ,d),iI,d)
  325.  
  326. ;Weyl (conformal) tensor
  327. WEYL(R_ijkl,R_ij,g_ij):=wEylx(R_ijkl,R_ij,g_ij,TRACE(g_ij^(-1) . R_ij),DIMENSI~
  328. ON(g_ij))
  329.  
  330. ;Aux.fct.for DI_NZEL and DI_GNZE
  331. dEcel(v):=VECTOR(v SUB iI-SIGN(v SUB iI),iI,DIMENSION(v))
  332.  
  333. ;Decrement indices in NZEL_T display
  334. DI_NZEL(A):=VECTOR([dEcel(A SUB kK SUB 1),A SUB kK SUB 2],kK,DIMENSION(A))
  335.  
  336. DI_GNZE(A):=VECTOR([VECTOR(dEcel(A SUB kK SUB 1 SUB jJ),jJ,DIMENSION(A SUB kK ~
  337. SUB 1)),A SUB kK SUB 2],kK,DIMENSION(A))
  338.