|
79 | 79 | .. autoclass:: AxisTargetDerivative |
80 | 80 | .. autoclass:: AxisSourceDerivative |
81 | 81 | .. autoclass:: DirectionalSourceDerivative |
82 | | -.. autoclass:: DirectionalTargetDerivative |
83 | 82 |
|
84 | 83 | Transforming kernels |
85 | 84 | -------------------- |
@@ -1143,74 +1142,6 @@ def __repr__(self): |
1143 | 1142 | return f"{type(self).__name__}({self.inner_kernel!r}, {self.dir_vec_name})" |
1144 | 1143 |
|
1145 | 1144 |
|
1146 | | -class DirectionalTargetDerivative(DirectionalDerivative): |
1147 | | - directional_kind = "tgt" |
1148 | | - target_array_name = "targets" |
1149 | | - |
1150 | | - def get_code_transformer(self): |
1151 | | - from sumpy.codegen import VectorComponentRewriter |
1152 | | - vcr = VectorComponentRewriter([self.dir_vec_name]) |
1153 | | - from pymbolic.primitives import Variable |
1154 | | - via = _VectorIndexAdder(self.dir_vec_name, (Variable("itgt"),)) |
1155 | | - |
1156 | | - inner_transform = self.inner_kernel.get_code_transformer() |
1157 | | - |
1158 | | - def transform(expr): |
1159 | | - return via(vcr(inner_transform(expr))) |
1160 | | - |
1161 | | - return transform |
1162 | | - |
1163 | | - def postprocess_at_target(self, expr, bvec): |
1164 | | - from sumpy.derivative_taker import ( |
1165 | | - DifferentiatedExprDerivativeTaker, |
1166 | | - diff_derivative_coeff_dict, |
1167 | | - ) |
1168 | | - from sumpy.symbolic import make_sym_vector as make_sympy_vector |
1169 | | - dir_vec = make_sympy_vector(self.dir_vec_name, self.dim) |
1170 | | - target_vec = make_sympy_vector(self.target_array_name, self.dim) |
1171 | | - |
1172 | | - expr = self.inner_kernel.postprocess_at_target(expr, bvec) |
1173 | | - |
1174 | | - # bvec = tgt - center |
1175 | | - if not isinstance(expr, DifferentiatedExprDerivativeTaker): |
1176 | | - result = 0 |
1177 | | - for axis in range(self.dim): |
1178 | | - # Since `bvec` and `tgt` are two different symbolic variables |
1179 | | - # need to differentiate by both to get the correct answer |
1180 | | - result += (expr.diff(bvec[axis]) + expr.diff(target_vec[axis])) \ |
1181 | | - * dir_vec[axis] |
1182 | | - return result |
1183 | | - |
1184 | | - new_transformation = defaultdict(lambda: 0) |
1185 | | - for axis in range(self.dim): |
1186 | | - axis_transformation = diff_derivative_coeff_dict( |
1187 | | - expr.derivative_coeff_dict, axis, target_vec) |
1188 | | - for mi, coeff in axis_transformation.items(): |
1189 | | - new_transformation[mi] += coeff * dir_vec[axis] |
1190 | | - |
1191 | | - return DifferentiatedExprDerivativeTaker(expr.taker, |
1192 | | - dict(new_transformation)) |
1193 | | - |
1194 | | - def get_args(self): |
1195 | | - return [ |
1196 | | - KernelArgument( |
1197 | | - loopy_arg=lp.GlobalArg( |
1198 | | - self.dir_vec_name, |
1199 | | - None, |
1200 | | - shape=(self.dim, "ntargets"), |
1201 | | - offset=lp.auto |
1202 | | - ), |
1203 | | - ), |
1204 | | - *self.inner_kernel.get_args() |
1205 | | - ] |
1206 | | - |
1207 | | - def prepare_loopy_kernel(self, loopy_knl): |
1208 | | - loopy_knl = self.inner_kernel.prepare_loopy_kernel(loopy_knl) |
1209 | | - return lp.tag_array_axes(loopy_knl, self.dir_vec_name, "sep,C") |
1210 | | - |
1211 | | - mapper_method = "map_directional_target_derivative" |
1212 | | - |
1213 | | - |
1214 | 1145 | class DirectionalSourceDerivative(DirectionalDerivative): |
1215 | 1146 | directional_kind = "src" |
1216 | 1147 |
|
|
0 commit comments