Merge branch 'master' of git://git.code.sf.net/p/maxima/code
[maxima.git] / share / tensor / tracefree-code / formQ0.mac
blobd02e9d3c77706bf459a7b6f3d0907107d0c3325d
1 /* formQ0: Evaluate trace-free decomposition of a symmetric tensor.
2  *
3  * Usage: Q0(Q);
4  *
5  * parameters: Q: itensor expression
6  *
7  * Given the tensor Q that is fully symmetric in all indices, this
8  * function returns the corresponding STF tensor.
9  *
10  * Side effects: None.
11  *
12  * Example:
13  *
14  * (%i1) load("formQ0.mac")$
15  * (%i2) load(itensor)$
16  * (%i3) dim:3$
17  * (%i4) decsym(g,0,2,[],[sym(all)])$
18  * (%i5) imetric(g)$
19  * (%i6) flipflag:true$
20  * (%i7) defcon(Q,Q,Q)$
21  * (%i8) decsym(Q,0,3,[],[sym(all)])$
22  * (%i9) ishow(canform('kdels([a,b,c],[j,k,l])*Q0(Q([],[a,b,c]))))$
23  *                                          %1  %2 %3      j k l
24  *                                       3 Q   g      kdels
25  *              %1 %2 %3      j k l                        %1 %2 %3
26  * (%t9)       Q         kdels         - --------------------------
27  *                            %1 %2 %3               5
28  *
29  * (c) 2021 Viktor T. Toth (https://www.vttoth.com/)
30  *
31  * This program is free software; you can redistribute it and/or
32  * modify it under the terms of the GNU General Public License as
33  * published by the Free Software Foundation; either version 2 of
34  * the License, or (at your option) any later version.
35  *
36  * This program is distributed in the hope that it will be
37  * useful, but WITHOUT ANY WARRANTY; without even the implied
38  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
39  * PURPOSE.  See the GNU General Public License for more details.
40  */
42 Q0(_Q):=block
43 ([_a,_k,_i,_j,_l,_g],
44   _a:indices(_Q)[1],
45   _k:length(_a),
46   _g:ev(imetric),
47   _Q+canform(contract(sum(
48     (-1/2)^_p*(dim+2*_k-2*(_p+2))!!/_p!/(_k-2*_p)!/(dim+2*_k-4)!!
49     *canform(contract(expand(
50     kdels(makelist(concat('_i,_j),_j,1,_k),_a)
51     *prod(_g([],[concat('_i,2*_i-1),
52     concat('_i,2*_i)])*_g([concat('_j,2*_i-1),concat('_j,2*_i)]),_i,1,_p)
53     *sublis(makelist(_a[_l]=(flatten([makelist(concat('_j,_i),_i,1,2*_p),
54     makelist(concat('_i,_i),_i,2*_p+1,_k)]))[_l],_l,1,_k),_Q)))),
55   _p,1,_k/2)))