This shows you the differences between two versions of the page.
documentation:ref:generatetensor [2015/11/21 12:33] |
documentation:ref:generatetensor [2015/11/21 12:33] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== GenerateTensor ====== | ||
+ | ----- | ||
+ | |||
+ | ====Description==== | ||
+ | * ''GenerateTensor(indices, samples)'' generates tensor of the most general form from a given samples. | ||
+ | |||
+ | * The [[SimpleIndices|indices]] of tensor produced by ''GenerateTensor(indices, samples)'' are ''indices''. | ||
+ | |||
+ | * The [[documentation:guide:symmetries_of_tensors|symmetries]] of tensor produced by ''GenerateTensor(indices, samples)'' will be equal to symmetries of specified [[simpleindices]] ''indices'' . | ||
+ | |||
+ | * ''GenerateTensor(indices, samples, options)'' allows to pass additional [[#Options|options]]. | ||
+ | |||
+ | ====Examples==== | ||
+ | The most general tensor with 3 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 | ||
+ | |||
+ | <sxh groovy; gutter: false> | ||
+ | def t = GenerateTensor('_abc'.si, ['g_mn', 'k_a']) | ||
+ | println t | ||
+ | </sxh> | ||
+ | <sxh plain; gutter: false> | ||
+ | > 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} | ||
+ | </sxh> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Generate tensor with 4 indices with particular symmetries: | ||
+ | <sxh groovy; gutter: false> | ||
+ | def indices = '_{abcd}'.si //parse SimpleIndices | ||
+ | indices.symmetries.add(-[[0, 2, 1, 3]].p) //add particular symmetries | ||
+ | t = GenerateTensor(indices, ['g_ab', 'k_a']) | ||
+ | println Collect['C[x]'.t] >> t | ||
+ | </sxh> | ||
+ | <sxh plain; gutter: false> | ||
+ | > C[0]*(g_{ab}*k_{c}*k_{d}-g_{cd}*k_{a}*k_{b}) | ||
+ | +C[1]*(-g_{bc}*k_{a}*k_{d}-g_{ad}*k_{b}*k_{c} | ||
+ | +g_{bd}*k_{a}*k_{c}+g_{ac}*k_{b}*k_{d}) | ||
+ | +C[2]*(g_{ac}*g_{bd}-g_{ad}*g_{bc}) | ||
+ | </sxh> | ||
+ | |||
+ | ---- | ||
+ | Generate fully antisymmetric tensor with 5 indices from samples ''t_mn'' and ''f_abc'': | ||
+ | <sxh groovy; gutter: true> | ||
+ | def indices = '_abcde'.si | ||
+ | indices.symmetries.setAntiSymmetric() | ||
+ | def r = Collect['C[x]'] >> GenerateTensor(indices, ['t_mn', 'f_abe'].t) | ||
+ | println r | ||
+ | </sxh> | ||
+ | <sxh plain; gutter: false> | ||
+ | > C[0]*(-t_{be}*f_{dca}+t_{da}*f_{ecb}-t_{ba}*f_{ecd}+t_{bc}*f_{ade} | ||
+ | +t_{eb}*f_{dca}-t_{ce}*f_{abd}-t_{ea}*f_{cbd}-t_{da}*f_{ceb} | ||
+ | +t_{ca}*f_{ebd}+t_{ba}*f_{edc}+t_{ed}*f_{acb}-t_{ca}*f_{dbe} | ||
+ | -t_{ba}*f_{dec}-t_{be}*f_{adc}+t_{eb}*f_{adc}+t_{de}*f_{bca} | ||
+ | -t_{ec}*f_{adb}+t_{dc}*f_{eba}-t_{ab}*f_{ced}-t_{ad}*f_{bec} | ||
+ | -t_{da}*f_{ebc}+t_{ea}*f_{cdb}+t_{be}*f_{dac}-t_{dc}*f_{abe} | ||
+ | -t_{eb}*f_{dac}+t_{ae}*f_{dcb}-t_{bd}*f_{cea}-t_{ae}*f_{dbc} | ||
+ | -t_{ea}*f_{bdc}+t_{dc}*f_{bae}-t_{db}*f_{cae}-t_{dc}*f_{bea} | ||
+ | +t_{cb}*f_{eda}+t_{ab}*f_{cde}-t_{ad}*f_{ecb}-t_{ac}*f_{deb} | ||
+ | +t_{da}*f_{cbe}-t_{ce}*f_{bda}+t_{ec}*f_{abd}+t_{ac}*f_{bed} | ||
+ | +t_{ad}*f_{ceb}-t_{ab}*f_{dce}+t_{ac}*f_{edb}-t_{dc}*f_{eab} | ||
+ | -t_{da}*f_{bce}+t_{bd}*f_{aec}-t_{de}*f_{acb}+t_{ab}*f_{ecd} | ||
+ | +t_{ce}*f_{dba}+t_{ae}*f_{cbd}-t_{bd}*f_{ace}-t_{ab}*f_{edc} | ||
+ | -t_{cb}*f_{ead}-t_{cb}*f_{dea}+t_{ad}*f_{ebc}-t_{be}*f_{cad} | ||
+ | +t_{dc}*f_{aeb}-t_{bc}*f_{eda}-t_{bd}*f_{eac}+t_{ab}*f_{dec} | ||
+ | +t_{cb}*f_{dae}+t_{ce}*f_{bad}+t_{eb}*f_{cad}+t_{ea}*f_{bcd} | ||
+ | +t_{ca}*f_{deb}+t_{be}*f_{acd}-t_{ca}*f_{bed}-t_{ae}*f_{cdb} | ||
+ | -t_{eb}*f_{acd}-t_{ac}*f_{bde}+t_{cb}*f_{aed}-t_{ca}*f_{edb} | ||
+ | -t_{ad}*f_{cbe}+t_{ed}*f_{cba}+t_{bd}*f_{eca}+t_{ec}*f_{bda} | ||
+ | -t_{cd}*f_{eba}+t_{ae}*f_{bdc}+t_{db}*f_{cea}-t_{ed}*f_{abc} | ||
+ | +t_{bc}*f_{ead}+t_{bc}*f_{dea}-t_{ed}*f_{cab}+t_{ad}*f_{bce} | ||
+ | -t_{ce}*f_{dab}+t_{cd}*f_{abe}+t_{ed}*f_{bac}-t_{bc}*f_{dae} | ||
+ | -t_{ec}*f_{dba}-t_{cd}*f_{bae}+t_{cd}*f_{bea}-t_{db}*f_{aec} | ||
+ | +t_{ca}*f_{bde}-t_{ec}*f_{bad}-t_{bc}*f_{aed}+t_{db}*f_{ace} | ||
+ | +t_{ba}*f_{ced}+t_{cd}*f_{eab}+t_{be}*f_{cda}-t_{cb}*f_{ade} | ||
+ | -t_{ae}*f_{bcd}+t_{db}*f_{eac}-t_{eb}*f_{cda}-t_{ed}*f_{bca} | ||
+ | +t_{ce}*f_{adb}-t_{ac}*f_{ebd}-t_{de}*f_{cba}-t_{ea}*f_{dcb} | ||
+ | +t_{da}*f_{bec}+t_{ea}*f_{dbc}+t_{bd}*f_{cae}+t_{ac}*f_{dbe} | ||
+ | +t_{de}*f_{abc}-t_{cd}*f_{aeb}-t_{ba}*f_{cde}+t_{ec}*f_{dab} | ||
+ | +t_{de}*f_{cab}-t_{db}*f_{eca}-t_{de}*f_{bac}+t_{ba}*f_{dce}) | ||
+ | </sxh> | ||
+ | Check its antisymmetry property: | ||
+ | <sxh groovy; gutter: true; first-line: 6> | ||
+ | def expr = "F_abcde = $r".t | ||
+ | println expr >> 'F_abcde + F_abdce'.t | ||
+ | </sxh> | ||
+ | <sxh plain; gutter: false> | ||
+ | > 0 | ||
+ | </sxh> | ||
+ | <sxh groovy; gutter: true; first-line: 8> | ||
+ | println expr >> 'F_abcde + F_decba'.t | ||
+ | </sxh> | ||
+ | <sxh plain; gutter: false> | ||
+ | > 0 | ||
+ | </sxh> | ||
+ | ====Options==== | ||
+ | * ''SymmetricForm'':\\ produces completely symmetric tensor:<sxh groovy; gutter: false> | ||
+ | println GenerateTensor('_{abc}'.si, ['g_mn', 'k_m'], [SymmetricForm: true]) | ||
+ | </sxh> | ||
+ | <sxh plain; gutter: false> | ||
+ | > (1/3)*C[0]*(g_{bc}*k_{a}+g_{ac}*k_{b}+g_{ab}*k_{c})+C[1]*k_{a}*k_{b}*k_{c} | ||
+ | </sxh> | ||
+ | |||
+ | * ''GeneratedParameters'': \\ Allows to control how free parameters are generated:<sxh groovy; gutter: false> | ||
+ | println GenerateTensor('_{ab}'.si, ['g_mn', 'k_m']) | ||
+ | </sxh><sxh plain; gutter: false> | ||
+ | > C[0]*g_ab+C[1]*k_{a}*k_{b} | ||
+ | </sxh>Control generated parameters: <sxh groovy; gutter: false> | ||
+ | println GenerateTensor('_{ab}'.si,['g_mn', 'k_m'], | ||
+ | [GeneratedParameters: {i -> "K$i".t}]) | ||
+ | </sxh> | ||
+ | <sxh plain; gutter: false> | ||
+ | > K0*g_ab+K1*k_{a}*k_{b} | ||
+ | </sxh> | ||
+ | |||
+ | * ''GenerateParameters'': \\ if false then no parameters will be generated:<sxh groovy; gutter: false> | ||
+ | println GenerateTensor('_{ab}'.si, ['g_mn', 'k_m'], [GenerateParameters: false]) | ||
+ | </sxh> | ||
+ | <sxh plain; gutter: false> | ||
+ | > g_ab+k_{a}*k_{b} | ||
+ | </sxh> | ||
+ | |||
+ | |||
+ | * ''RaiseLower'': \\ By default ''GenerateTensor'' tries to upper/lower indices of the provided samples to generate tensor of the most general form. If ''RaiseLower'' set to false, then it will use samples as is: <sxh groovy; gutter: false> | ||
+ | println GenerateTensor('_{ab}^{cd}'.si, ['g_mn', 'k_m', 'k^m'], [RaiseLower: false]) | ||
+ | </sxh> | ||
+ | <sxh plain; gutter: false> | ||
+ | > C[0]*g_{ab}*k^{c}*k^{d}+C[1]*k_{a}*k_{b}*k^{c}*k^{d} | ||
+ | </sxh> | ||
+ | <sxh groovy; gutter: false> | ||
+ | println GenerateTensor('_{ab}^{cd}'.si, ['g_mn', 'k_m']).size() | ||
+ | </sxh> | ||
+ | <sxh plain; gutter: false> | ||
+ | > 10 | ||
+ | </sxh> | ||
+ | |||
+ | ====See also==== | ||
+ | * Related guides: [[documentation:guide:tensors_and_indices]], [[documentation:guide:symmetries_of_tensors]] | ||
+ | * Related reference material: [[documentation:ref:reduce]], [[documentation:ref:simpleindices]] | ||
+ | * JavaDocs: [[http://api.redberry.cc/redberry/1.1.9/java-api/cc/redberry/core/tensorgenerator/TensorGenerator.html| TensorGenerator]] | ||
+ | * Source code: [[https://bitbucket.org/redberry/redberry/src/tip/core/src/main/java/cc/redberry/core/tensorgenerator/TensorGenerator.java|TensorGenerator.java]] | ||