Message Boards Message Boards

0
|
6386 Views
|
4 Replies
|
0 Total Likes
View groups...
Share
Share this post:

Self dual tensors in Mathematica 9

Posted 10 years ago

Hi everybody,

Is there any convenient way to define self dual tensors in mathematica?

The best I could come up with is defining an antisymmetric tensor and summing it with its Hodge dual. But then Mathematica doesn't know that the tensor is self dual and thinks it has more degrees of freedom than it actually has, for example:

sa4 = SymmetrizedArray[pos_ :> Subscript[a, pos], {8, 8, 8, 8}, Antisymmetric[All]];

(*This should be 1 + 70, the number of D.O.F 's of a rank 4 antysymmetric tensor in 8 dimensions:*)
Length[SymmetrizedArrayRules[sa4]] 
71

sa4star = HodgeDual[sa4];
sa4sum = sa4 + sa4star;
sa4sum == HodgeDual[sa4sum]
True

(*This should be 1 + 35, the number of D.O.F 's of a ~self-dual~ rank 4 antysymmetric tensor in 8 dimensions:*)
Length[SymmetrizedArrayRules[sa4sum]]
71

Is there a smarter way to define it?

Thanks a lot, Ofri

POSTED BY: Ofri Telem
4 Replies

(This should be 1 + 35, the number of D.O.F 's of a ~self-dual~ rank 4 antysymmetric tensor in 8 dimensions:) Length[SymmetrizedArrayRules[sa4sum]]

71

The right number 35 is of course hidden in this, because one cannot just count the length of SymmetrizedArrayRules[sa4sum]: there are now linear dependencies between them: let's define the sa4 a bit more convenient

In[71]:=  Clear[sa4, sa4sum, sa4star]
sa4 = SymmetrizedArray[pos_ :> a @@ pos, {8, 8, 8, 8},  Antisymmetric[All]];

do the self-dualization

In[73]:= sa4star = HodgeDual[sa4];
In[74]:= sa4sum = sa4 + sa4star;
In[75]:= sa4sum == HodgeDual[sa4sum]
Out[8]= True

and now count correctly

In[56]:= Remove[coRank]
coRank[a_Plus, b_Plus] := MatrixRank[{List @@ a, List @@ b}]

In[76]:= Length[Partition[SortBy[Most[Last /@ SymmetrizedArrayRules[sa4sum]], coRank], 2]]
Out[76]= 35

the SortBy[] with coRank[] pairs linear dependent coefficients and there are 35 such pairs. Control it the other way around

 In[79]:= coRank @@@ Partition[SortBy[Most[Last /@ SymmetrizedArrayRules[sa4sum]], coRank], 2]
Out[79]= {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
POSTED BY: Udo Krause

Reverse engineering would impose something like that

In[1]:= Clear[sa4sd, selfD, selfF]
selfD[p_] := If[First[p] == 1, p, Complement[Range[8], p]]
selfF[p_] := If[First[p] == 1, 1, 2]
sa4sd = SymmetrizedArray[pos_ :> ((-1)^(Plus @@ pos))^selfF[pos] (a @@ selfD[pos]), {8, 8, 8, 8}, Antisymmetric[All]];

In[5]:= sa4sd == HodgeDual[sa4sd]
Out[5]= True

using the build-in Antisymmetric[All] pre-evaluation of pos. Still it holds

In[7]:= TensorSymmetry[sa4sd]
Out[7]= Antisymmetric[{1, 2, 3, 4}]

With Mathematica 10 one possibly could use the Symmetry Specifications under TensorSymmetries directly.

POSTED BY: Udo Krause

To get rid of the reverse engineering one figures out what the HodgeDual[] is in tensor operations within an euclidean metric

 In[33]:= (* (i) Hodge Dual {a,b,c} *)
Normal[LeviCivitaTensor[3] . {a, b, c}]
Out[33]= {{0, c, -b}, {-c, 0, a}, {b, -a, 0}}

replacing the Dot[] by canonical operations it reads

In[34]:= (* (ii) Hodge Dual {a,b,c} *)
(1/1!) Normal[TensorContract[TensorProduct[LeviCivitaTensor[3], {a, b, c}], {3, 4}]]
Out[34]= {{0, c, -b}, {-c, 0, a}, {b, -a, 0}}

which makes it easy to apply it twice in order to create the identity

In[35]:= (* HodgeDual HodgeDual {a,b,c} *)
(1/2!) Normal[ (* HodgeDual *)
  TensorContract[TensorProduct[LeviCivitaTensor[3],(* HodgeDual *) 
      (1/1!) TensorContract[TensorProduct[LeviCivitaTensor[3], {a, b, c}], {3, 4}]], {{2, 4}, {3, 5}}]]
Out[35]= {a, b, c}

by the way this is in the references of the LeviCivitaTensor LeviCivitaTensor, Examples -> Applications

POSTED BY: Udo Krause

not at all a beauty

In[101]:= Clear[selfDT]
selfDT[rk_Integer?Positive] := 
 Block[{rg = Range[2 rk]}, 
   SymmetrizedArray[
     pos_ :> If[Signature[Join[pos, Complement[rg, pos]]] > 0, 1,(* else *) If[First[pos] == 1, 1, -1]] 
       (a @@ If[First[pos] == 1, pos, Complement[rg, pos]]), 2 Table[rk, {rk}], Antisymmetric[All]
   ]
 ] /; EvenQ[rk]

In[105]:= (# == HodgeDual[#]) & /@ Table[selfDT[o], {o, 2, 8, 2}]
Out[105]= {True, True, True, True}
POSTED BY: Udo Krause
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract