[fdfd] minor fixes and more tests

This commit is contained in:
Jan Petykiewicz 2026-04-17 21:34:36 -07:00
commit 87bb3af3f9
6 changed files with 392 additions and 15 deletions

View file

@ -128,6 +128,11 @@ def stretch_with_scpml(
dx_ai = dxes[0][axis].astype(complex)
dx_bi = dxes[1][axis].astype(complex)
if thickness == 0:
dxes[0][axis] = dx_ai
dxes[1][axis] = dx_bi
return dxes
pos = numpy.hstack((0, dx_ai.cumsum()))
pos_a = (pos[:-1] + pos[1:]) / 2
pos_b = pos[:-1]
@ -153,10 +158,7 @@ def stretch_with_scpml(
def l_d(x: NDArray[numpy.float64]) -> NDArray[numpy.float64]:
return (x - bound) / (pos[-1] - bound)
if thickness == 0:
slc = slice(None)
else:
slc = slice(-thickness, None)
slc = slice(-thickness, None)
dx_ai[slc] *= 1 + 1j * s_function(l_d(pos_a[slc])) / d / s_correction
dx_bi[slc] *= 1 + 1j * s_function(l_d(pos_b[slc])) / d / s_correction

View file

@ -48,9 +48,11 @@ def _scipy_qmr(
logger.info(f'Solver residual at iteration {ii} : {cur_norm}')
if 'callback' in kwargs:
callback = kwargs['callback']
def augmented_callback(xk: ArrayLike) -> None:
log_residual(xk)
kwargs['callback'](xk)
callback(xk)
kwargs['callback'] = augmented_callback
else:
@ -118,15 +120,15 @@ def generic(
Pl, Pr = operators.e_full_preconditioners(dxes)
if adjoint:
A = (Pl @ A0 @ Pr).H
b = Pr.H @ b0
A = (Pl @ A0 @ Pr).T.conjugate()
b = Pr.T.conjugate() @ b0
else:
A = Pl @ A0 @ Pr
b = Pl @ b0
if E_guess is not None:
if adjoint:
x0 = Pr.H @ E_guess
x0 = Pr.T.conjugate() @ E_guess
else:
x0 = Pl @ E_guess
matrix_solver_opts['x0'] = x0
@ -134,7 +136,7 @@ def generic(
x = matrix_solver(A.tocsr(), b, **matrix_solver_opts)
if adjoint:
x0 = Pl.H @ x
x0 = Pl.T.conjugate() @ x
else:
x0 = Pr @ x