Alan,

Thanks for the reference. No, I don't own a copy of  his book but the
abstract index notation is part and parcel of doing general
relativity. This appears to be a recent treatment, but this has been
around many years. I may in fact buy his book as it seems worth taking
a look at just to see whether pedagogical utility can be mined.

I appreciate your efforts and will hopefully go further given some
time.

Comer

On May 27, 9:41 am, Alan Bromborsky <[email protected]> wrote:
> Alan Bromborsky 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])
>
> The following link looks to be a good reference on abstract index
> notation for tensors.  The problem is
> that you cannot copy the text (but maybe you have library access to the
> book) -
>
> http://books.google.com/books?id=YA8rxOn9H1sC&pg=PA56&lpg=PA56&dq=pen...

-- 
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.

Reply via email to