350 def __init__(self, kernel, name: str =
"time_step"):
357 params.append(tensor.indexed.IndexedBase(kernel.inputs[0], real=
True))
358 for i
in range(1,len(kernel.inputs)):
359 params.append(ast.Symbol(kernel.inputs[i], real=
True))
363 for item
in self.
kernel.all_items.values():
364 if str(item)
not in kernel.inputs
and isinstance(item, tensor.indexed.IndexedBase):
366 shape.append(self.
kernel.n_patches)
367 for d
in range(self.
kernel.dim):
368 shape.append(self.
kernel.patch_size+2*self.
kernel.halo_size)
371 if str(item)
not in self.
kernel.items:
372 shape.append(self.
kernel.n_real)
377 item._shape = tuple(shape)
378 declarations.append(ast.Declaration(item))
381 for item
in (self.
kernel.directional_consts):
382 if isinstance(self.
kernel.all_items[item], ast.Symbol):
383 declarations.append(ast.Declaration(self.
kernel.all_items[item]))
385 declarations.append(ast.Declaration(ast.Symbol(self.
kernel.all_items[item], real=
True)))
389 for l,r,direction,struc
in zip(kernel.LHS,kernel.RHS,kernel.directions,kernel.struct_inclusion):
390 if str(l)
in kernel.directional_consts:
391 expr.append(ast.Assignment(l,r))
394 print(f
"> {l} = {r} {direction} {kernel.dim+1} {struc}")
395 loop = self.
looploop([l,r], direction, kernel.dim + 1, struc)
396 print(f
"loop {loop}")
400 for item
in kernel.all_items.values():
401 if str(item)
not in kernel.inputs
and isinstance(item, tensor.indexed.IndexedBase):
404 expr.append(ast.Assignment(item.args[0], ast.none))
407 fp = ast.FunctionPrototype(
None, name, params)
408 fn = ast.FunctionDefinition.from_FunctionPrototype(fp, expr)
413 def loop(self,expr,direction,below,struct_inclusion):
414 level = self.
kernel.dim + 1 - below
415 idx = self.
kernel.indexes[level]
419 r = [0,self.
kernel.n_patches]
421 k = [val
for key,val
in self.
kernel.item_struct.items()
if key
in str(expr)] + [struct_inclusion]
426 r = [0, self.
kernel.n_real]
429 elif direction == -1:
430 r = [0, self.
kernel.patch_size + 2*self.
kernel.halo_size]
431 elif direction != level
and direction >= 0:
432 r = [0, self.
kernel.patch_size + 2*self.
kernel.halo_size]
438 body = self.
looploop(expr,direction,below-1,struct_inclusion)
443 body = ast.Assignment(expr[0], expr[1])
445 return ast.For(idx, Range(r[0], r[1]), body=[ body ])