# ПЕРЕНОС (streaming): f_i(x, t+1) = f_i(x − c_i, t). # Реализован пул-схемой через cp.roll по осям (y, x). 9 сдвигов в новый буфер. # # Заметка для ревизии: roll создаёт по ядру на направление (9 ядер). Это НЕ влияет на физику, # только на число запусков ядер. Главный способ убрать накладные расходы — CUDA-graph (см. solver.py), # а не переписывание переноса. Альтернатива (один gather-кернел по предвыч. индексам) — точка расширения. import backend as B import lattice as L xp = B.xp Q = L.Q; Cx = L.Cx; Cy = L.Cy def stream(f): fs = xp.empty_like(f) for i in range(Q): fs[i] = xp.roll(f[i], (Cy[i], Cx[i]), (0, 1)) return fs