\chapter[EXCALC: Differential Geometry]%
{EXCALC: A differential geometry package}
\label{EXCALC}
\typeout{{EXCALC: A differential geometry package}}
{\footnotesize
\begin{center}
Eberhard Schr\"{u}fer \\
GMD, Institut I1 \\
Postfach 1316 \\
53757 St. Augustin, GERMANY \\[0.05in]
e--mail: schruefer@gmd.de
\end{center}
}
\ttindex{EXCALC}
{\bf EXCALC} is designed for easy use by all who are familiar with the
calculus of Modern Differential Geometry. Its syntax is kept as close
as possible to standard textbook notations. Therefore, no great
experience in writing computer algebra programs is required. It is
almost possible to input to the computer the same as what would have
been written down for a hand-calculation. For example, the statement
\begin{verbatim}
f*x^y + u _| (y^z^x)
\end{verbatim}
\index{exterior calculus}
would be recognized by the program as a formula involving exterior
products and an inner product. The program is currently able to
handle scalar-valued exterior forms, vectors and operations between
them, as well as non-scalar valued forms (indexed forms). With this,
it should be an ideal tool for studying differential equations,
doing calculations in general relativity and field theories, or doing
such simple things as calculating the Laplacian of a tensor field for
an arbitrary given frame. With the increasing popularity of this
calculus, this program should have an application in almost any field
of physics and mathematics.
\section{Declarations}
Geometrical objects like exterior forms or vectors are introduced to the
system by declaration commands. The declarations can appear anywhere in
a program, but must, of course, be made prior to the use of the object.
Everything that has no declaration is treated as a constant; therefore
zero-forms must also be declared.
An exterior form is introduced by\label{PFORM}\index{PFORM statement}
\index{exterior form ! declaration}
\hspace*{2em} \k{PFORM} \s{declaration$_1$}, \s{declaration$_2$}, \ldots;
where
\begin{tabbing}
\s{declaration} ::= \s{name} $\mid$ \s{list of names}=\s{number} $\mid$ \s{identifier} $\mid$ \\
\s{expression} \\
\s{name} ::= \s{identifier} $\mid$ \s{identifier}(\s{arguments})
\end{tabbing}
For example
\begin{verbatim}
pform u=k,v=4,f=0,w=dim-1;
\end{verbatim}
declares {\tt U} to be an exterior form of degree {\tt K}, {\tt V} to be a
form of degree 4, {\tt F} to be a form of degree 0 (a function), and {\tt W}
to be a form of degree {\tt DIM}-1.
The declaration of vectors is similar. The command {\tt TVECTOR}\label{TVECTOR}
takes a list of names.\index{TVECTOR command}\index{exterior form ! vector}
\hspace*{2em} \k{TVECTOR} \s{name$_1$}, \s{name$_2$}, \ldots;
For example, to declare {\tt X} as a vector and {\tt COMM} as a vector with
two indices, one would say
\begin{verbatim}
tvector x,comm(a,b);
\end{verbatim}
The exterior degree of a symbol or a general expression can be obtained
with the function \label{EXDEGREE}\index{EXDEGREE command}
\hspace*{2em} \k{EXDEGREE} \s{expression};
Example:
\begin{verbatim}
exdegree(u + 3*chris(k,-k));
1
\end{verbatim}
\section{Exterior Multiplication}
\index{"\^{} ! exterior multiplication}\index{exterior product}
Exterior multiplication between exterior forms is carried out with the
nary infix operator \^{ } (wedge)\label{wedge}. Factors are ordered
according to the usual ordering in {\REDUCE} using the commutation
rule for exterior products.
\begin{verbatim}
pform u=1,v=1,w=k;
u^v;
U^V
v^u;
- U^V
u^u;
0
w^u^v;
K
( - 1) *U^V^W
(3*u-a*w)^(w+5*v)^u;
A*(5*U^V^W - U^W^W)
\end{verbatim}
It is possible to declare the dimension of the underlying space
by\label{SPACEDIM}\index{SPACEDIM command}\index{dimension}
\hspace*{2em} \k{SPACEDIM} \s{number} $\mid$ \s{identifier};
If an exterior product has a degree higher than the dimension of the
space, it is replaced by 0:
\section{Partial Differentiation}
Partial differentiation is denoted by the operator {\tt @}\label{at}.
Its capability is the same as the {\REDUCE} {\tt DF} operator.
\index{"@ operator}\index{partial differentiation}
\index{differentiation ! partial}
\example\index{EXCALC package ! example}
\begin{verbatim}
@(sin x,x);
COS(X)
@(f,x);
0
\end{verbatim}
An identifier can be declared to be a function of certain variables.
\index{FDOMAIN command}
This is done with the command {\tt FDOMAIN}\label{FDOMAIN}. The
following would tell the partial differentiation operator that {\tt F}
is a function of the variables {\tt X} and {\tt Y} and that {\tt H} is
a function of {\tt X}.
\begin{verbatim}
fdomain f=f(x,y),h=h(x);
\end{verbatim}
Applying {\tt @} to {\tt F} and {\tt H} would result in
\begin{verbatim}
@(x*f,x);
F + X*@ F
X
@(h,y);
0
\end{verbatim}
\index{tangent vector}
The partial derivative symbol can also be an operator with a single
argument. It then represents a natural base element of a tangent
vector\label{at1}.
\section{Exterior Differentiation}
\index{exterior differentiation}
Exterior differentiation of exterior forms is carried out by the
operator {\tt d}\label{d}. Products are normally differentiated out,
\begin{verbatim}
pform x=0,y=k,z=m;
d(x * y);
X*d Y + d X^Y
\end{verbatim}
This expansion can be suppressed by the command {\tt NOXPND
D}\label{NOXPNDD}.\index{NOXPND ! D}
Expansion is performed again when the command {\tt XPND D}\label{XPNDD}
is executed.\index{XPND ! D}
If an argument of an implicitly defined function has further
dependencies the chain rule will be applied {\em e.g.}\index{chain rule}
\begin{verbatim}
fdomain y=y(z);
d f;
@ F*d X + @ F*@ Y*d Z
X Y Z
\end{verbatim}
Expansion into partial derivatives can be inhibited by
{\tt NOXPND @}\label{NOXPNDA}
and enabled again by {\tt XPND @}\label{XPNDA}.
\index{NOXPND ! "@}\index{XPND ! "@}
\section{Inner Product}
\index{inner product ! exterior form}
The inner product between a vector and an exterior form is represented
by the diphthong \_$|$ \label{innerp} (underscore or-bar), which is the
notation of many textbooks. If the exterior form is an exterior
product, the inner product is carried through any factor.
\index{\_$\mid$ operator}
\example\index{EXCALC package ! example}
\begin{verbatim}
pform x=0,y=k,z=m;
tvector u,v;
u _| (x*y^z);
K
X*(( - 1) *Y^U _| Z + U _| Y^Z)
\end{verbatim}
\section{Lie Derivative}
\index{Lie Derivative}
The Lie derivative can be taken between a vector and an exterior form
or between two vectors. It is represented by the infix operator $|$\_
\label{lie}. In the case of Lie differentiating, an exterior form by
a vector, the Lie derivative is expressed through inner products and
exterior differentiations, {\em i.e.}\index{$\mid$\_ operator}
\begin{verbatim}
pform z=k;
tvector u;
u |_ z;
U _| d Z + d(U _| Z)
\end{verbatim}
\section{Hodge-* Duality Operator}
\index{Hodge-* duality operator}\index{"\# ! Hodge-* operator}
The Hodge-*\label{hodge} duality operator maps an exterior form of degree
{\tt K} to an exterior form of degree {\tt N-K}, where {\tt N} is the
dimension of the space. The double application of the operator must
lead back to the original exterior form up to a factor. The following
example shows how the factor is chosen here
\begin{verbatim}
spacedim n;
pform x=k;
# # x;
2
(K + K*N)
( - 1) *X*SGN
\end{verbatim}
\index{SGN ! indeterminate sign}\index{coframe}
The indeterminate SGN in the above example denotes the sign of the
determinant of the metric. It can be assigned a value or will be
automatically set if more of the metric structure is specified (via
COFRAME), {\em i.e.} it is then set to $g/|g|$, where $g$ is the
determinant of the metric. If the Hodge-* operator appears in an
exterior product of maximal degree as the leftmost factor, the Hodge-*
is shifted to the right according to
\begin{verbatim}
pform {x,y}=k;
# x ^ y;
2
(K + K*N)
( - 1) *X^# Y
\end{verbatim}
\section{Variational Derivative}
\index{derivative ! variational}\index{variational derivative}
\ttindex{VARDF}
The function {\tt VARDF}\label{VARDF} returns as its value the
variation of a given Lagrangian n-form with respect to a specified
exterior form (a field of the Lagrangian). In the shared variable
\ttindex{BNDEQ"!*}
{\tt BNDEQ!*}, the expression is stored that has to yield zero if
integrated over the boundary.
Syntax:
\hspace*{2em} \k{VARDF}(\s{Lagrangian n-form},\s{exterior form})
\example\index{EXCALC package ! example}
\begin{verbatim}
spacedim 4;
pform l=4,a=1,j=3;
l:=-1/2*d a ^ # d a - a^# j$ %Lagrangian of the e.m. field
vardf(l,a);
- (# J + d # d A) %Maxwell's equations
bndeq!*;
- 'A^# d A %Equation at the boundary
\end{verbatim}
For the calculation of the conserved currents induced by symmetry
operators (vector fields), the function {\tt NOETHER}\label{NOETHER}
\index{NOETHER function}
is provided. It has the syntax:
\hspace*{2em}
\k{NOETHER}(\s{Lagrangian n-form},\s{field},\s{symmetry generator})
\example\index{EXCALC package ! example}
\begin{verbatim}
pform l=4,a=1,f=2;
spacedim 4;
l:= -1/2*d a^#d a; %Free Maxwell field;
tvector x(k); %An unspecified generator;
noether(l,a,x(-k));
( - 2*d(X _|A)^# d A - (X _|d A)^# d A + d A^(X _|# d A))/2
K K K
\end{verbatim}
\section{Handling of Indices}
\index{exterior form ! with indices}
Exterior forms and vectors may have indices. On input, the indices
are given as arguments of the object. A positive argument denotes a
superscript and a negative argument a subscript. On output, the
indexed quantity is displayed two dimensionally if {\tt NAT} is on.
\index{NAT flag}
Indices may be identifiers or numbers.
\example\index{EXCALC package ! example}
\begin{verbatim}
pform om(k,l)=m,e(k)=1;
e(k)^e(-l);
K
E ^E
L
om(4,-2);
4
OM
2
\end{verbatim}
In certain cases, one would like to inhibit the summation over
specified index names, or at all. For this the command
\index{NOSUM command}
\hspace*{2em} \k{NOSUM} \s{indexname$_1$}, \ldots;\label{NOSUM}
and the switch {\tt NOSUM} are\index{NOSUM switch}
available. The command {\tt NOSUM} has the effect that summation is
not performed over those indices which had been listed. The command
{\tt RENOSUM}\label{RENOSUM} enables summation again. The switch {\tt
NOSUM}, if on, inhibits any summation.\index{RENOSUM command}
\label{INDEXSYMMETRIES}\index{INDEXSYMMETRIES command}
It is possible to declare symmetry properties for an indexed quantity by
the command {\tt INDEX\_SYMMETRIES}. A prototypical example is as
follows
\begin{verbatim}
index_symmetries u(k,l,m,n): symmetric in {k,l},{m,n}
antisymmetric in {{k,l},{m,n}},
g(k,l),h(k,l): symmetric;
\end{verbatim}
It declares the object {\tt u} symmetric in the first two and last
two indices and antisymmetric with respect to commutation of the given
index pairs. If an object is completely symmetric or antisymmetric,
the indices need not to be given after the corresponding keyword as
shown above for {\tt g} and {\tt h}.
\section{Metric Structures}
\index{metric structure}\index{coframe}
A metric structure is defined in {\bf EXCALC} by specifying a set of
basis one-forms (the coframe) together with the metric.
Syntax:\label{COFRAME}
\begin{tabbing}
\hspace*{2em} \k{COFRAME} \=
\s{identifier}\s{(index$_1$)}=\s{expression$_1$}, \\
\> \s{identifier}\s{(index$_2$)}=\s{expression$_2$}, \\
\> . \\
\> . \\
\> . \\
\> \s{identifier}\s{(index$_n$)}=\s{expression$_n$} \\
\> \hspace{1em} \k{WITH} \k{METRIC} \s{name}=\s{expression}; \\
\end{tabbing}
\index{Euclidean metric}\index{COFRAME ! WITH METRIC}
This statement automatically sets the dimension of the space and the
index range. The clause {\tt WITH METRIC} can be omitted if the metric
\index{COFRAME ! WITH SIGNATURE}
is Euclidean and the shorthand {\tt WITH SIGNATURE \s{diagonal elements}}
\label{SIGNATURE} can be used in the case of a pseudo-Euclidean
metric. The splitting of a metric structure in its metric tensor
coefficients and basis one-forms is completely arbitrary including the
extremes of an orthonormal frame and a coordinate frame.
\newpage
\example\index{EXCALC package ! example}
\begin{verbatim}
coframe e r=d r, e(ph)=r*d ph
with metric g=e(r)*e(r)+e(ph)*e(ph); %Polar coframe
\end{verbatim}
The frame dual to the frame defined by the {\tt COFRAME} command can
be introduced by \k{FRAME} command.\index{FRAME command}
\hspace*{2em} \k{FRAME} \s{identifier};\label{FRAME}
This command causes the
dual property to be recognised, and the tangent vectors of the
coordinate functions are replaced by the frame basis vectors.
\example\index{EXCALC package ! example}
\begin{verbatim}
coframe b r=d r,b ph=r*d ph,e z=d z; %Cylindrical coframe;
frame x; on nero;
x(-k) _| b(l);
R
NS := 1
R
PH
NS := 1
PH
Z
NS := 1
Z
x(-k) |_ x(-l); %The commutator of the dual frame;
NS := X /R
PH R PH
NS := ( - X )/R %i.e. it is not a coordinate base;
R PH PH
\end{verbatim}
\index{DISPLAYFRAME command}\index{tracing ! EXCALC}
As a convenience, the frames can be displayed at any point in a program
by the command {\tt DISPLAYFRAME;}\label{DISPLAYFRAME}.
\index{Hodge-* duality operator}
The Hodge-* duality operator returns the explicitly constructed dual
element if applied to coframe base elements. The metric is properly
taken into account.
\index{Levi-Cevita tensor}\ttindex{EPS}
The total antisymmetric Levi-Cevita tensor {\tt EPS}\label{EPS} is
also available. The value of {\tt EPS} with an even permutation of the
indices in a covariant position is taken to be +1.
\section{Riemannian Connections}
\index{Riemannian Connections}
The command {\tt RIEMANNCONX} is provided for calculating the
\index{RIEMANNCONX command} \label{RIEMANNCONX}
connection 1 forms. The values are stored on the name given to {\tt
RIEMANNCONX}. This command is far more efficient than calculating the
connection from the differential of the basis one-forms and using
inner products.
\section{Ordering and Structuring}
\index{ordering ! exterior form}\index{FORDER command}
The ordering of an exterior form or vector can be changed by the
command {\tt FORDER}.\label{FORDER} In an expression, the first
identifier or kernel in the arguments of {\tt FORDER} is ordered ahead
of the second, and so on, and ordered ahead of all not appearing as
arguments. This ordering is done on the internal level and not only
on output. The execution of this statement can therefore have
tremendous effects on computation time and memory requirements. {\tt
REMFORDER}\label{REMFORDER} brings back standard ordering for those
elements that are listed as arguments.\index{REMFORDER command}
An expression can be put in a more structured form by renaming a
subexpression. This is done with the command {\tt KEEP} which
has the syntax\index{KEEP command}\label{KEEP}
\hspace*{2em} \k{KEEP}
\s{name$_1$}=\s{expression$_1$},\s{name$_2$}=\s{expression$_2$}, \ldots
\index{exterior product}
The capabilities of {\tt KEEP} are currently very limited. Only exterior
products should occur as righthand sides in {\tt KEEP}.
\noindent{\bf Note:}
This is just an introduction to the full power of {\tt EXCALC}. The
reader if referred to the full documentation.