Skip to content

Curvature¤

r2_coords

abcdlux_patch.r2_coords(spec_in) ¤

Source code in abcdlux_patch.py
151
152
153
def r2_coords(spec_in: Array | tuple) -> Array:
    x, y = unpack_coord_spec(spec_in)
    return (y**2)[:, None] + (x**2)[None, :]
quad_phase

abcdlux_patch.quad_phase(coords, lam, curv) ¤

Source code in abcdlux_patch.py
156
157
def quad_phase(coords: Array | tuple, lam: float, curv: float | Array) -> Array:
    return np.exp(1j * np.pi * curv * r2_coords(coords) / lam)
apply_curv

abcdlux_patch.apply_curv(u, coords, lam, curv) ¤

Source code in abcdlux_patch.py
160
161
162
163
def apply_curv(
    u: Array, coords: Array | tuple, lam: float, curv: float | Array
) -> Array:
    return u * quad_phase(coords, lam, curv)
remove_curv

abcdlux_patch.remove_curv(u, coords, lam, curv) ¤

Source code in abcdlux_patch.py
166
167
168
169
def remove_curv(
    u: Array, coords: Array | tuple, lam: float, curv: float | Array
) -> Array:
    return u * quad_phase(coords, lam, curv).conj()
propagate_curv

abcdlux_patch.propagate_curv(ABCD, curv_in) ¤

Source code in abcdlux_patch.py
172
173
174
def propagate_curv(ABCD: Array, curv_in: float | Array) -> Array:
    a, b, c, d = ABCD.flatten()
    return (c + d * curv_in) / (a + b * curv_in)
residual_abcd

abcdlux_patch.residual_abcd(ABCD, curv_in, curv_out) ¤

Source code in abcdlux_patch.py
177
178
179
180
181
182
def residual_abcd(ABCD: Array, curv_in: float, curv_out: float) -> Array:
    a, b, c, d = ABCD.flatten()
    a_res = a + b * curv_in
    d_res = d - b * curv_out
    c_res = (a_res * d_res - 1.0) / b
    return np.array([[a_res, b], [c_res, d_res]])
residual_curv_cancel

abcdlux_patch.residual_curv_cancel(ABCD) ¤

Source code in abcdlux_patch.py
185
186
187
188
189
def residual_curv_cancel(ABCD: Array):
    a, b, c, d = ABCD.flatten()
    curv_in = -a / b
    curv_out = d / b
    return curv_in, curv_out
factorise_curv

abcdlux_patch.factorise_curv(ABCD, curv_in, curv_out, mode='physical') ¤

Source code in abcdlux_patch.py
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
def factorise_curv(
    ABCD: Array,
    curv_in: float | Array | None,
    curv_out: float | Array | None,
    mode: str = "physical",
) -> tuple[Array, float | Array, float | Array]:
    if mode == "physical":
        if curv_in is None:
            curv_in = 0.0
        if curv_out is None:
            curv_out = propagate_curv(ABCD, curv_in)
    elif mode == "cancel":
        curv_in, curv_out = residual_curv_cancel(ABCD)
    elif mode == "manual":
        if curv_in is None or curv_out is None:
            raise ValueError("mode='manual' requires curv_in and curv_out.")
    else:
        raise ValueError(f"Unknown mode '{mode}'")

    ABCD_res = residual_abcd(ABCD, curv_in, curv_out)
    return ABCD_res, curv_in, curv_out