/* 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be
 * useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the GNU General Public License for more details.
 *
 * Indicial tensor basics
 */

if get('itensor,'version)=false then load(itensor);

("Tensors are indexed objects. To show a tensor use ishow()")$
ishow(g([a,b],[c,i],i2,i1))$

("Tensor components can be assigned using components().
As an example, consider a conformally flat metric:")$

declare(e,constant);
remcomps(g);
imetric(g);
components(g([i,j],[]),e([i,j],[])*p([],[]));
components(g([],[i,j]),e([],[i,j])/p([],[]));
ishow(g([i,j],[]))$
ishow(g([],[i,j]))$

("Tensor components can also be assigned as MAXIMA functions:")$
t(l1,l2):=c*a(l1,l2)+b(l1,l2)$
ishow(t([i,k],[]))$
ishow(t([],[j,m]))$

("Here is the Euler equation")$
Eu(l1,l2):=d_t*v(l1,[])+v([],[j])*v(l1,[],j)+
           1/rho([])*diff(p([],[]),l1[1])+diff(phi([],[]),l1[1])$
ishow(Eu([i],[]))$
("Another definition can be given using the metric g")$
Eu(l1,l2):=block([j1:idummy()], if l2=[] then
             d_t* v(l1,[])+v([],[j1])*v(l1,[],j1)+
             1/rho([])*diff(p([],[]),l1[1])+diff(phi([],[]),l1[1])
           else d_t*v([],l2)+v([],[j1])*v([],l2,j1)+
             g([],[l2[1],j1])*(diff(p([],[]),j1)/rho([])+diff(phi([],[]),j1)))$
ishow(Eu([i],[]))$
ishow(Eu([],[i]))$
("The dummy index character can be changed from % using idummyx:")$
idummyx:n$
ishow(Eu([i],[]))$

("The indices() command lists the free and dummy indices")$
indices(Eu([i],[]));

("The variable icounter controls the dummy index numbering")$
icounter;
icounter:100;
ishow(Eu([i],[]))$

idummyx:"%"$

/* End of demo -- comment line needed by MAXIMA to resume demo menu */
