To get the value of a scalar field at a point, simply use the call method, i.e. the parenthesis operator. In your case:
gP3.ricci_scalar()(p)
Actually, at()
is reserved to tensor fields of valence $>0$, since for them the call method has a different meaning. For instance, if g
is the metric tensor and u
and v
are two vector fields, the call method of g
is used to denote the bilinear form action of g
on the pair (u,v)
as g(u,v)
. The following identity, which involves the various call methods and at()
, holds:
g.at(p)(u.at(p), v.at(p)) == g(u, v)(p)
Here is a full example:
sage: E.<x,y> = EuclideanSpace()
sage: g = E.metric()
sage: g.display()
g = dx*dx + dy*dy
sage: u = E.vector_field(-y, x)
sage: v = E.vector_field(x+y, x-y)
sage: p = E((2, 3)); p
Point on the Euclidean plane E^2
sage: bool( g.at(p)(u.at(p), v.at(p)) == g(u, v)(p) )
True