Alan, Thanks _very_ much for your implementation. I will study it and think about doing additional steps.
Comer On May 27, 9:12 am, Alan Bromborsky <[email protected]> wrote: > [email protected] wrote: > > Hi Ondrej, > > > This code is taken from something you put together which was called > > tensors.py in 0.6.3, at least that is where I found it on my system, > > since I still have 0.6.3 on my disk. I am currently using 0.6.6.6. I > > extracted the imports and the class defs from there and put it in a > > file certekten.py so I could isolate the defs. It is not clear to me > > all your experiment had in mind. What I need to do first is to: > > > 1. figure out how to design classes which allow the definition of > > arbitrary mixed rank tensors: TensorDefine(tensorname,rankindices) > > where tensorname is just a desired symbol name and rankindices is > > something like [pcovariant,qcontravariant] or > > [icov1,icov2,...,icontra1,icontra2,...]. The resulting object should > > be a symbol decorated with the collection of p contravariant and q > > covariant indices. > > 2. the rendering (prettyprinting) should produce these with latex type > > upper and lower indices...like g^{ij} and g_{kl} for example. > > 3. Rules need to be introduced so that contraction (==sum over > > repeated contravariant and covariant indices) should be handled > > correctly. > > 4. derivative operations should be handled e.g. by distribution over > > sums, Leibniz product rule symbolically handled, e.g. \partial > > ( tensor1 * tensor2) ) = (\partial tensor1) * tensor2 + tensor1 * > > (\partial tensor2), etc, etc. > > > plus probably many others. I have looked at scheme implementations > > and while I am not very conversant with scheme, it does appear that > > Sussman and coworker(s) at MIT have done the differential geometry > > stuff. I don't think it focuses on indicial gymnastics but it does > > seem to define generic objects which are "up" and "down" as well as > > covariant derivative, Ricci tensor, Riemann tensor, the components of > > the symmetric connection, etc. I was looking at the scheme way > > because I am interested in what kind of data structures they end up > > defining for tensor kinds of objects with an eye of maybe using those > > as a guide/suggestion as to how tensor objects may be adequately > > 'classed' in python/sympy. > > > I have also spent some time recently looking over the sympy core code > > trying to get better educated with a hope to see what might be good > > ways to go in defining tensor objects... but due to my relative > > inexperience I can not seem to see how to translate the properties I > > think I want into correctly defined python/sympy. > > > I am fully aware of your relativity.py example code, which is fine for > > what it does. However, there the indices are all integers and the > > differentiation is explicit diff, not what is needed in the much more > > formal expression handling of tensor algebra and calculus. > > > I would appreciate help from the sympy community on how to do these > > things. > > > Comer > > > On May 26, 6:18 pm, Ondrej Certik <[email protected]> wrote: > > >> On Wed, May 26, 2010 at 12:43 PM, [email protected] > > >> <[email protected]> wrote: > > >>> Hi, > > >>> I am trying to understand some apparently old code written by Ondrej > >>> trying to implement what I think are indicial tensor expressions. I > >>> list below the class definitions and then try to give an example. The > >>> example results in an error. I believe I recall that Ondrej says that > >>> these definitions don't work, but I am trying to understand them and > >>> want to try to create some appropriate classes which can contain > >>> indicial tensors. > > >> Where is this code from? I think I wrote something like this, but it's > >> quite some time ago, so I forgot which issue it is. > > >> It'd be awesome if you wanted to do some support for tensors in sympy. > >> The only example, that is known to work is the > > >> python examples/advanced/relativity.py > > >> and I just tried it and it seems to work. So that shows how to get > >> something working, and what we need now is some general support for > >> tensors. > > >> Ondrej > > Below is the very beginnings of a abstract tensor class with test > output. Input is via a string > as follows (say for the Riemann tensor) - > > code R = BasicTensor('R_ijk__l') > > 'R' is the base name > 'ijk' are the first three indices with the '_' indicating they are covariant > 'l' is the last index with '__' indicating it is contravariant. > You could define mixed tensors such as 'M__i_j__k_l' etc. > When the tensor is instantciated the string '_ijk__l' generates the list > self.index=[-1,-2,-3,4] indicating there are 4 tensor slots and whether the > slot is co or contravariant. > > Additionally the BasicTensor instantciation stores symmetry information > about the tensor. > See code below and output where the symmetries of the metric and > Riemann tensor (only > simple symmetries in the case of the Riemann tensor, no Bianchi identity). > > The Tensor class would then be composed of a list of lists of basic > tensor with the inner lists > representing different types of tensor products of basic tensors and the > outer list sums of tensor > products (with scalar multipliers for each product). > > Where sympy would come into play is to simplify the general tensor by > assigning suitable indices to > all the basic tensors in the general tensor. Convert all the basic > tensors to sympy scalars. Perform > all multiplications and additions of these scalars to symplify > (including symmetry simplifications) convert > the sympy scalar expression back to a string and the string back to a > tensor. > > Code: > > #!/bin/python > > from sympy import Symbol > > index_pool = 'abcdefhijklmnopquvwxyz' > index_index = 0 > > class BasicTensor: > def __init__(self,Tstr,syms=None,sgns=None): > self.Tstr = Tstr > Tstr_lst = Tstr.split('_') > self.base = Tstr_lst[0] > self.index = [] > self.up_dn = [] > self.syms = [] > self.sgns = [] > self.up_rank = 0 > self.dn_rank = 0 > i = 1 > sgn = -1 > for chstr in Tstr_lst[1:]: > if chstr == '': > sgn = -sgn > else: > for ch in chstr: > self.index.append(i) > i += 1 > self.up_dn.append(sgn) > if sgn == -1: > self.dn_rank += 1 > else: > self.up_rank += 1 > > sgn = -1 > if syms != None: > self.add_symmetries(syms,sgns) > > def __str__(self): > global index_pool,index_index > tstr = self.base+'_' > old_up_dn = self.up_dn[0] > if old_up_dn == 1: > tstr += '_' > for i,j in zip(self.index,self.up_dn): > if j != old_up_dn: > tstr += '_' > if j == 1: > tstr += '_' > old_up_dn = j > tstr += index_pool[index_index+i-1] > index_index = 0 > return(tstr) > > def symmetries(self): > return(self.syms,self.sgns) > > def add_symmetries(self,sym_lst,sgn_lst=None): > self.syms += sym_lst > if sgn_lst == None: > sgn_lst = len(sym_lst)*[1] > self.sgns += sgn_lst > return > > def symbol(self): > Tstr = str(self) > Tsym = Symbol(Tstr) > return(Tsym) > > if __name__ == '__main__': > > g = BasicTensor('g_ij',[[2,1]]) > R = BasicTensor('R_ijk__l',[[2,1,3,4],[1,2,4,3]],[-1,-1]) > > print g,R > > print g.symmetries() > print R.symmetries() > > Output: > > g_ab R_abc__d > ([[2, 1]], [1]) > ([[2, 1, 3, 4], [1, 2, 4, 3]], [-1, -1]) -- You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sympy?hl=en.
