123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- %======================================================
- % Name: tio.red - tensor user interface
- % Author: A.Kryukov (kryukov@npi.msu.su)
- % Copyright: (C), 1993i-1995, A.Kryukov
- % Version: 1.35
- % Release: Apr., 17, 1995
- %------------------------------------------------------
- % Modified: Apr., 17, 1995 tsym2
- % Apr., 24, 1996 tclear0
- %======================================================
- module tensorio$
- %=====================================================
- % blist::=((th . pv_list) ...)
- % pv_list::= (pv1 pv2 ...)
- %=====================================================
- smacro procedure tname th$ car th$
- smacro procedure ilist th$ cadr th$
- smacro procedure dlist th$ cddr th$
- smacro procedure mkth(tn,il,dl)$ list tn . il . id$
- smacro procedure mkth0(tn,il,dl)$ tn . il . dl$
- smacro procedure thead ten$ car ten$
- smacro procedure pvect ten$ cdr ten$
- smacro procedure mkten0(th,pv)$ th . pv$
- smacro procedure mkten(th,pv)$ '!:tensor . list(th . pv)$
- symbolic procedure bassoc(th,bl)$
- if null bl then nil
- else if th_match(th,caar bl) then bl
- else bassoc(th,cdr bl)$
- global '(!*basis,tensors!*)$
- remprop('tensor,'stat)$
- remprop('tsym,'stat)$
- remprop('tclear,'stat)$
- symbolic procedure tensor u$
- for each x in u do
- if null(x memq tensors!*) then <<
- put(x,'!:tensor,99)$ % undefine rank
- put(x,'simpfn,'t_simp)$
- flag(list x,'full)$
- tensors!* := x . tensors!*$
- >>
- else write "+++ ",x," is already declared as tensor."$
- symbolic procedure tclear u$
- tclear0(if car u eq 'all then tensors!* else u)$
- symbolic procedure tclear0 u$
- for each x in u do
- if x memq tensors!* then
- begin scalar bs,bs1$
- tensors!* := delete(x,tensors!*)$
- remprop(x,'!:tensor)$
- remflag(x,'full)$
- bs:=!*basis$
- while bs do <<
- if null(x memq caaar bs) then bs1:=car bs . bs1$
- bs:=cdr bs$
- >>$
- !*basis:=reversip bs1$
- end
- else << write "+++ ",x," is not a tensor."$ terpri() >>$
-
- symbolic procedure tsym u$
- % u is a list of symmetry identities.
- % return nil.
- % Out side eff.: add identities to basis list in !*basis.
- begin scalar b$
- b:=!*basis$
- !*basis:=nil$
- !*basis:=tsym1(u,b)$
- end$
- symbolic procedure tsym1(u,b)$
- % u is a list of symmetry identities.
- % b is a basis list (returned value).
- % return new basis list.
- if null u then b
- else tsym1(cdr u,tsym2(cdr numr simp!* car u,b,nil))$
- symbolic procedure tsym2(tt,b,b1)$
- % tt is a tensor identity
- % b is old basis
- % b1 is new basis (returned value)
- if cdr tt then rederr list('tsym2,"*** Invalid identity:",tt)
- else if null b
- then (caar tt . tsym4(gperm length cadaar tt,car tt,nil))
- . reversip b1
- else if th_match0(caar tt,caar b)
- then (caar b . tsym4(gperm length cadaar tt,car tt,cdar b))
- . append(cdr b,b1)
- else tsym2(tt,cdr b,car b . b1)$
- symbolic procedure tsym4(ps,x,b0)$
- if null ps then b0
- else tsym4(cdr ps,x
- ,insert_pv(pv_renorm sieve_pv(pv_applp(cdr x,car ps),b0),b0)
- )$
- put('tensor,'stat,'rlis)$
- put('tsym,'stat,'rlis)$
- put('tclear,'stat,'rlis)$
- symbolic procedure kbasis x$
- for each z in x do basis1 z$
- global '(!*dummypri)$
- switch dummypri$
- symbolic procedure basis1 x$
- begin scalar b$
- if idp x then x:=list x;
- if atom x or null get(car x,'!:tensor)
- then rederr list('basis1,"*** Invalid as tensor:",x);
- b:=!*basis$
- while b do <<
- if tnequal(x,caaar b)
- then << for each z in cdar b do
- t_pri1('!:tensor . list(caar b . z),t)$
- write length cdar b$ terpri()$
- >>$
- b:=cdr b$
- >>$
- end$
- symbolic procedure tnequal(tn1,tn2)$
- if atom tn1 then tn1 eq tn2
- else (lambda x$ if x neq tn2 then tnequal(cdr tn1,x)
- else nil) delete(car tn1,tn2)$
- put('kbasis,'stat,'rlis)$
- endmodule;
- end;
|