Peano
Loading...
Searching...
No Matches
exahypype.py
Go to the documentation of this file.
1from kernel_impl import impl, Enumerator
2
3class kernel:
4 def __init__(self, patch, dim, patch_size, n_patches=1, halo_size=1, file="test.cpp",debug=False,namespace=None):
5 self.d = dim #number of dimensions
6 self.np = n_patches
7 self.p = patch_size #size of patch
8 self.h = halo_size #size of halo
9
10 self.file = file #output file destination
11 self.debug = debug #debug mode
12 self.patch = patch #target to update
13 self.code = "" #to output to file
14 self.scope = 0
15 self.pre = ""
16
17 self.names = [] #list of variable names
18 self.external_var = [] #list of external variables to be included
19 self.enums = {} #dictionary of enumerator objects
20 if namespace != None:
21 k = impl(self)
22 k.namespace(namespace)
23 self.pre = k.code
24 self.scope = k.SCOPE
25
26 def halo(self,which=[1,1,1],name=None):
27 its = [[_ for _ in range(0,self.np)]]
28 for dim in range(self.d):
29 start = self.h - which[dim]
30 if start < 0:
31 raise Exception("halo requested too large, increase halo_size")
32 end = self.p + self.h + which[dim]
33 its.append([_ for _ in range(start,end)])
34 iterators = ["patch","i","j","k"]
35 enum = Enumerator(its,iterators[:self.d+1])
36 # if name != None:
37 # k = impl(self)
38 # k.alloc(name,enum)
39 # self.code = k.code
40 # self.names.append(name)
41 # self.enums[name] = enum.RETURN()
42 return enum
43
44 def Evaluate(self, name, expression, enum=None):
45 if type(enum) == type(None):
46 enum = self.halo([self.h for _ in range(self.d)])
47 k = impl(self)
48 if name not in self.names:
49 k.alloc(name,enum)
50 self.names.append(name)
51 self.enums[name] = enum.RETURN()
52 k.loop(name,expression,self.enums,self.d)
53 self.code = k.code
54 return name
55
56 def Stencil(self, out_name, names, stencil, scale=1,var_list=[],enum=None,special=None):
57 if type(enum) == type(None):
58 enum = self.halo([0,0,0])
59 k = impl(self)
60 if out_name not in self.names:
61 k.alloc(out_name,enum)
62 self.names.append(out_name)
63 self.enums[out_name] = enum
64 k.stencil(out_name,names,stencil,scale,var_list,self.enums,self.d,special,enum)
65 self.code = k.code
66 return out_name
67
68 def include(self,file_list):
69 # string = ""
70 for item in file_list:
71 self.pre = '#include "' + item + '"\n' +self.pre
72 # self.pre = string + "\n" + self.code
73
74 def external(self,var_list):
75 for var in var_list:
76 self.external_var.append(var)
77
78 def __del__(self):
79 self.pre += f"\nvoid time_step(double* {self.patch}"
80 self.scope += 1
81 if len(self.external_var) > 0:
82 for name in self.external_var:
83 self.pre += ", " + name
84 self.pre += ")"+ " {\n"
85
86 self.code = self.pre + self.code
87 self.code += '\n'
88 for _ in range(self.scope):
89 self.code += "}"
90 self.code += "\n"
91
92 with open(self.file,'w') as FOUT:
93 FOUT.write(self.code)
94
95
Evaluate(self, name, expression, enum=None)
Definition exahypype.py:44
external(self, var_list)
Definition exahypype.py:74
__init__(self, patch, dim, patch_size, n_patches=1, halo_size=1, file="test.cpp", debug=False, namespace=None)
Definition exahypype.py:4
include(self, file_list)
Definition exahypype.py:68
halo(self, which=[1, 1, 1], name=None)
Definition exahypype.py:26
Stencil(self, out_name, names, stencil, scale=1, var_list=[], enum=None, special=None)
Definition exahypype.py:56