@@ -16,7 +16,7 @@ def __init__(self, parser):
16
16
17
17
def generate (self , LHS , RHS , impsum = True ):
18
18
# perform implied summation on indexed expression
19
- LHS_RHS , dimension = self .expand_summation (LHS , RHS , impsum )
19
+ LHS_RHS , dimension , suffix = self .expand_summation (LHS , RHS , impsum )
20
20
if self ._property ['debug' ]:
21
21
lineno = '[%d]' % self ._property ['debug' ]
22
22
print ('%s Python' % (len (lineno ) * ' ' ))
@@ -37,7 +37,7 @@ def generate(self, LHS, RHS, impsum=True):
37
37
except IndexError :
38
38
raise GeneratorError ('index out of range; change loop/summation range' )
39
39
40
- return global_env , dimension
40
+ return global_env , dimension , suffix
41
41
42
42
def expand_summation (self , LHS , RHS , impsum = True ):
43
43
tree , indexing = ExprTree (LHS ), []
@@ -75,10 +75,11 @@ def expand_summation(self, LHS, RHS, impsum=True):
75
75
subexpr = subtree .expr
76
76
if subexpr .func == Function ('Tensor' ):
77
77
symbol = str (subexpr .args [0 ])
78
- dimension = self ._namespace [symbol ].dimension
79
78
for index in subexpr .args [1 :]:
80
79
if str (index ) in self ._property ['index' ]:
81
80
dimension = self ._property ['index' ][str (index )]
81
+ else :
82
+ dimension = self ._namespace [symbol ].dimension
82
83
if str (index ) in index_range and dimension != index_range [str (index )]:
83
84
raise GeneratorError ('inconsistent loop/summation range for index \' %s\' ' % index )
84
85
index_range [str (index )] = dimension
@@ -94,10 +95,11 @@ def expand_summation(self, LHS, RHS, impsum=True):
94
95
argument = subexpr .args [0 ]
95
96
derivative = 'diff(' + srepr (argument )
96
97
symbol = str (argument .args [0 ])
97
- dimension = self ._namespace [symbol ].dimension
98
98
for index , order in subexpr .args [1 :]:
99
99
if str (index ) in self ._property ['index' ]:
100
100
dimension = self ._property ['index' ][str (index )]
101
+ else :
102
+ dimension = self ._namespace [symbol ].dimension
101
103
if str (index ) in index_range and dimension != index_range [str (index )]:
102
104
raise GeneratorError ('inconsistent loop/summation range for index \' %s\' ' % index )
103
105
index_range [str (index )] = dimension
@@ -160,11 +162,16 @@ def expand_summation(self, LHS, RHS, impsum=True):
160
162
dimension_LHS = index_range [index ]
161
163
162
164
# shift tensor indexing forward whenever dimension > upper bound
165
+ # and infer derivative suffix of LHS tensor from RHS tensors
166
+ suffix_LHS = None
163
167
for subtree in tree .preorder ():
164
168
subexpr = subtree .expr
165
169
if subexpr .func == Function ('Tensor' ):
166
170
symbol = str (subexpr .args [0 ])
167
171
dimension = self ._namespace [symbol ].dimension
172
+ suffix = self ._namespace [symbol ].suffix
173
+ if suffix is not None :
174
+ suffix_LHS = self ._property ['suffix' ]
168
175
tensor = IndexedSymbol (subexpr , dimension )
169
176
indexing = IndexedSymbol .indexing (subexpr )
170
177
for index in subexpr .args [1 :]:
@@ -177,7 +184,7 @@ def expand_summation(self, LHS, RHS, impsum=True):
177
184
indexing [i ] = ('%s + %s' % (idx , shift ), pos )
178
185
equation [- 1 ] = equation [- 1 ].replace (tensor .array_format (subexpr ), tensor .array_format (indexing ))
179
186
180
- return ' = ' .join (equation ), dimension_LHS
187
+ return ' = ' .join (equation ), dimension_LHS , suffix_LHS
181
188
182
189
@staticmethod
183
190
def separate_indexing (indexing , symbol_LHS , impsum = True ):
@@ -213,39 +220,21 @@ def generate_metric(symbol, dimension, suffix):
213
220
r'\epsilon_{' + ' ' .join ('j_' + str (i ) for i in range (1 , 1 + dimension )) + '} '
214
221
det_latex = prefix + ' ' .join (r'\mathrm{{{symbol}}}^{{i_{n} j_{n}}}' .format (symbol = symbol [:- 2 ], n = i ) for i in range (1 , 1 + dimension ))
215
222
inv_latex = prefix + ' ' .join (r'\mathrm{{{symbol}}}^{{i_{n} j_{n}}}' .format (symbol = symbol [:- 2 ], n = i ) for i in range (2 , 1 + dimension ))
216
- if suffix :
217
- latex_config += r"% declare {symbol}det {inv_symbol} --dim {dimension} --suffix {suffix}" \
218
- .format (suffix = suffix , symbol = symbol [:- 2 ], inv_symbol = symbol .replace ('U' , 'D' ), dimension = dimension )
219
- else :
220
- latex_config += r"% declare {symbol}det --dim {dimension}" .format (symbol = symbol [:- 2 ], dimension = dimension )
223
+ latex_config += r"% declare {symbol}det --dim {dimension}" .format (symbol = symbol [:- 2 ], dimension = dimension )
221
224
latex_config += r"""
222
225
\mathrm{{{symbol}det}} = \frac{{1}}{{({dimension})({factorial})}} {det_latex} \\
223
226
\mathrm{{{symbol}}}_{{i_1 j_1}} = \frac{{1}}{{{factorial}}} \mathrm{{{symbol}det}}^{{{{-1}}}} ({inv_latex}) \\""" \
224
- .format (symbol = symbol [:- 2 ], inv_symbol = symbol .replace ('U' , 'D' ), dimension = dimension ,
225
- factorial = math .factorial (dimension - 1 ), det_latex = det_latex , inv_latex = inv_latex )
226
- # latex_config += '\n' + r"% assign {symbol}det --dim {dimension}".format(symbol=symbol[:-2], dimension=dimension)
227
- # if suffix:
228
- # latex_config += '\n' + r"% assign {symbol}det {inv_symbol} --suffix {suffix}" \
229
- # .format(suffix=suffix, symbol=symbol[:-2], inv_symbol=symbol.replace('U', 'D'))
227
+ .format (symbol = symbol [:- 2 ], dimension = dimension , factorial = math .factorial (dimension - 1 ), det_latex = det_latex , inv_latex = inv_latex )
230
228
else :
231
229
prefix = r'\epsilon^{' + ' ' .join ('i_' + str (i ) for i in range (1 , 1 + dimension )) + '} ' + \
232
230
r'\epsilon^{' + ' ' .join ('j_' + str (i ) for i in range (1 , 1 + dimension )) + '} '
233
231
det_latex = prefix + ' ' .join (r'\mathrm{{{symbol}}}_{{i_{n} j_{n}}}' .format (symbol = symbol [:- 2 ], n = i ) for i in range (1 , 1 + dimension ))
234
232
inv_latex = prefix + ' ' .join (r'\mathrm{{{symbol}}}_{{i_{n} j_{n}}}' .format (symbol = symbol [:- 2 ], n = i ) for i in range (2 , 1 + dimension ))
235
- if suffix :
236
- latex_config += r"% declare {symbol}det {inv_symbol} --dim {dimension} --suffix {suffix}" \
237
- .format (suffix = suffix , symbol = symbol [:- 2 ], inv_symbol = symbol .replace ('D' , 'U' ), dimension = dimension )
238
- else :
239
- latex_config += r"% declare {symbol}det --dim {dimension}" .format (symbol = symbol [:- 2 ], dimension = dimension )
233
+ latex_config += r"% declare {symbol}det --dim {dimension}" .format (symbol = symbol [:- 2 ], dimension = dimension )
240
234
latex_config += r"""
241
235
\mathrm{{{symbol}det}} = \frac{{1}}{{({dimension})({factorial})}} {det_latex} \\
242
236
\mathrm{{{symbol}}}^{{i_1 j_1}} = \frac{{1}}{{{factorial}}} \mathrm{{{symbol}det}}^{{{{-1}}}} ({inv_latex}) \\""" \
243
- .format (symbol = symbol [:- 2 ], inv_symbol = symbol .replace ('D' , 'U' ), dimension = dimension ,
244
- factorial = math .factorial (dimension - 1 ), det_latex = det_latex , inv_latex = inv_latex )
245
- # latex_config += '\n' + r"% assign {symbol}det --dim {dimension}".format(symbol=symbol[:-2], dimension=dimension)
246
- # if suffix:
247
- # latex_config += '\n' + r"% assign {symbol}det {inv_symbol} --suffix {suffix}" \
248
- # .format(suffix=suffix, symbol=symbol[:-2], inv_symbol=symbol.replace('D', 'U'))
237
+ .format (symbol = symbol [:- 2 ], dimension = dimension , factorial = math .factorial (dimension - 1 ), det_latex = det_latex , inv_latex = inv_latex )
249
238
return latex_config
250
239
251
240
@staticmethod
@@ -288,10 +277,7 @@ def generate_covdrv(function, covdrv_index, symbol=None, diacritic=None, dimensi
288
277
RHS += '^{%s}_{%s %s} (%s)' % (index , bound_index , covdrv_index , latex )
289
278
else :
290
279
RHS += '^{%s}_{%s %s} (%s)' % (bound_index , index , covdrv_index , latex )
291
- config = ('% declare ' + symbol + ' --dim %d --suffix dD\n ' % dimension ) if symbol else ''
292
- return config + LHS + ' = ' + RHS
293
- # config = (' % assign ' + symbol + ' --suffix dD\n') if symbol else ''
294
- # return LHS + ' = ' + RHS + config
280
+ return LHS + ' = ' + RHS
295
281
296
282
@staticmethod
297
283
def generate_liedrv (function , vector , weight = None ):
0 commit comments