The following line must be executed before you begin, it sets up Christoffel. Note that as defined, the argument x must be a list of coordinate names, while g must be set up as an array.restart;with(linalg):
Christoffel:=proc(g,x) local ginv,N;N:=nops(x);ginv:=inverse(g);
[seq(array([seq([seq(add(ginv[i,n]*(diff(g[n,j],x[k])+diff(g[n,k],x[j])-diff(g[j,k],x[n]))/2,n=1..N),k=1..N)],j=1..N)]),i=1..N)]
end proc;The following routine finds the Ricci tensor with two indices down. It is returned as an array.Ricci:=proc(g,x) local Gamma,N;N:=nops(x);Gamma:=Christoffel(g,x);
array([seq([seq(add(diff(Gamma[k][i,j],x[k])-diff(Gamma[k][i,k],x[j])+add(Gamma[l][i,j]*Gamma[k][l,k]-Gamma[l][i,k]*Gamma[k][l,j],l=1..N),k=1..N),j=1..N)],i=1..N)]);
end proc;Set up the coordinates as a list and the metric as an array.x:=[t,r,theta,phi];g:=array([[-f(r),0,0,0],[0,h(r),0,0],[0,0,r^2,0],[0,0,0,r^2*sin(theta)^2]]);To call Riccil, feed it the metric and the list of coordinates, like this:w:=Ricci(g,x);To call out specific elements, simply put the two arguments in a single set of square brackets. For example, to get the sum of the tt and rr components in flat coordinate;simplify(w[1,1]/f(r)+w[2,2]/h(r));The tt component of the Einstein tensor in locally flat coordinates is justsimplify(w[1,1]/f(r)+w[2,2]/h(r)+w[3,3]/r^2+w[4,4]/r^2/sin(theta)^2);