Hello, On Thu, Nov 09, 2006 at 07:38:08AM +0530, aravind b wrote:
Please go through this code :
#include <iostream> #include <ginac/ginac.h> using namespace std; using namespace GiNaC;
int main() { symbol i_sym("i"), j_sym("j"), e("e"), a("a"), b("b") ; idx i(i_sym, 3), j( j_sym, 3) ; //defining indices i and j
scalar_products sp; sp.add( indexed(e, i), indexed(e, j), delta_tensor(i,j) ); // e.i* e.j = delta_tensor.i.j
cout << (indexed(e,i)*indexed(e,j)).simplify_indexed(sp) <<endl ;
return 0; }
does NOT give delta.j.i instead just gives e.i * e.j - why?
Quoting the manual: "* as a special case of dummy index summation, it can replace scalar products of two tensors with a user-defined value" Since e.i * e.j is not a scalar (it is a tensor of second rank), your code won't work.
Basically, i want to define an orthonormal basis vector set {e.i}.
I think using `idx' object to enumerate the basis is a bad idea. In general, GiNaC `indexed', `idx' classes are well-suited for 'basis-less' calculations (see http://www.ginac.de/FAQ.html#matrix_indexed to find out why). They don't prevent anyone from doing calculation in scpecific basis, but don't help either.
If i have vector_a = indexed(a, i) * indexed(e, i) and vector_b = indexed(b, j) * indexed(e, j) ,
Indexed objects in GiNaC are treated as tensors, so such a vector_a is _not_ really a vector, but instead a scalar. Best regards, Alexei -- All science is either physics or stamp collecting.