-
Notifications
You must be signed in to change notification settings - Fork 4
/
Identity.jl
105 lines (76 loc) · 2.09 KB
/
Identity.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# ------------------------------------------------------------------------------
# No preconditioner
# ------------------------------------------------------------------------------
"""
```julia
IdentityPC()
```
Identity preconditioner to investigate multigrid without smoother
# Returns:
- identity preconditioner object
# Example:
```jldoctest
# setup
mesh = Mesh2D(1.0, 1.0);
mass = GalleryOperator("mass", 4, 4, mesh);
# preconditioner
identity = IdentityPC(mass);
# verify
println(identity)
# output
identity preconditioner
```
"""
struct IdentityPC <: AbstractPreconditioner
# data never changes
operator::Operator
# inner constructor
IdentityPC(operator) = new(operator)
end
# printing
# COV_EXCL_START
Base.show(io::IO, _::IdentityPC) = print(io, "identity preconditioner")
# COV_EXCL_STOP
# COV_EXCL_START
function Base.setproperty!(preconditioner::IdentityPC, f::Symbol, value)
if f == :operator
throw(ReadOnlyMemoryError())
else
return setfield!(preconditioner, f, value)
end
end
# COV_EXCL_STOP
# ------------------------------------------------------------------------------
# compute symbols
# ------------------------------------------------------------------------------
"""
```julia
computesymbols(identity, ω, θ)
```
Compute or retrieve the symbol matrix for a identity preconditioned operator
# Arguments:
- `identity::IdentityPC`: Identity preconditioner to compute symbol matrix for
- `ω::Array`: smoothing weighting factor array
- `θ::Array`: Fourier mode frequency array (one frequency per dimension)
# Returns:
- symbol matrix for the identity preconditioner (I)
# Example:
```jldoctest
using LinearAlgebra
# setup
mesh = Mesh2D(1.0, 1.0);
mass = GalleryOperator("mass", 4, 4, mesh);
# preconditioner
identity = IdentityPC(mass);
# compute symbols
A = computesymbols(identity, [], []);
# verify
@assert A ≈ I
# output
```
"""
function computesymbols(_::IdentityPC, _::Array, _::Array)
# return
return I
end
# ------------------------------------------------------------------------------