Problem with scalar_products : Scalar product of two vectors in index notation
Hi, Hope everyone's doing fine ! 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? Basically, i want to define an orthonormal basis vector set {e.i}. If i have vector_a = indexed(a, i) * indexed(e, i) and vector_b = indexed(b, j) * indexed(e, j) , then i want adotb to reduce to a.i * b.i ( ofcoure after i apply simplify_indexed(sp) to adotb ) Thanks a lot for going through this mail.
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.
oh k. Guess i got to work my problem out differently. It would be nice if i was able to do stuff like that because i am trying to write a very simple code for doing tensor algebra in continuum mechanics. Thanks a lot alexei for the prompt and clear clarification. On 11/9/06, Sheplyakov Alexei <varg@theor.jinr.ru> wrote:
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.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.3 (GNU/Linux)
iQIVAwUBRVLV27L3rFoFceCwAQL3aw//SkchtQFAGdoQkKu+8u9FertudZO9fHFD 9KlKaOBOhnvMydZUHBojaEz3HyTXB9KLX6nmRI3F4PwIi8N0zOSX0kzYNP6c43yT 6V0C8v+kW+FRcCLp58iQ0MILNh54qMYmpD32i2dk0ErN7v9YyaOxPtGdIM/Gv/0R 89yn8FmlSg8Rf44Np44ZbR95arbeIXU+/YS640io6Mj6OppbugRkRnaI2ojHYWjk 01yV9CWH86vlSnPupD6+oUjtT/SUUSV3XT2XDqIyuExIu+sViUH6OSAE3MpfCIls siAhdMpQkv05ISSo5VJemUidHwN7ajaFQ7cQf/V82DZsm/KwVE/MjVa7qZOYcUpx sxQBDFrLIFQX9OiWyf4fhtd52UhU80Au3IlKR6PjO24BEOeXTpQt+qpNusaA+/Tb WgqWcqn8A6slBnNHuFtkZ1QbZFL+WxqJq4bbSWo3X5dLY0+cUw/MKMP7etRDbr0b /5VSk6pPy5Ee7VS+M8UnlHCzHOswoiKxdFuhKJy6sWpkva1STTwAnmdBgDPJoGPH SZ0MGkI8qV1SWwo/M8yVyr/RqWktbwNI2JO/tXbKmzk+PwTnXJAO/MMbeipS/rCP /5E3E2kOEdwxtrr3I48Z0QBSclJC6eoqnF0T7BTBkV94mVv0cUMxpf+IWSI2DffB jQaSWrzTkjQ= =VrMW -----END PGP SIGNATURE-----
_______________________________________________ GiNaC-list mailing list GiNaC-list@ginac.de https://www.cebix.net/mailman/listinfo/ginac-list
On Thu, Nov 09, 2006 at 05:30:58PM +0530, aravind b wrote:
oh k. Guess i got to work my problem out differently. It would be nice if i was able to do stuff like that because i am trying to write a very simple code for doing tensor algebra in continuum mechanics.
May be blitz++ [1] or some other expressions template library is more approprite tool for such tasks? [1] http://oonumerics.org/blitz/ Best regards, Alexei -- All science is either physics or stamp collecting.
participants (2)
-
aravind b
-
varg@theor.jinr.ru