Mercurial > repos > public > sbplib_julia
annotate diffOp.jl @ 49:947f7579ba9c
Add Laplace2d
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Fri, 11 Jan 2019 11:16:37 +0100 |
parents | be53b58581a6 |
children | 4300a3fbd818 |
rev | line source |
---|---|
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
1 abstract type DiffOp end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
2 |
33
e8d7137b3f07
Raname apply(DiffOp) to apply!(DiffOp)
Jonatan Werpers <jonatan@werpers.com>
parents:
31
diff
changeset
|
3 function apply!(D::DiffOp, u::AbstractVector, v::AbstractVector) |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
4 error("not implemented") |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
5 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
6 |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
7 function innerProduct(D::DiffOp, u::AbstractVector, v::AbstractVector)::Real |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
8 error("not implemented") |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
9 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
10 |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
11 function matrixRepresentation(D::DiffOp) |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
12 error("not implemented") |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
13 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
14 |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
15 function boundaryCondition(D::DiffOp) |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
16 error("not implemented") |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
17 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
18 |
17
10a5e7c77fb8
Fix reference to grid.BooundaryId
Jonatan Werpers <jonatan@werpers.com>
parents:
9
diff
changeset
|
19 function interface(Du::DiffOp, Dv::DiffOp, b::grid.BoundaryId; type) |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
20 error("not implemented") |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
21 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
22 |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
23 |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
24 # Differential operator for a*d^2/dx^2 |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
25 struct Laplace1D <: DiffOp |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
26 grid |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
27 a |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
28 op |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
29 end |
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
30 |
6
cb8e50ca9e15
Add attempt att apply methods for Laplace
Jonatan Werpers <jonatan@werpers.com>
parents:
2
diff
changeset
|
31 # u = L*v |
31
f2842e08d813
Change name to apply to show that it is mutating
Jonatan Werpers <jonatan@werpers.com>
parents:
17
diff
changeset
|
32 function apply!(L::Laplace1D, u::AbstractVector, v::AbstractVector) |
43
ef060ab3b035
remove stride and remove some bugs
Ylva Rydin <ylva.rydin@telia.com>
parents:
34
diff
changeset
|
33 h = grid.spacings(L.grid)[1] |
ef060ab3b035
remove stride and remove some bugs
Ylva Rydin <ylva.rydin@telia.com>
parents:
34
diff
changeset
|
34 apply!(L.op, u, v, h) |
48
be53b58581a6
Fix bug with call by reference in Laplace1D apply
Jonatan Werpers <jonatan@werpers.com>
parents:
43
diff
changeset
|
35 u .= L.a * u |
9
aafc4bdbe675
Add h in stencil application
Jonatan Werpers <jonatan@werpers.com>
parents:
8
diff
changeset
|
36 return nothing |
2
43be32298ae2
Add function to get closure size
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
37 end |
49 | 38 |
39 | |
40 # Differential operator for a*d^2/dx^2 + a*d^2/dy^2 | |
41 struct Laplace2D <: DiffOp | |
42 grid | |
43 a | |
44 op | |
45 end | |
46 | |
47 # u = L*v | |
48 function apply!(L::Laplace2D, u::AbstractVector, v::AbstractVector) | |
49 u .= 0*u | |
50 h = grid.spacings(L.grid) | |
51 | |
52 li = LinearIndices(L.grid.numberOfPointsPerDim) | |
53 n_x, n_y = L.grid.numberOfPointsPerDim | |
54 | |
55 | |
56 # For each x | |
57 temp = zeros(eltype(u), n_y) | |
58 for i ∈ 1:n_x | |
59 | |
60 v_i = view(v, li[i,:]) | |
61 apply!(L.op, temp, v_i, h[2]) | |
62 | |
63 u[li[i,:]] += temp | |
64 end | |
65 | |
66 # For each y | |
67 temp = zeros(eltype(u), n_x) | |
68 for i ∈ 1:n_y | |
69 v_i = view(v, li[:,i]) | |
70 apply!(L.op, temp, v_i, h[1]) | |
71 | |
72 u[li[:,i]] += temp | |
73 end | |
74 | |
75 u .= L.a*u | |
76 | |
77 return nothing | |
78 end |