6.1. Covariant derivatives

We understand a covariant derivative as a covariant derivative operator (see Wald). In particular, ordinary ("partial") derivative operators are obtained as covariant derivatives with the options Curvature->False and Torsion->False. Covariant derivatives are real operators acting on (possibly complex) vector bundles.

DefCovD                    Define a covariant derivative operator
UndefCovD                Undefine a covariant derivative
$CovDs                    List of defined covariant derivatives
CovDQ                    Validate a covariant derivative symbol

Definition of a covariant derivative.

Default options for DefCovD:

In[398]:=

Options[DefCovD]

Out[398]=

Define a covariant derivative Cd on TangentM3 (the default vbundle obtained from the index given in the derivative). Automatically the Christoffel symbols and the Riemann and Ricci tensors are defined. By default xTensor` does not assume that this derivative is associated to a metric and therefore the symmetries of the Riemann tensor are not as expected: there is just antisymmetry in the first pair of indices. The Ricci tensor has no symmetry at all. There is no Ricci scalar.

In[399]:=

DefCovD[Cd[-a], { "|", "▽"}]

** DefCovD: Defining covariant derivative Cd[-a] .

** DefTensor: Defining vanishing torsion tensor TorsionCd[a, -b, -c] .

** DefTensor: Defining symmetric Christoffel tensor ChristoffelCd[a, -b, -c] .

** DefTensor: Defining Riemann tensor RiemannCd[-a, -b, -c, d] . Antisymmetric only in the first pair.

** DefTensor: Defining non-symmetric Ricci tensor RicciCd[-a, -b] .

** DefCovD:  Contractions of Riemann automatically replaced by Ricci.

In[400]:=

SymmetryGroupOfTensor[RiemannCd]

Out[400]=

StrongGenSet[{1}, GenSet[-Cycles[{1, 2}]]]

In[401]:=

RiemannCd[-a, -b, -c, b]

Out[401]=

R[▽] _ac^  

In[402]:=

SymmetryGroupOfTensor[RicciCd]

Out[402]=

StrongGenSet[{}, GenSet[]]

The names of the associated tensors are determined by the function GiveSymbol. Their output symbols are determined by the function GiveOutputString.If you want to change any of those, modify the corresponding function before defining the object.

In[403]:=

GiveSymbol[Riemann, Cd]

Out[403]=

RiemannCd

In[404]:=

GiveOutputString[Riemann, Cd]

Out[404]=

R[▽]

Derivatives can be represented in two ways, encoded as the strings Prefix or Postfix in the global variable $CovDFormat. The default value is Prefix. Directional derivatives are always given in Prefix notation.

In[405]:=

$CovDFormat

Out[405]=

Prefix

In[406]:=

Cd[-a][T[a, b, -c]]

Out[406]=

▽_a^ T_ (  c)^ab

In[407]:=

$CovDFormat = "Postfix" ;

In[408]:=

Cd[-a][T[a, b, -c]]

Out[408]=

T_ (  c | a)^ab   

In[409]:=

Cd[Dir[v[d]]][T[a, b, -c]]

Out[409]=

T_ (  c | v)^ab   

Derivatives are linear operators and implement automatically the Leibnitz rule. The final ordering of terms is decided by Mathematica.

In[410]:=

Cd[-a][7r[] v[a] + S[a, b] v[-b]]

Out[410]=

v_b^  S_ (   | a)^ab   + 7 (v_ ^a r_ (| a)^   + r_^ v_ ( | a)^a  ) + S_  ^ab v_ (b | a)^   

Dummy indices are, by default, pushed to the right by the canonicalization process

In[411]:=

Cd[-a][T[f, c, -b] U[-c, -e, -d]]//ToCanonical

Out[411]=

-U_dec^    T_ (  b | a)^fc    - T_ (  b)^fc  U_ (dec | a)^     

SortCovDs                    Commute covariant derivatives, adding Riemann tensors if needed
SortCovDsStart                Automatic commutation of covariant derivatives
SortCovDsStop                Remove automatic commutation of covariant derivatives
$CommuteCovDsOnScalars        Automatic commutation of torsionless derivatives on scalar expressions

Commutation of derivatives.

By default, a special ordinary derivative called PD is defined. It is one of the many covariant derivative operators without curvature and without torsion, but no further assumptions are made about it. It can be used as a generic "partial derivative" in most computations, but its meaning is different. Note that they are not automatically sorted:

In[412]:=

PD[-a][PD[-b][T[c, d, -e]]]

Out[412]=

T_ (  e, b, a)^cd     

In[413]:=

$CovDFormat = "Prefix" ;

In[414]:=

PD[-a][PD[-b][T[c, d, -e]]]

Out[414]=

∂_a^ ∂_b^ T_ (  e)^cd

In[415]:=

PD[-a][PD[-b][T[c, d, -e]]] - PD[-b][PD[-a][T[c, d, -e]]]

Out[415]=

∂_a^ ∂_b^ T_ (  e)^cd - ∂_b^ ∂_a^ T_ (  e)^cd

In[416]:=

%//SortCovDs

Out[416]=

0

We can automate the commutation of derivatives:

In[417]:=

SortCovDsStart[PD]

In[418]:=

PD[-a][PD[-b][T[c, d, -e]]] - PD[-b][PD[-a][T[c, d, -e]]]

Out[418]=

0

In[419]:=

SortCovDsStop[PD]

Note that $CommuteCovDsOnScalars is still True.

All symmetric (torsionless) connections commute (with themselves) on scalar expressions. That can be avoided switching off the variable $CommuteCovDsOnScalars.

The input of high-order derivatives is certainly slow due to the sharp syntactic restrictions of xTensor`. There are several options to avoid this problem. Of course, you cannot use Validate unless you modify it to recognize the new syntactic extensions.

