Я пытаюсь решить 2D PDE на большой конечно-разностной сетке. У меня есть собственная небольшая функция для выполнения операции Лапласа над этой сеткой. В настоящее время модель довольно медленная, и я пытаюсь ускорить матричные операции. Я добавил макрос @turbo
из LoopVectorization.jl, чтобы посмотреть, какая разница. Код Лапласа теперь выглядит следующим образом:
module Laplacian
using LinearAlgebra
using LoopVectorization
@inline @views function ∇²!(∇²u, u, N, h, a)
@turbo for j = 2+a:N+5-a
for i = 2+a:N+5-a
∇²u[i,j] = (u[i-1,j] + u[i+1,j] + u[i,j-1] + u[i,j+1] - 4*u[i,j])/h^2
end
end
return nothing
end
export ∇²!
end
∇²u
— предварительно выделенный массив для хранения результата, например ∇²u = zeros(N+6,N+6)
u
— это поле, к которому применяется лапласиан, например, u = rand(N+6,N+6)
N
— количество точек сетки в u (минус 6 призрачных точек в каждом измерении, например, N=400
h
— расстояние между точками сетки, например h=0.1
a
— количество ложных точек, которые нужно пропустить на краях матрицы, например a=1
К сожалению, это приводит к следующей ошибке:
ERROR: ArgumentError: invalid index: VectorizationBase.MM{2, 1, Int64}<4, 5> of type VectorizationBase.MM{2, 1, Int64}
Я не могу понять, что означает эта ошибка или в чем здесь проблема. Может кто подскажет?
Я добавил некоторые пояснения и примеры аргументов. Надеюсь, это поможет.
Я думаю, проблема в макросе
@views
. Если вы запустите@macroexpand1
на этом, вы увидите, что то, что получает@turbo
, выглядит совсем не так, как обычно ожидается.