changeset 49:947f7579ba9c

Add Laplace2d
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 11 Jan 2019 11:16:37 +0100
parents be53b58581a6
children 2a7d0ed7ac10
files diffOp.jl
diffstat 1 files changed, 41 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/diffOp.jl	Fri Jan 11 11:16:22 2019 +0100
+++ b/diffOp.jl	Fri Jan 11 11:16:37 2019 +0100
@@ -35,3 +35,44 @@
     u .= L.a * u
     return nothing
 end
+
+
+# Differential operator for a*d^2/dx^2 + a*d^2/dy^2
+struct Laplace2D <: DiffOp
+    grid
+    a
+    op
+end
+
+# u = L*v
+function apply!(L::Laplace2D, u::AbstractVector, v::AbstractVector)
+    u .= 0*u
+    h = grid.spacings(L.grid)
+
+    li = LinearIndices(L.grid.numberOfPointsPerDim)
+    n_x, n_y = L.grid.numberOfPointsPerDim
+
+
+    # For each x
+    temp = zeros(eltype(u), n_y)
+    for i ∈ 1:n_x
+
+        v_i = view(v, li[i,:])
+        apply!(L.op, temp, v_i, h[2])
+
+        u[li[i,:]] += temp
+    end
+
+    # For each y
+    temp = zeros(eltype(u), n_x)
+    for i ∈ 1:n_y
+        v_i = view(v, li[:,i])
+        apply!(L.op, temp, v_i, h[1])
+
+        u[li[:,i]] += temp
+    end
+
+    u .= L.a*u
+
+    return nothing
+end