@@ -196,59 +196,83 @@ def axis_ratio(self, xp=np):
196196
197197 def zeta_from (self , grid : aa .type .Grid2DLike , xp = np ):
198198
199- # from scipy.special import wofz
199+ from scipy .special import wofz
200200
201201 q = self .axis_ratio (xp )
202202 q2 = q ** 2.0
203- ind_pos_y = grid .array [:, 0 ] >= 0
204- shape_grid = xp .shape (grid )
205- output_grid = xp .zeros ((shape_grid [0 ]), dtype = xp .complex128 )
206- scale_factor = q / (self .sigma * xp .sqrt (2.0 * (1.0 - q2 )))
207-
208- xs_0 = grid .array [:, 1 ][ind_pos_y ] * scale_factor
209- ys_0 = grid .array [:, 0 ][ind_pos_y ] * scale_factor
210- xs_1 = grid .array [:, 1 ][~ ind_pos_y ] * scale_factor
211- ys_1 = - grid .array [:, 0 ][~ ind_pos_y ] * scale_factor
212-
213- if xp == np :
214- from scipy .special import wofz
215-
216- output_grid [ind_pos_y ] = - 1j * (
217- wofz (xs_0 + 1j * ys_0 )
218- - np .exp (- (xs_0 ** 2.0 ) * (1.0 - q2 ) - ys_0 * ys_0 * (1.0 / q2 - 1.0 ))
219- * wofz (q * xs_0 + 1j * ys_0 / q )
220- )
221-
222- output_grid [~ ind_pos_y ] = np .conj (
223- - 1j
224- * (
225- wofz (xs_1 + 1j * ys_1 )
226- - np .exp (- (xs_1 ** 2.0 ) * (1.0 - q2 ) - ys_1 * ys_1 * (1.0 / q2 - 1.0 ))
227- * wofz (q * xs_1 + 1j * ys_1 / q )
228- )
229- )
230-
231- if xp == jnp :
232-
233- output_grid [ind_pos_y ] = - 1j * (
234- self .wofz (xs_0 + 1j * ys_0 , xp = xp )
235- - xp .exp (- (xs_0 ** 2.0 ) * (1.0 - q2 ) - ys_0 * ys_0 * (1.0 / q2 - 1.0 ))
236- * self .wofz (q * xs_0 + 1j * ys_0 / q , xp = xp )
237- )
238-
239- output_grid [~ ind_pos_y ] = xp .conj (
240- - 1j
241- * (
242- self .wofz (xs_1 + 1j * ys_1 , xp = xp )
243- - xp .exp (- (xs_1 ** 2.0 ) * (1.0 - q2 ) - ys_1 * ys_1 * (1.0 / q2 - 1.0 ))
244- * self .wofz (q * xs_1 + 1j * ys_1 / q , xp = xp )
245- )
246- )
247203
248- return output_grid
204+ y = grid .array [:, 0 ]
205+ x = grid .array [:, 1 ]
206+
207+ scale = q / (self .sigma * xp .sqrt (2.0 * (1.0 - q2 )))
208+
209+ xs = x * scale
210+ ys = y * scale
211+
212+ z1 = xs + 1j * ys
213+ z2 = q * xs + 1j * ys / q
214+
215+ exp_term = xp .exp (- (xs ** 2 ) * (1.0 - q2 ) - ys ** 2 * (1.0 / q2 - 1.0 ))
216+
217+ core = - 1j * (wofz (z1 ) - exp_term * wofz (z2 ))
218+
219+ # symmetry: zeta(x, -y) = conj(zeta(x, y))
220+ return xp .where (y >= 0 , core , xp .conj (core ))
221+
222+ # q = self.axis_ratio(xp)
223+ # q2 = q ** 2.0
224+ # ind_pos_y = grid.array[:, 0] >= 0
225+ # shape_grid = xp.shape(grid)
226+ # output_grid = xp.zeros((shape_grid[0]), dtype=xp.complex128)
227+ # scale_factor = q / (self.sigma * xp.sqrt(2.0 * (1.0 - q2)))
228+ #
229+ # xs_0 = grid.array[:, 1][ind_pos_y] * scale_factor
230+ # ys_0 = grid.array[:, 0][ind_pos_y] * scale_factor
231+ # xs_1 = grid.array[:, 1][~ind_pos_y] * scale_factor
232+ # ys_1 = -grid.array[:, 0][~ind_pos_y] * scale_factor
233+ #
234+ # if xp == np:
235+ # from scipy.special import wofz
236+ #
237+ # output_grid[ind_pos_y] = -1j * (
238+ # wofz(xs_0 + 1j * ys_0)
239+ # - np.exp(-(xs_0 ** 2.0) * (1.0 - q2) - ys_0 * ys_0 * (1.0 / q2 - 1.0))
240+ # * wofz(q * xs_0 + 1j * ys_0 / q)
241+ # )
242+ #
243+ # output_grid[~ind_pos_y] = np.conj(
244+ # -1j
245+ # * (
246+ # wofz(xs_1 + 1j * ys_1)
247+ # - np.exp(-(xs_1 ** 2.0) * (1.0 - q2) - ys_1 * ys_1 * (1.0 / q2 - 1.0))
248+ # * wofz(q * xs_1 + 1j * ys_1 / q)
249+ # )
250+ # )
251+ #
252+ # if xp == jnp:
253+ # z1 = xs_0 + 1j * ys_0
254+ # z2 = q * xs_0 + 1j * ys_0 / q
255+ # output_grid[ind_pos_y] = -1j * (
256+ # xp.exp(- z1 * z1) * jsp.erfc(- 1j * z1)
257+ # - xp.exp(-(xs_0**2.0) * (1.0 - q2) - ys_0 * ys_0 * (1.0 / q2 - 1.0))
258+ # * xp.exp(- z2 * z2) * jsp.erfc(- 1j * z2)
259+ # )
260+ #
261+ # z1 = xs_1 + 1j * ys_1
262+ # z2 = q * xs_1 + 1j * ys_1 / q
263+ # output_grid[~ind_pos_y] = xp.conj(
264+ # -1j
265+ # * (
266+ # xp.exp(- z1 * z1) * jsp.erfc(- 1j * z1)
267+ # - xp.exp(-(xs_1**2.0) * (1.0 - q2) - ys_1 * ys_1 * (1.0 / q2 - 1.0))
268+ # * xp.exp(- z2 * z2) * jsp.erfc(- 1j * z2)
269+ # )
270+ # )
271+ #
272+ # return output_grid
249273
250- def wofz (self , z , xp = np ):
251- return xp .exp (- z * z ) * jsp .erfc (- 1j * z )
274+ # def wofz(self, z, xp=np):
275+ # return xp.exp(- z * z) * jsp.erfc(- 1j * z)
252276
253277 # def wofz(self, z, xp=np):
254278 # """
0 commit comments