1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- module checkind;
- % This modules contains procedures to detect indices,
- % check the coherence (variance) of expressions (sum), (free indices)
- % declares repeated (1 cov and 1 cont) indices as dummy.
- global '(spaces!*);
- fluid('(dummy_id!* g_dvnames epsilon!*));
- symbolic procedure split_free_dum_ids(ltens);
- % ltens est la liste qui provient de sep_tens_from_other.
- % result of all_index_lst is the full set of indices.
- % verify the consistency of the list of dummy indices.
- % output the list (<ordered set of free indices>,<set of dummy indices>)
- begin scalar ind,dumlist,freelist;
- ind:=split_cov_cont_ids all_index_lst ltens;
- ind:=list(clean_numid car ind,clean_numid cadr ind);
- dumlist:=intersection(car ind,cadr ind);
- verify_tens_ids ind where dummy_id!*=dumlist;
- % construct the list of covariant FREE indices:
- freelist:=for each y in setdiff(car ind,dumlist)
- collect lowerind y;
- % add to it the list of contravariant FREE indices
- freelist:=append(freelist,setdiff(cadr ind,dumlist));
- return list(ordn freelist,dumlist);
- end;
- symbolic procedure check_ids(sf);
- % check the variance consistency of the input SF
- begin scalar dumlist, freelist, y;
- freelist:='undefined;
- while not domainp (sf) do
- <<
- y:=sep_tens_from_other (lt sf .+ nil);
- if length car y >=1
- then
- << % There are tensors, get dummy and free indices, compare
- y:= split_free_dum_ids car y;
- if freelist='undefined then freelist:=car y
- else
- if freelist neq car y then rerror(cantens,11,
- list("mismatch in free indices : ",
- list(car y, freelist)));
- dumlist:= union(dumlist, cadr y)
- >>
- else
- % no FREE indices
- if freelist then
- if freelist = 'undefined then freelist:=nil
- else rerror(cantens,11,"scalar added with tensor(s)");
- sf:=red sf
- >>;
- if freelist neq 'undefined then
- if (y:=repeats freelist) and extract_dummy_ids y then
- rerror(cantens,12,list("wrong use of indices",y));
- return
- if freelist='undefined or null freelist then list(nil,dumlist)
- else
- if sf then rerror(cantens,12,"scalar added with tensor(s)")
- else list(freelist,dumlist)
- end;
- endmodule;
- end;
|