@@ -305,6 +305,21 @@ def dot_orthogonal(V1, V2, g=None):
305305 raise ValueError ('In dot_orthogonal dimension of metric ' +
306306 'must equal dimension of vector' )
307307
308+ def _build_metric_element (self , s , i1 , i2 ):
309+ """ Build an element for the metric of `bases[i1] . basis[i2]` """
310+ if s == '#' :
311+ if i1 <= i2 : # for default element ensure symmetry
312+ return Symbol ('(' + str (self .basis [i1 ]) +
313+ '.' + str (self .basis [i2 ]) + ')' , real = True )
314+ else :
315+ return Symbol ('(' + str (self .basis [i2 ]) +
316+ '.' + str (self .basis [i1 ]) + ')' , real = True )
317+ elif '/' in s : # element is fraction
318+ num , dem = s .split ('/' )
319+ return Rational (num , dem )
320+ else : # element is integer
321+ return Rational (s )
322+
308323 def metric_symbols_list (self , s = None ): # input metric tensor as string
309324 """
310325 rows of metric tensor are separated by "," and elements
@@ -325,16 +340,8 @@ def metric_symbols_list(self, s=None): # input metric tensor as string
325340 if n_rows == 1 : # orthogonal metric
326341 m_lst = s .split (' ' )
327342 m = []
328- for (s , base ) in zip (m_lst , self .basis ):
329- if s == '#' :
330- s_symbol = Symbol ('(' + str (base ) + '.' + str (base ) + ')' , real = True )
331- else :
332- if '/' in s :
333- [num , dem ] = s .split ('/' )
334- s_symbol = Rational (num , dem )
335- else :
336- s_symbol = Rational (s )
337- m .append (s_symbol )
343+ for i , s in enumerate (m_lst ):
344+ m .append (self ._build_metric_element (s , i , i ))
338345
339346 if len (m ) != self .n :
340347 raise ValueError ('Input metric "' + s + '" has' +
@@ -360,23 +367,10 @@ def metric_symbols_list(self, s=None): # input metric tensor as string
360367 if n != self .n :
361368 raise ValueError ('Input metric "' + s + '" has' +
362369 ' different rank than bases "' + str (self .basis ) + '"' )
363- n_range = list (range (n ))
364- for (row , i1 ) in zip (m_lst , n_range ):
370+ for i1 , row in enumerate (m_lst ):
365371 row_symbols = []
366- for (s , i2 ) in zip (row , n_range ):
367- if s == '#' :
368- if i1 <= i2 : # for default elment insure symmetry
369- row_symbols .append (Symbol ('(' + str (self .basis [i1 ]) +
370- '.' + str (self .basis [i2 ]) + ')' , real = True ))
371- else :
372- row_symbols .append (Symbol ('(' + str (self .basis [i2 ]) +
373- '.' + str (self .basis [i1 ]) + ')' , real = True ))
374- else :
375- if '/' in s : # element is fraction
376- [num , dem ] = s .split ('/' )
377- row_symbols .append (Rational (num , dem ))
378- else : # element is integer
379- row_symbols .append (Rational (s ))
372+ for i2 , s in enumerate (row ):
373+ row_symbols .append (self ._build_metric_element (s , i1 , i2 ))
380374 m .append (row_symbols )
381375 m = Matrix (m )
382376 return m
0 commit comments