====== [23-Aug-2013] Redberry version 1.1.5 released ======
----
====Features highlights:====
This update contains the following important features:
* [[news:23082013#Derivatives|Derivatives:]] introducing the representation of derivatives in Redberry.
* [[news:23082013#Transformations|New transformations:]] new transformations implemented.
* [[news:23082013#Equations with tensors|Reduce tensorial equations:]] reduce and solve equations with tensors.
* [[news:23082013#Tensor generator|Generate tensor:]] generate tensor of the most general form.
To update your Redberry simply change version in your Groovy Grapes:
@Grab(group = 'cc.redberry', module = 'groovy', version = '1.1.5')
or download new ''.jar'' from the [[:downloads| downloads page]].
====Derivatives====
Now you can use derivatives in Redberry. For example, in order to represent \_ $f'''(x^2)$ in Redberry, one just should replace primes with ''~(3)'':
def d = 'f~(3)[x**2]'.t
In the case of multivariate functions, one should specify how many times to differentiate with respect to each slot (argument). For example:
def d = 'f~(2, 3, 0)[a**2, w, q]'.t
represents \(\left. \frac{\partial^5}{\partial x^2 \partial y^3} f\left(x, y, q\right) \right|_{x =a^2 ,\, y =w}\).
In the case of indexed objects the inverted indices of differentiation variables should be appended to the indices of pure tensor field. For example, the following expression
def d = 'F~(2)_{mn ab}^{cd}[f_ab]'.t
represents \(\left. \frac{\delta}{\delta t^{ab}} \frac{\delta}{\delta t_{cd}} F_{mn} \left(t_{ab}\right) \right|_{t_{ab} = f_{ab}}\). This tensor will be automatically set to be symmetric with respect to transposition of differentiation indices ''_ab'' ↔ ''^cd''.
Lean more about derivatives in [[documentation:guide:Representation of derivatives|Redberry documentation]].
====Transformations====
''Collect[var1, var2, ..., transformations]'' collects together terms involving the same powers of specified vars and applies specified transformation to the expression that forms the coefficient of each term obtained. Consider the examples:
def t = 'A_m*B_n + A_n*C_m'.t
println Collect['A_m'.t] >> t
> A_i*(d^i_m*B_n + d^i_n*C_m)
def t = 'D[x][x*f[x, x**2] + f[x, x**2]]'.t
def tr = Collect['f~(0,1)[x, y]'.t, 'f~(1,0)[x, y]'.t, Factor]
println tr >> t
> f[x,x**2]+(x+1)*f~(1,0)[x,x**2]+2*x*(x+1)*f~(0,1)[x,x**2]
''PowerExpand[var1, var2, ...]'' expands all powers of products and powers with respect to specified vars:
def t = '(a*b*c)**d'.t
println PowerExpand >> t
> a**d*b**d*c**d
def t = '(a*b*c)**d'.t
println PowerExpand['a'] >> t
> a**d*(b*c)**d
====Mappings facade====
The very important update of mappings API. The old mutual mapping class is now private. All objects returned by the comparison via ''%'' are now immutual. Consider cases:
setAntiSymmetric 'f_abc'
def from = 'f_abc'.t, to = 'f_mnp'.t
def mappings = from % to
//get the first mapping
println mappings.first
> {_a->_m,_b->_n,_c->_p}
//apply the first mapping
assert mappings >> from == to
//the same as
assert mappings.first >> from == to
def k = 0
//iterate over all mappings
mappings.each{ ++k }
// gives the number of possible mappings
println k
> 6
//find first negative mapping
def neg = mappings.find{ it.sign == true }
println neg
> -{_a->_n,_b->_m,_c->_p}
====Tensor generator====
Allows to generate tensor of the most general form from a given samples. For example, the most general tensor with three indices that can be assembled from metric tensor $g_mn$ and vector $k_m$ is
$$
c_1 k_a k_b k_c + c_2 g_{ac} k_b + c_3 g_{ab} k_c + c_4 g_{bc} k_a
$$
With Redberry one can do the following
def t = GenerateTensor('_abc'.si, ['g_mn', 'k_a'])
println t
> C[0]*k_{a}*k_{b}*k_{c}+C[1]*g_{ac}*k_{b}+C[2]*g_{ab}*k_{c}+C[4]*g_{bc}*k_{a}
For further reading about this feature see [[documentation:ref:GenerateTensor|GenerateTensor]].
====Equations with tensors====
A new function ''Reduce(equations, vars)'' allows to reduce a system of tensorial equations to a system of symbolic equations and to solve it with external solver (Maple or Mathematica).
Solve a system of equations with special symmetries of unknown tensor:
\[
\left\{
\begin{array}{l}
T^{abe}{}_{rba}-x\,T^{bea}{}_{rba} = 8\,d_{r}^{e}\\
T^{pqr}{}_{klm} T^{abc}{}_{pqr} = d^{a}_{m}\,g^{bc}\,g_{lk}
\end{array}
\right.
\]
where $x$ and $T^{abe}{}_{rba}$ are unknown variables and the last one has symmetry [1, 5, 0, 4, 3, 2]. Redberry code:
addSymmetry('T^abc_pqr', 1, 5, 0, 4, 3, 2)
def eq1 = 'T^{abe}_{rba}-x*T^{bea}_{rba} = 8*d_{r}^{e}'.t
def eq2 = 'T^{pqr}_{klm}*T^{abc}_{pqr} = d^{a}_{m}*g^{bc}*g_{lk}'
def options = [Transformations: 'd_n^n = 4'.t, ExternalSolver:
[Solver: 'Mathematica',
Path: '/usr/local/bin']]
def s = Reduce([eq1, eq2], ['T^abc_pqr', 'x'], options)
println s
> [[T^{abc}_{pqr} = -d^{a}_{r}*g^{cb}*g_{qp}, x = 12],
[T^{abc}_{pqr} = d^{a}_{r}*g^{cb}*g_{qp}, x = -4]]
For further reading about ''Reduce(equations, vars)'' in [[documentation:ref:Reduce|Reduce]].