The standard way to input a third order derivative is this:

In[420]:=

PD[-a][PD[-b][PD[-c][T[c, d, -e]]]]

Out[420]=

∂_a^ ∂_b^ ∂_c^ T_ (  e)^cd

We can use the prefix notation of Mathematica:

In[421]:=

PD[-a] @ PD[-b] @ PD[-c] @ T[c, d, -e]

Out[421]=

∂_a^ ∂_b^ ∂_c^ T_ (  e)^cd

or we can define our own rules to input derivatives, breaking the standard syntax. The simplest possibility, based on the fact that the first bracket of PD always contains a single index, is:

In[422]:=

Unprotect[PD] ;

In[423]:=

PD[expr_, a__, b_] := PD[b][PD[expr, a]]

PD[expr_, a_] := PD[a][expr]

In[425]:=

PD[T[c, d, -e], -c, -b, -a]

Out[425]=

∂_a^ ∂_b^ ∂_c^ T_ (  e)^cd

In[426]:=

InputForm[%]

Out[426]//InputForm=

PD[-a][PD[-b][PD[-c][T[c, d, -e]]]]

In[427]:=

PD[expr_, a__, b_] =.

PD[expr_, a_] =.

or an intermediate situation, based on the same fact, is:

In[429]:=

PD[a_, b__][expr_] := PD[a][PD[b][expr]]

In[430]:=

PD[-a, -b, -c][T[c, d, e]]

Out[430]=

∂_a^ ∂_b^ ∂_c^ T_   ^cde

In[431]:=

InputForm[%]

Out[431]//InputForm=

PD[-a][PD[-b][PD[-c][T[c, d, e]]]]

In[432]:=

PD[a_, b__][expr_] =.

A totally different notation could be

In[433]:=

PD/:tensor_Symbol ? xTensorQ[indices___, PD[index_]] := PD[index][tensor[indices]]

In[434]:=

T[c, d, -e, PD[-c], PD[-b], PD[-a]]

Out[434]=

∂_a^ ∂_b^ ∂_c^ T_ (  e)^cd

In[435]:=

InputForm[%]

Out[435]//InputForm=

PD[-a][PD[-b][PD[-c][T[c, d, -e]]]]

In[436]:=

PD/:tensor_Symbol ? xTensorQ[indices___, PD[index_]] =.

In[437]:=

Protect[PD] ;


Created by Mathematica  (May 16, 2008) Valid XHTML 1.1!