The following code sets via slicing a value for a tensor:
import pprint
import random
M = Manifold(4, 'A^4')
c.<x,y,z,t> = M.chart()
cf = c.frame()
R = range(4)
data = [ [ [ ( random.choice([-10..10]) if i < j and j < k else 0 )
for k in R ]
for j in R ]
for i in R ]
print "Using the following data..."
pprint.pprint(data)
print "Initializing a tensor field with the above constant data..."
t = M.tensor_field(1, 2, name='t')
t[cf, : ] = data
print "t is:"
print t
print t.display()
(The data was constructed to be sparse, so that the print can be followed easily.) Results this time:
Using the following data...
[[[0, 0, 0, 0], [0, 0, -9, 4], [0, 0, 0, 6], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
Initializing a tensor field with the above constant data...
t is:
Tensor field t of type (1,2) on the 4-dimensional differentiable manifold A^4
t = -9 d/dx*dy*dz + 4 d/dx*dy*dt + 6 d/dx*dz*dt + 5 d/dy*dz*dt
Now we may want to reset some part of the data...
It was simpler for me to do this in terms of the variable data
used above, its slicing objects are rather easy to handle:
sage: data
[[[0, 0, 0, 0], [0, 0, -9, 4], [0, 0, 0, 6], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
sage: data[0:1]
[[[0, 0, 0, 0], [0, 0, -9, 4], [0, 0, 0, 6], [0, 0, 0, 0]]]
sage: data[0:1] = [[[0, 0, 0, 0], [0, 0, -9, 4], [0, 0, 0, 6], [11, 222, 3333, 44444]]]
sage: data
[[[0, 0, 0, 0], [0, 0, -9, 4], [0, 0, 0, 6], [11, 222, 3333, 44444]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
sage: t[cf, :] = data
sage: t.display()
t = -9 d/dx*dy*dz + 4 d/dx*dy*dt + 6 d/dx*dz*dt + 11 d/dx*dt*dx + 222 d/dx*dt*dy
+ 3333 d/dx*dt*dz + 44444 d/dx*dt*dt + 5 d/dy*dz*dt
sage:
(Output was manually adjusted to fit in page...)
Also:
One can set some data, or just use some existing element, then at some point extract the data as a "multilist", change this one via slicing, and set the new value inside the tensor:
sage: data
[[[0, 0, 0, 0], [0, 0, -9, 4], [0, 0, 0, 6], [11, 222, 3333, 44444]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
sage: t[cf, :] = data
sage: extracteddata = t[cf, :]
sage: extracteddata[0:1][0:2]
[[[0, 0, 0, 0], [0, 0, -9, 4], [0, 0, 0, 6], [11, 222, 3333, 44444]]]
sage: extracteddata[0:1][0:2][0]
[[0, 0, 0, 0], [0, 0, -9, 4], [0, 0, 0, 6], [11, 222, 3333, 44444]]
sage: extracteddata[0:1][0:2][0][-1]
[11, 222, 3333, 44444]
sage: extracteddata[0:1][0:2][0][-1] = [99, 88, 77, 66]
sage: t[cf, :]
[[[0, 0, 0, 0], [0, 0, -9, 4], [0, 0, 0, 6], [11, 222, 3333, 44444]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
sage: t[cf, :] = extracteddata
sage: t[cf, :]
[[[0, 0, 0, 0], [0, 0, -9, 4], [0, 0, 0, 6], [99, 88, 77, 66]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]