annotate src/SbpOperators/readoperator.jl @ 608:8ae63e775f9d refactor/toml_operator_format

Fix another type
author Jonatan Werpers <jonatan@werpers.com>
date Sat, 05 Dec 2020 14:09:09 +0100
parents fbff4009c08a
children 7975143118e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
594
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
1 using TOML
601
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
2
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
3 export read_D2_operator
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
4 export read_stencil
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
5 export read_stencils
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
6 export read_tuple
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
7
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
8 export get_stencil
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
9 export get_stencils
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
10 export get_tuple
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
11
b05f542b2e8f Export relevant functions and move export of read_D2_operator to readoperator.jl
Jonatan Werpers <jonatan@werpers.com>
parents: 600
diff changeset
12
594
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
13 function read_D2_operator(fn; order)
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
14 operators = TOML.parsefile(fn)["order$order"]
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
15 D2 = operators["D2"]
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
16 H = operators["H"]
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
17 e = operators["e"]
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
18 d1 = operators["d1"]
249
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
19
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
20 # Create inner stencil
596
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
21 innerStencil = get_stencil(operators, "D2", "inner_stencil")
249
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
22
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
23 # Create boundary stencils
594
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
24 boundarySize = length(D2["closure_stencils"])
249
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
25 closureStencils = Vector{typeof(innerStencil)}() # TBD: is the the right way to get the correct type?
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
26
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
27 for i ∈ 1:boundarySize
596
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
28 closureStencils = (closureStencils..., get_stencil(operators, "D2", "closure_stencils", i; center=i))
249
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
29 end
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
30
596
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
31 # TODO: Get rid of the padding here. Any padding should be handled by the consturctor accepting the stencils.
594
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
32 quadratureClosure = pad_tuple(toml_string_array_to_tuple(Float64, H["closure"]), boundarySize)
596
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
33 eClosure = Stencil(pad_tuple(toml_string_array_to_tuple(Float64, e["closure"]), boundarySize), center=1)
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
34 dClosure = Stencil(pad_tuple(toml_string_array_to_tuple(Float64, d1["closure"]), boundarySize), center=1)
249
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
35
594
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
36 d2 = SbpOperators.D2(
249
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37 quadratureClosure,
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
38 innerStencil,
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
39 closureStencils,
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
40 eClosure,
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
41 dClosure,
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
42 even
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
43 )
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
44
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
45 return d2
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
46 end
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
47
597
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
48
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
49 """
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
50 read_stencil(fn, path...; [center])
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
51
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
52 Read a stencil at `path` from the file with name `fn`.
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
53 If a center is specified the given element of the stecil is set as the center.
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
54
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
55 # Examples
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
56 ```
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
57 read_stencil(sbp_operators_path()*"standard_diagonal.toml", "order2", "D2", "inner_stencil")
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
58 read_stencil(sbp_operators_path()*"standard_diagonal.toml", "order2", "d1", "closure"; center=1)
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
59 ```
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
60 """
98cd99237176 Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents: 596
diff changeset
61 read_stencil(fn, path...; center=nothing) = get_stencil(TOML.parsefile(fn), path...; center=center)
608
8ae63e775f9d Fix another type
Jonatan Werpers <jonatan@werpers.com>
parents: 603
diff changeset
62 read_stencils(fn, path...; centers) = get_stencils(TOML.parsefile(fn), path...; centers=centers)
600
dd7056869294 Fix a couple of types
Jonatan Werpers <jonatan@werpers.com>
parents: 599
diff changeset
63 read_tuple(fn, path...) = get_tuple(TOML.parsefile(fn), path...)
596
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
64
598
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
65 get_stencil(parsed_toml, path...; center=nothing) = get_stencil(parsed_toml[path[1]], path[2:end]...; center=center)
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
66 function get_stencil(parsed_toml; center=nothing)
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
67 @assert parsed_toml isa Vector{String}
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
68 stencil_weights = Float64.(parse_rational.(parsed_toml))
596
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
69
598
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
70 width = length(stencil_weights)
596
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
71
598
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
72 if isnothing(center)
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
73 center = div(width,2)+1
596
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
74 end
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
75
598
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
76 return Stencil(Tuple(stencil_weights), center=center)
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
77 end
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
78
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
79 get_stencils(parsed_toml, path...; centers) = get_stencils(parsed_toml[path[1]], path[2:end]...; centers=centers)
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
80 function get_stencils(parsed_toml; centers)
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
81 @assert parsed_toml isa Vector{Vector{String}}
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
82 @assert length(centers) == length(parsed_toml)
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
83
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
84 stencils = ()
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
85 for i ∈ 1:length(parsed_toml)
600
dd7056869294 Fix a couple of types
Jonatan Werpers <jonatan@werpers.com>
parents: 599
diff changeset
86 stencil = get_stencil(parsed_toml[i], center = centers[i])
598
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
87 stencils = (stencils..., stencil)
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
88 end
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
89
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
90 return stencils
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
91 end
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
92
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
93 get_tuple(parsed_toml, path...) = get_tuple(parsed_toml[path[1]], path[2:end]...)
602
c2239c7cd71e Fix another typo in get_tuple signature
Jonatan Werpers <jonatan@werpers.com>
parents: 601
diff changeset
94 function get_tuple(parsed_toml)
598
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
95 @assert parsed_toml isa Vector{String}
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
96 t = Tuple(Float64.(parse_rational.(parsed_toml)))
19e1b169aa9c Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents: 597
diff changeset
97 return t
596
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
98 end
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
99
a9744aa5e235 Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents: 594
diff changeset
100 # TODO: Probably should be deleted once we have gotten rid of read_D2_operator()
594
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
101 function toml_string_array_to_tuple(::Type{T}, arr::AbstractVector{String}) where T
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
102 return Tuple(T.(parse_rational.(arr)))
249
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
103 end
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
104
594
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
105 function parse_rational(str)
cc86b920531a Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents: 340
diff changeset
106 expr = Meta.parse(replace(str, "/"=>"//"))
603
fbff4009c08a Add tests for parse_rational()
Jonatan Werpers <jonatan@werpers.com>
parents: 602
diff changeset
107 return eval(:(Rational($expr)))
249
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
108 end
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
109
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
110 function pad_tuple(t::NTuple{N, T}, n::Integer) where {N,T}
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
111 if N >= n
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
112 return t
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
113 else
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
114 return pad_tuple((t..., zero(T)), n)
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
115 end
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
116 end
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
117
340
29df39a7b568 readoperator.jl: Fix path to operators
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
118 sbp_operators_path() = (@__DIR__) * "/operators/"
249
7cb4492ccd60 Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
119 export sbp_operators_path