@@ -37,10 +37,14 @@ function create_Phi(d, extrap, diff)
37
37
return lines
38
38
end
39
39
40
- function tensor_prod (symbs, inds)
40
+ function tensor_prod (symbs, inds, add_index = false )
41
41
if length (symbs)== 0
42
42
subscripts = [:($ (U (" i" ,i))+ $ (inds[i])) for i= 1 : length (inds)]
43
- return :(C[$ (subscripts... )])
43
+ if add_index
44
+ return :(C[k,$ (subscripts... )])
45
+ else
46
+ return :(C[$ (subscripts... )])
47
+ end
44
48
else
45
49
h = symbs[1 ]
46
50
if length (symbs)> 1
@@ -50,14 +54,16 @@ function tensor_prod(symbs, inds)
50
54
end
51
55
exprs = []
52
56
for i = 1 : 4
53
- e = parse ( string (h," _" ,i," *(" ,tensor_prod (q,cat (1 ,inds,[i]))," )" ) )
57
+ e = parse ( string (h," _" ,i," *(" ,tensor_prod (q,cat (1 ,inds,[i]),add_index )," )" ) )
54
58
push! (exprs,e)
55
59
end
56
60
return :(+ ($ (exprs... )))
57
61
end
58
62
end
59
63
60
- tensor_prod ([], Int64[1 ,2 ,3 ,4 ]) # C[1,2,3,4]
64
+ tensor_prod ([], Int64[1 ,2 ,3 ,4 ],) # C[i1+1,i2+2,i3+3,i4+4]
65
+ tensor_prod ([], Int64[1 ,2 ,3 ,4 ], true ) # C[k,i1+1,i2+2,i3+3,i4+4]
66
+
61
67
tensor_prod ([" Phi_1" ], Int64[]) # Phi_1_1 * C[i1 + 1] + Phi_1_2 * C[i1 + 2] + Phi_1_3 * C[i1 + 3] + Phi_1_4 * C[i1 + 4]
62
68
tensor_prod ([" Phi_1" , " Phi_2" ], Int64[]) # Phi_1_1 * (Phi_2_1 * C[i1 + 1,i2 + 1] + Phi_2_2 * C[i1 + 1,i2 + 2] + Phi_2_3 * C[i1 + 1,i2 + 3] + Phi_2_4 * C[i1 + 1,i2 + 4]) + Phi_1_2 * (Phi_2_1 * C[i1 + 2,i2 + 1] + Phi_2_2 * C[i1 + 2,i2 + 2] + Phi_2_3 * C[i1 + 2,i2 + 3] + Phi_2_4 * C[i1 + 2,i2 + 4]) + Phi_1_3 * (Phi_2_1 * C[i1 + 3,i2 + 1] + Phi_2_2 * C[i1 + 3,i2 + 2] + Phi_2_3 * C[i1 + 3,i2 + 3] + Phi_2_4 * C[i1 + 3,i2 + 4]) + Phi_1_4 * (Phi_2_1 * C[i1 + 4,i2 + 1] + Phi_2_2 * C[i1 + 4,i2 + 2] + Phi_2_3 * C[i1 + 4,i2 + 3] + Phi_2_4 * C[i1 + 4,i2 + 4])
63
69
tensor_prod ([" Phi_1" , " dPhi_2" ], Int64[]) # Phi_1_1 * (dPhi_2_1 * C[i1 + 1,i2 + 1] + dPhi_2_2 * C[i1 + 1,i2 + 2] + dPhi_2_3 * C[i1 + 1,i2 + 3] + dPhi_2_4 * C[i1 + 1,i2 + 4]) + Phi_1_2 * (dPhi_2_1 * C[i1 + 2,i2 + 1] + dPhi_2_2 * C[i1 + 2,i2 + 2] + dPhi_2_3 * C[i1 + 2,i2 + 3] + dPhi_2_4 * C[i1 + 2,i2 + 4]) + Phi_1_3 * (dPhi_2_1 * C[i1 + 3,i2 + 1] + dPhi_2_2 * C[i1 + 3,i2 + 2] + dPhi_2_3 * C[i1 + 3,i2 + 3] + dPhi_2_4 * C[i1 + 3,i2 + 4]) + Phi_1_4 * (dPhi_2_1 * C[i1 + 4,i2 + 1] + dPhi_2_2 * C[i1 + 4,i2 + 2] + dPhi_2_3 * C[i1 + 4,i2 + 3] + dPhi_2_4 * C[i1 + 4,i2 + 4])
@@ -104,13 +110,13 @@ function create_function(d,extrap="natural")
104
110
function $ (Symbol (string (" eval_UC_spline_" ,d," d" )))( a, b, orders, C, S, V, Ad, dAd)
105
111
$ (create_parameters (d)... )
106
112
N = size (S,1 )
107
- # @simd( # doesn't seem to make any difference
113
+ @fastmath @inbounds @simd ( # doesn't seem to make any difference
108
114
for n= 1 : N
109
115
$ (create_local_parameters (d)... )
110
116
$ (create_Phi (d,extrap,false )... )
111
117
V[n] = $ ( tensor_prod ([string (" Phi_" ,i) for i= 1 : d], Int64[]) )
112
118
end
113
- # )
119
+ )
114
120
end
115
121
end
116
122
return expr
@@ -131,15 +137,40 @@ function create_function_with_gradient(d,extrap="natural")
131
137
function $ (Symbol (string (" eval_UC_spline_" ,d," d" )))( a, b, orders, C, S, V, dV, Ad, dAd)
132
138
$ (create_parameters (d)... )
133
139
N = size (S,1 )
134
- # @simd( # doesn't seem to make any difference
140
+ @fastmath @inbounds @simd ( # doesn't seem to make any difference
135
141
for n= 1 : N
136
142
$ (create_local_parameters (d)... )
137
143
$ (create_Phi (d,extrap,true )... )
138
144
V[n] = $ (tensor_prod ([string (" Phi_" ,i) for i= 1 : d], Int64[]))
139
145
$ ([ :( dV[n,$ j] = $ (tensor_prod (grad_allocs[j], Int64[])) ) for j= 1 : d]. .. )
140
146
end
147
+ )
148
+ end
149
+ end
150
+ return expr
151
+ end
152
+
153
+ function create_function_multi_spline (d,extrap= " natural" )
154
+ expr = quote
155
+ function $ (Symbol (string (" eval_UC_multi_spline_" ,d," d" )))( a, b, orders, C, S, V, Ad, dAd)
156
+ K = size (C,1 )
157
+ $ (create_parameters (d)... )
158
+ N = size (S,1 )
159
+ # @fastmath @inbounds @simd( # doesn't seem to make any difference
160
+ for n= 1 : N
161
+ $ (create_local_parameters (d)... )
162
+ $ (create_Phi (d,extrap,false )... )
163
+ for k= 1 : K
164
+ V[k,n] = $ ( tensor_prod ([string (" Phi_" ,i) for i= 1 : d], Int64[], true ) )
165
+ end
166
+
167
+ end
141
168
# )
142
169
end
143
170
end
144
171
return expr
145
172
end
173
+
174
+
175
+
176
+ create_function_multi_spline (1 )
0 commit comments