atlas[dual] - dual operator 

Calling Sequence: 

    dual(expr) 

Parameters: 

    expr - any tensor expression. 

Description: 

  • The dual - procedure allows one to calculate the dual operator on an expression (just rise and lower indexes in local coordinates). The operator has the following properties.
 

  • The dual operator is linear.
 

  • For any vector field X in local coordinates we have: dual(X)[j] = Sum(`*`(`^`(X, i), `*`(g[ij])), i = 1 .. n).
 

  • For any 1-form omega in local coordinates we have:   `^`(dual(omega), i) = Sum(`*`(omega[j], `*`(`^`(g, ji))), j = 1 .. n).
 

  • For any tensor fields Omega and T the following rule for dual operator takes place: dual(`⊗`(Omega, T)) = `⊗`(dual(Omega), dual(T)).
 

Examples: 

> restart:
with(atlas):
 

Declare constants:  

> Constants(Lambda);
 

{`+`(`-`(I)), I, Pi, _Z, Catalan, Lambda}(2.1)
 

Declare functions:  

> Functions(f=f(x,y),h=h(z));
 

{f, h}(2.2)
 

Declare p-forms:  

> Forms(e[k]=1,xi=1);
 

{xi, e[k]}(2.3)
 

Declare vectors:  

> Vectors(E[j],X,Y,Z);
 

{X, Y, Z, E[j]}(2.4)
 

Declare coframe:
Coframe(e[1]=d(x),e[2]=d(y)); 

[e[1] = d(x), e[2] = d(y)](2.5)
 

Declare frame:
Frame(E[k]); 

[E[1] = Diff(``, x), E[2] = Diff(``, y)](2.6)
 

Declare metric:Metric(g=4*(d(x)&.d(x)+d(y)&.d(y))/(1+Lambda*(x^2+y^2))^2); 

g = `+`(`/`(`*`(4, `*`(`+`(`&.`(e[1], e[1]), `&.`(e[2], e[2])))), `*`(`^`(`+`(1, `*`(Lambda, `*`(`+`(`*`(`^`(x, 2)), `*`(`^`(y, 2)))))), 2))))(2.7)
 

Using dual - procedure: 

For frame vectors:
'dual(E[j])'=dual(E[j]); 

dual(E[j]) = `+`(`/`(`*`(4, `*`(delta[1, j], `*`(e[1]))), `*`(`^`(`+`(1, `*`(Lambda, `*`(`+`(`*`(`^`(x, 2)), `*`(`^`(y, 2)))))), 2))), `/`(`*`(4, `*`(delta[2, j], `*`(e[2]))), `*`(`^`(`+`(1, `*`(Lambd...(2.8)
 

For coframe 1-forms:
'dual(e[j])'=dual(e[j]); 

dual(e[j]) = `+`(`*`(`/`(1, 4), `*`(delta[1, j], `*`(`^`(`+`(1, `*`(Lambda, `*`(`^`(x, 2))), `*`(Lambda, `*`(`^`(y, 2)))), 2), `*`(E[1])))), `*`(`/`(1, 4), `*`(delta[2, j], `*`(`^`(`+`(1, `*`(Lambda, ...(2.9)
 

For exact 1-form:
'dual(d(f))'=dual(d(f)); 

dual(d(f)) = `+`(`*`(`/`(1, 4), `*`(Diff(f, x), `*`(`^`(`+`(1, `*`(Lambda, `*`(`^`(x, 2))), `*`(Lambda, `*`(`^`(y, 2)))), 2), `*`(E[1])))), `*`(`/`(1, 4), `*`(Diff(f, y), `*`(`^`(`+`(1, `*`(Lambda, `*...
dual(d(f)) = `+`(`*`(`/`(1, 4), `*`(Diff(f, x), `*`(`^`(`+`(1, `*`(Lambda, `*`(`^`(x, 2))), `*`(Lambda, `*`(`^`(y, 2)))), 2), `*`(E[1])))), `*`(`/`(1, 4), `*`(Diff(f, y), `*`(`^`(`+`(1, `*`(Lambda, `*...
(2.10)
 

With ToBasis procedure:
dual(X)=dual(ToBasis(X)); 

dual(X) = `+`(`/`(`*`(4, `*`(iota[X](e[1]), `*`(e[1]))), `*`(`^`(`+`(1, `*`(Lambda, `*`(`+`(`*`(`^`(x, 2)), `*`(`^`(y, 2)))))), 2))), `/`(`*`(4, `*`(iota[X](e[2]), `*`(e[2]))), `*`(`^`(`+`(1, `*`(Lamb...(2.11)
 

For 1-form:
dual(xi)=dual(ToBasis(xi)); 

dual(xi) = `+`(`*`(`/`(1, 4), `*`(iota[E[1]](xi), `*`(`^`(`+`(1, `*`(Lambda, `*`(`^`(x, 2))), `*`(Lambda, `*`(`^`(y, 2)))), 2), `*`(E[1])))), `*`(`/`(1, 4), `*`(iota[E[2]](xi), `*`(`^`(`+`(1, `*`(Lamb...(2.12)
 

For [1,1] tensor:
'dual(&.(E[i],e[j]))'=dual(&.(E[i],e[j])); 

dual(`&.`(E[i], e[j])) = `+`(`*`(delta[1, i], `*`(delta[1, j], `*`(`&.`(e[1], E[1])))), `*`(delta[1, i], `*`(delta[2, j], `*`(`&.`(e[1], E[2])))), `*`(delta[2, i], `*`(delta[1, j], `*`(`&.`(e[2], E[1]...
dual(`&.`(E[i], e[j])) = `+`(`*`(delta[1, i], `*`(delta[1, j], `*`(`&.`(e[1], E[1])))), `*`(delta[1, i], `*`(delta[2, j], `*`(`&.`(e[1], E[2])))), `*`(delta[2, i], `*`(delta[1, j], `*`(`&.`(e[2], E[1]...
(2.13)
 

For metric tensor:
'dual(g)'=simplify(dual(g)); 

dual(g) = `+`(`*`(`/`(1, 4), `*`(`^`(`+`(1, `*`(Lambda, `*`(`^`(x, 2))), `*`(Lambda, `*`(`^`(y, 2)))), 2), `*`(`+`(`&.`(E[1], E[1]), `&.`(E[2], E[2]))))))(2.14)
 

>
 

See Also:  

atlas, atlas[d], atlas[cov], atlas[`&.`], atlas[`&^`], atlas[iota].