Surface geometry
This worksheet illustrates how to use the atlas package to solve problems in elementary differential geometry. As an example we find the geometry of the
following surfaces: torus, helicoid and abstract revolution surface.
We assume that the geometry is induced by the corresponding embedding of a surface into the flat Euclidian 3-dimensional space. Thus we construct the
corresponding embedding and calculate the following quantities: first fundamental form (metric tensor field), second fundamental form and field of mean
curvature vectors. Besides that we calculate the connection, curvature, curvature tensor field (Riemann tensor field), Ricci tensor field and Ricci scalar
function which is proportional to scalar curvature.
Load atlas package:
| > | restart: with(atlas): |
Just for right simplification:
`atlas/simp`:=proc(a) factor(simplify(a,trig)) end:
Description of the total space
First of all we have to describe the space we are working in. The space is 3-dimensional Euclidean (flat) space. To define the space we declare domain, forms, vectors, coframe, frame, flat metric and calculate connection (it is equal to zero of course).
Define Euclidean space as a manifold:
Domain(R^3);
| (2.1.1) |
Declare 1-forms for the space coframe:
Forms(e[k]=1);
| (2.1.2) |
Declare vectors for the space frame:
Vectors(E[j]);
| (2.1.3) |
Declare coframe on the space:
Coframe(e[1]=d(x),e[2]=d(y),e[3]=d(z));
| (2.1.4) |
Declare frame on the space:
Frame(E[k]);
| (2.1.5) |
Declare flat metric on the space:
Metric(g[R]=d(x)&.d(x)+d(y)&.d(y)+d(z)&.d(z));
| (2.1.6) |
Calculate connection of the metric:
Connection(Gamma);
| (2.1.7) |
Torus
Define the torus as a manifold:
Domain(T);
| (2.2.1) |
Declare constants a, b, c:
Constants(a,b);
| (2.2.2) |
Declare 1-forms for torus coframe
Forms(w[i]=1);
| (2.2.3) |
Declare vectors for torus frame:
Vectors(W[k]);
| (2.2.4) |
Declare coframe on the torus:
Coframe(w[1]=d(alpha),w[2]=d(beta));
| (2.2.5) |
Declare frame of the surface:
Frame(W[l]);
| (2.2.6) |
Declare mapping of the torus into
:
Mapping(pi,T,R^3,x=(a+b*cos(beta))*cos(alpha),
y=(a+b*cos(beta))*sin(alpha),
z=b*sin(beta));
| (2.2.7) |
Calculate metric on the torus using `&/` operator:
Metric(g[T] = g[R] &/ pi);
| (2.2.8) |
Calculate invariants of the mapping:
Inv[T]:=Invariants(pi);
![]() ![]() ![]() ![]() ![]() ![]() ![]() | (2.2.9) |
Extract second fundamental form as a table:
sF:=eval(Inv[T][secondForm]);
| (2.2.10) |
Construct second fundamental form as corresponding tensor field (`&.` - is tensor product operator):
B:=add(add(`&.`(e[i],e[j],sF[i,j]),i=1..3),j=1..3);
| (2.2.11) |
Extract mean curvature vector:
mu:=Inv[T][meanCurvature];
![]() ![]() ![]() | (2.2.12) |
Calculate mean curvature:
chi:=simplify(g[R](mu,mu));
![]() | (2.2.13) |
Use differential operator `&D` to express tangent vectors on the torus
by total space frame vectors
:
W1:=W[1] &D pi;
W2:=W[2] &D pi;
| (2.2.14) |
Verify that mean curvature vector field is normal to the tangent space of the torus:
'g[R](mu,W1)'=simplify(g[R](mu,W1));
'g[R](mu,W2)'=simplify(g[R](mu,W2));
| (2.2.15) |
Calculate connection of the embedding:
Connection(omega[T]);
| (2.2.16) |
Calculate curvature of the embedding:
Curvature(Omega[T]);
| (2.2.17) |
Calculate Riemann tensor field:
Riemann(R[T]);
| (2.2.18) |
Calculate Ricci tensor field:
Ricci(ric[T]);
![]() | (2.2.19) |
Calculate Ricci scalar curvature:
RicciScalar(scal[T]);
| (2.2.20) |
Helicoid
Define the surface as a manifold:
Domain(H);
| (2.3.1) |
Declare 1-form for surface coframe
Forms(s[i]=1);
| (2.3.2) |
Declare vectors for surface frame:
Vectors(S[k]);
| (2.3.3) |
Declare coframe on the surface:
Coframe(s[1]=d(u[h]),s[2]=d(v[h]));
| (2.3.4) |
Declare frame of the surface:
Frame(S[k]);
| (2.3.5) |
Declare mapping of the surface into
:
Mapping(psi,H,R^3,x=u[h]*cos(v[h]),
y=u[h]*sin(v[h]),
z=b*v[h]);
| (2.3.6) |
One can also calculate metric induced on the surface by the mapping.
| > | Metric(g[H] = g[R] &/ psi); |
| (2.3.7) |
Calculate invariants of the mapping:
Inv[H]:=Invariants(psi);
![]() ![]() ![]() | (2.3.8) |
It is well known that helicoid is a minimal surface. Thus nothing surprising about zero mean curvature vector field.
Calculate connection of the embedding:
Connection(omega[H]);
| (2.3.9) |
Calculate curvature of the embedding:
Curvature(Omega[H]);
| (2.3.10) |
Calculate Riemann tensor field:
Riemann(R[H]);
![]() | (2.3.11) |
Calculate Ricci tensor field:
Ricci(ric[H]);
![]() | (2.3.12) |
Calculate Ricci scalar curvature:
RicciScalar(scal[H]);
![]() | (2.3.13) |
Abstract revolution surface
Define the surface as a manifold:
Domain(A);
| (2.4.1) |
Declare functions:
Functions(rho=rho(u),zeta=zeta(u));
| (2.4.2) |
Declare 1-form for surface coframe
Forms(p[i]=1);
| (2.4.3) |
Declare vectors for surface frame:
Vectors(P[k]);
| (2.4.4) |
Declare coframe on the surface:
Coframe(p[1]=d(u),p[2]=d(v));
| (2.4.5) |
Declare frame of the surface:
Frame(P[l]);
| (2.4.6) |
Declare mapping of the surface into
:
Mapping(f,A,R^3,x=rho*cos(v),
y=rho*sin(v),
z=zeta);
| (2.4.7) |
One can also calculate metric induced on the surface by the mapping.
| > | Metric(g[A] = g[R] &/ f); |
| (2.4.8) |
Calculate invariants of the mapping:
Inv[A]:=Invariants(f);
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | (2.4.9) |
Calculate connection of the embedding:
Connection(omega[A]);
| (2.4.10) |
Calculate curvature of the embedding:
Curvature(Omega[A]);
| (2.4.11) |
Calculate Riemann tensor field:
Riemann(R[A]);
![]() ![]() | (2.4.12) |
Calculate Ricci tensor field:
Ricci(ric[A]);
![]() ![]() | (2.4.13) |
Calculate Ricci scalar curvature:
RicciScalar(scal[A]);
![]() | (2.4.14) |
| > |

