module cantens; % header module tested for REDUCE 3.6 and 3.7.
create!-package('(cantens ctintro auxitens gentens spaces
partitns checkind opertens contrtns),
'(contrib cantens));
% This package requires ASSIST and DUMMY.
%
% ************************************************************************
%
% Authors: H. Caprasse <hubert.caprasse@ulg.ac.be>
% : F. Fontaine <pascal.fontaine@ulg.ac.be>
%
% Version and Date: Version 1.11, 15 January 1999.
%
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% ***** This package is delivered for free. %
% ***** No modification on it may be made without %
% ***** due permission of H. Caprasse. %
%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%
% Revision history to versions 1.0 and 1.1:
% 15/12/98 : Flag 'LOOSE' removed on DEPENDS in order to
% : allow its redefinition in CSL.
% : SIMPTENSOR, NUM_EPSI_NON_EUCLID, MATCH_KVALUE and
% : SIMPMETRIC modified.
% : MAKE_PARTIC_TENS no longer protected by the 'reserved'
% : flag.
% : Modifications to SYMTREE_ZEROP and DV_SKEL2FACTOR1
% : to allow proper compilation under CSL.
%% ******************************************************************
%
% an extension of the REDUCE command 'depend':
% patch to extend depend to tensors...
remflag('(depends),'loose); % because of csl
symbolic procedure depends(u,v);
if null u or numberp u or numberp v then nil
else if u=v then u
else if atom u and u memq frlis!* then t
%to allow the most general pattern matching to occur;
else if (lambda x; x and ldepends(cdr x,v)) assoc(u,depl!*)
then t
else if not atom u and idp car u and get(car u,'dname) then
(if depends!-fn then apply2(depends!-fn,u,v) else nil)
where (depends!-fn = get(car u,'domain!-depends!-fn))
else if not atom u
and (ldepends(cdr u,v) or depends(car u,v)) then t
else if atom v or idp car v and get(car v,'dname) then nil
% else dependsl(u,cdr v);
else if flagp(u,'tensor) and pairp v and u=car v then t
else nil;
% an "importation" from EXCALC:
symbolic procedure permp!:(u,v);
% True if v is an even permutation of u NIl otherwise.
if null u then t else if car u = car v then permp!:(cdr u,cdr v)
else not permp!:(cdr u,subst(car v,car u,cdr v));
% global and fluid variables defined.
lisp remflag(list 'minus,'intfn);
global '(dimex!* sgn!* signat!* spaces!* numindxl!* pair_id_num!*) ;
lisp (pair_id_num!*:= '((!0 . 0) (!1 . 1) (!2 . 2) (!3 . 3) (!4 . 4)
(!5 . 5) (!6 . 6) (!7 . 7) (!8 . 8) (!9 . 9)
(!10 . 10) (!11 . 11) (!12 . 12) (!13 . 13)));
fluid('(dummy_id!* g_dvnames epsilon!*));
% g_dvnames is a vector.
switch onespace;
!*onespace:=t; % working inside a unique space is the default.
% Various smacros
smacro procedure id_cov u;
% to get the covariant identifier
% u is the output of get_n_index
cadr u;
smacro procedure id_cont u;
% to get the contravariant identifier
% u is the output of get_n_index
u;
smacro procedure careq_tilde u;
eqcar(u,'!~);
smacro procedure careq_minus u;
eqcar(u,'minus);
smacro procedure lowerind u;
list('minus,u);
smacro procedure raiseind u;
cadr u;
smacro procedure id_switch_variance u;
if eqcar(u,'minus) then cadr u
else list ('minus, u);
smacro procedure get!-impfun!-args u;
% Get dependencies of id u.
cdr assoc(u,depl!*);
endmodule;
end;