Chris, Thank you for helping me to get a grasp on GINAC.
Do you mean the writing out of contractions as in A.i*B.i -> A.1*B.1 + ... + A.3*B.3. That can be done using the function ex expand_dummy_sum(const ex & e, bool subs_idx). Yes that is what I wanted to do. I did an example to do just that in the simple code below however instead of getting: A.i*B.i -> A.0*B.0 + A.1*B.1 I am getting: A.i*B.i -> A.0*B.i + A.1*B.i so why is it not working?. Does it has something to do with the flag: bool subs_idx I just put a "1" in there. What is the purpose of that flag?
Not directly. The closest that you can get to that is keeping an exmap m and say m[A(2,0,4)] = 3.5 and then do .subs(m) in an expression where you have unrolled the dummy indices. I tried to do this in the simple code below where I have the expanded expression: A.0*B.i + A.1*B.i I tried to replace A.1 by 7.5. It worked ok but I noticed that in order for this to work I needed to use an expression of the form: indexed(A,idx(1,)) in .subs Is there any alternative where I can just put some kind of string str "A.1" inside .subs and still work?
Alejandro %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #include <iostream> #include <ginac/ginac.h> #include <ginac/flags.h> using namespace std; using namespace GiNaC; int main (void) { symbol i_sym("i"); idx i(i_sym, 2); symbol A("A"),B("B"); ex exA = indexed(A,i); ex exB = indexed(B,i); ex exAB = exA*exB; cout << exAB << endl; ex exABexp = expand_dummy_sum(exAB,1); cout << exABexp << endl; // replacing numeric values for component A.1 ex exA1 = indexed(A,idx(1,2)); cout << exABexp.subs(exA1 == 7.5) << endl; return 0; }