![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`*`(cos(alpha), `*`(b, `*`(cos(beta), `*`(E[1]))))), `-`(`*`(sin(alpha), `*`(b, `*`(cos(beta), `*`(E[2]))))), `-`(`*`(b, `*`(sin(beta), `*`(E[3])))...](Maple/atlas/examples/images/surfaces_22.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`*`(cos(alpha), `*`(b, `*`(cos(beta), `*`(E[1]))))), `-`(`*`(sin(alpha), `*`(b, `*`(cos(beta), `*`(E[2]))))), `-`(`*`(b, `*`(sin(beta), `*`(E[3])))...](Maple/atlas/examples/images/surfaces_23.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`*`(cos(alpha), `*`(b, `*`(cos(beta), `*`(E[1]))))), `-`(`*`(sin(alpha), `*`(b, `*`(cos(beta), `*`(E[2]))))), `-`(`*`(b, `*`(sin(beta), `*`(E[3])))...](Maple/atlas/examples/images/surfaces_24.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`*`(cos(alpha), `*`(b, `*`(cos(beta), `*`(E[1]))))), `-`(`*`(sin(alpha), `*`(b, `*`(cos(beta), `*`(E[2]))))), `-`(`*`(b, `*`(sin(beta), `*`(E[3])))...](Maple/atlas/examples/images/surfaces_25.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`*`(cos(alpha), `*`(b, `*`(cos(beta), `*`(E[1]))))), `-`(`*`(sin(alpha), `*`(b, `*`(cos(beta), `*`(E[2]))))), `-`(`*`(b, `*`(sin(beta), `*`(E[3])))...](Maple/atlas/examples/images/surfaces_26.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`*`(cos(alpha), `*`(b, `*`(cos(beta), `*`(E[1]))))), `-`(`*`(sin(alpha), `*`(b, `*`(cos(beta), `*`(E[2]))))), `-`(`*`(b, `*`(sin(beta), `*`(E[3])))...](Maple/atlas/examples/images/surfaces_27.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`*`(cos(alpha), `*`(b, `*`(cos(beta), `*`(E[1]))))), `-`(`*`(sin(alpha), `*`(b, `*`(cos(beta), `*`(E[2]))))), `-`(`*`(b, `*`(sin(beta), `*`(E[3])))...](Maple/atlas/examples/images/surfaces_28.gif)
![`+`(`-`(`/`(`*`(cos(alpha), `*`(cos(beta), `*`(`+`(`*`(2, `*`(b, `*`(cos(beta)))), a), `*`(E[1])))), `*`(b, `*`(`+`(a, `*`(b, `*`(cos(beta)))))))), `-`(`/`(`*`(sin(alpha), `*`(cos(beta), `*`(`+`(`*`(2...](Maple/atlas/examples/images/surfaces_37.gif)
![`+`(`-`(`/`(`*`(cos(alpha), `*`(cos(beta), `*`(`+`(`*`(2, `*`(b, `*`(cos(beta)))), a), `*`(E[1])))), `*`(b, `*`(`+`(a, `*`(b, `*`(cos(beta)))))))), `-`(`/`(`*`(sin(alpha), `*`(cos(beta), `*`(`+`(`*`(2...](Maple/atlas/examples/images/surfaces_38.gif)
![`+`(`-`(`/`(`*`(cos(alpha), `*`(cos(beta), `*`(`+`(`*`(2, `*`(b, `*`(cos(beta)))), a), `*`(E[1])))), `*`(b, `*`(`+`(a, `*`(b, `*`(cos(beta)))))))), `-`(`/`(`*`(sin(alpha), `*`(cos(beta), `*`(`+`(`*`(2...](Maple/atlas/examples/images/surfaces_39.gif)

![ric[T] = `+`(`/`(`*`(`+`(a, `*`(b, `*`(cos(beta)))), `*`(cos(beta), `*`(`&.`(w[1], w[1])))), `*`(b)), `/`(`*`(b, `*`(cos(beta), `*`(`&.`(w[2], w[2])))), `*`(`+`(a, `*`(b, `*`(cos(beta)))))))](Maple/atlas/examples/images/surfaces_51.gif)
![table( [( secondForm ) = table( [( 1, 2 ) = [`+`(`-`(`/`(`*`(`^`(b, 2), `*`(sin(v[h]), `*`(E[1]))), `*`(`+`(`*`(`^`(b, 2)), `*`(`^`(u[h], 2)))))), `/`(`*`(cos(v[h]), `*`(`^`(b, 2), `*`(E[2]))), `*`(`+...](Maple/atlas/examples/images/surfaces_62.gif)
![table( [( secondForm ) = table( [( 1, 2 ) = [`+`(`-`(`/`(`*`(`^`(b, 2), `*`(sin(v[h]), `*`(E[1]))), `*`(`+`(`*`(`^`(b, 2)), `*`(`^`(u[h], 2)))))), `/`(`*`(cos(v[h]), `*`(`^`(b, 2), `*`(E[2]))), `*`(`+...](Maple/atlas/examples/images/surfaces_63.gif)
![table( [( secondForm ) = table( [( 1, 2 ) = [`+`(`-`(`/`(`*`(`^`(b, 2), `*`(sin(v[h]), `*`(E[1]))), `*`(`+`(`*`(`^`(b, 2)), `*`(`^`(u[h], 2)))))), `/`(`*`(cos(v[h]), `*`(`^`(b, 2), `*`(E[2]))), `*`(`+...](Maple/atlas/examples/images/surfaces_64.gif)
![R[H] = `+`(`-`(`/`(`*`(`^`(b, 2), `*`(`&.`(`&^`(s[1], s[2]), `&^`(s[1], s[2])))), `*`(`+`(`*`(`^`(b, 2)), `*`(`^`(u[h], 2)))))))](Maple/atlas/examples/images/surfaces_67.gif)
![ric[H] = `+`(`-`(`/`(`*`(`^`(b, 2), `*`(`&.`(s[1], s[1]))), `*`(`^`(`+`(`*`(`^`(b, 2)), `*`(`^`(u[h], 2))), 2)))), `-`(`/`(`*`(`^`(b, 2), `*`(`&.`(s[2], s[2]))), `*`(`+`(`*`(`^`(b, 2)), `*`(`^`(u[h], ...](Maple/atlas/examples/images/surfaces_68.gif)
![scal[H] = `+`(`-`(`/`(`*`(2, `*`(`^`(b, 2))), `*`(`^`(`+`(`*`(`^`(b, 2)), `*`(`^`(u[h], 2))), 2)))))](Maple/atlas/examples/images/surfaces_69.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_80.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_81.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_82.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_83.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_84.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_85.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_86.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_87.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_88.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_89.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_90.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_91.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_92.gif)
![table( [( secondForm ) = table( [( 2, 2 ) = [`+`(`-`(`/`(`*`(rho, `*`(cos(v), `*`(`^`(Diff(zeta, u), 2), `*`(E[1])))), `*`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`(`^`(Diff(zeta, u), 2)))))), `-`(`/`(`*`(rh...](Maple/atlas/examples/images/surfaces_93.gif)
![R[A] = `+`(`-`(`/`(`*`(rho, `*`(Diff(zeta, u), `*`(`+`(`*`(Diff(rho, u, u), `*`(Diff(zeta, u))), `-`(`*`(Diff(zeta, u, u), `*`(Diff(rho, u))))), `*`(`&.`(`&^`(p[1], p[2]), `&^`(p[1], p[2])))))), `*`(`...](Maple/atlas/examples/images/surfaces_96.gif)
![R[A] = `+`(`-`(`/`(`*`(rho, `*`(Diff(zeta, u), `*`(`+`(`*`(Diff(rho, u, u), `*`(Diff(zeta, u))), `-`(`*`(Diff(zeta, u, u), `*`(Diff(rho, u))))), `*`(`&.`(`&^`(p[1], p[2]), `&^`(p[1], p[2])))))), `*`(`...](Maple/atlas/examples/images/surfaces_97.gif)
![ric[A] = `+`(`-`(`/`(`*`(Diff(zeta, u), `*`(`+`(`*`(Diff(rho, u, u), `*`(Diff(zeta, u))), `-`(`*`(Diff(zeta, u, u), `*`(Diff(rho, u))))), `*`(`&.`(p[1], p[1])))), `*`(rho, `*`(`+`(`*`(`^`(Diff(rho, u)...](Maple/atlas/examples/images/surfaces_98.gif)
![ric[A] = `+`(`-`(`/`(`*`(Diff(zeta, u), `*`(`+`(`*`(Diff(rho, u, u), `*`(Diff(zeta, u))), `-`(`*`(Diff(zeta, u, u), `*`(Diff(rho, u))))), `*`(`&.`(p[1], p[1])))), `*`(rho, `*`(`+`(`*`(`^`(Diff(rho, u)...](Maple/atlas/examples/images/surfaces_99.gif)
![scal[A] = `+`(`-`(`/`(`*`(2, `*`(Diff(zeta, u), `*`(`+`(`*`(Diff(rho, u, u), `*`(Diff(zeta, u))), `-`(`*`(Diff(zeta, u, u), `*`(Diff(rho, u)))))))), `*`(rho, `*`(`^`(`+`(`*`(`^`(Diff(rho, u), 2)), `*`...](Maple/atlas/examples/images/surfaces_100.gif)