Mercurial > repos > public > sbplib_julia
annotate src/SbpOperators/readoperator.jl @ 600:dd7056869294 refactor/toml_operator_format
Fix a couple of types
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Sat, 05 Dec 2020 12:59:14 +0100 |
parents | a21fe9b6e5b6 |
children | b05f542b2e8f |
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 |
cc86b920531a
Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents:
340
diff
changeset
|
2 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
|
3 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
|
4 D2 = operators["D2"] |
cc86b920531a
Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents:
340
diff
changeset
|
5 H = operators["H"] |
cc86b920531a
Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents:
340
diff
changeset
|
6 e = operators["e"] |
cc86b920531a
Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents:
340
diff
changeset
|
7 d1 = operators["d1"] |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
8 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
9 # Create inner stencil |
596
a9744aa5e235
Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents:
594
diff
changeset
|
10 innerStencil = get_stencil(operators, "D2", "inner_stencil") |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
11 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
12 # Create boundary stencils |
594
cc86b920531a
Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents:
340
diff
changeset
|
13 boundarySize = length(D2["closure_stencils"]) |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
14 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
|
15 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
16 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
|
17 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
|
18 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
19 |
596
a9744aa5e235
Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents:
594
diff
changeset
|
20 # 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
|
21 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
|
22 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
|
23 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
|
24 |
594
cc86b920531a
Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents:
340
diff
changeset
|
25 d2 = SbpOperators.D2( |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
26 quadratureClosure, |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
27 innerStencil, |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
28 closureStencils, |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
29 eClosure, |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
30 dClosure, |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
31 even |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
32 ) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
33 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
34 return d2 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
35 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
36 |
597
98cd99237176
Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents:
596
diff
changeset
|
37 |
98cd99237176
Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents:
596
diff
changeset
|
38 """ |
98cd99237176
Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents:
596
diff
changeset
|
39 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
|
40 |
98cd99237176
Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents:
596
diff
changeset
|
41 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
|
42 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
|
43 |
98cd99237176
Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents:
596
diff
changeset
|
44 # Examples |
98cd99237176
Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents:
596
diff
changeset
|
45 ``` |
98cd99237176
Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents:
596
diff
changeset
|
46 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
|
47 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
|
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=nothing) = get_stencil(TOML.parsefile(fn), path...; center=center) |
600
dd7056869294
Fix a couple of types
Jonatan Werpers <jonatan@werpers.com>
parents:
599
diff
changeset
|
51 read_stencils(fn, path...; centers=nothing) = get_stencils(TOML.parsefile(fn), path...; centers=centers) |
dd7056869294
Fix a couple of types
Jonatan Werpers <jonatan@werpers.com>
parents:
599
diff
changeset
|
52 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
|
53 |
598
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
54 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
|
55 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
|
56 @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
|
57 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
|
58 |
598
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
59 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
|
60 |
598
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
61 if isnothing(center) |
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
62 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
|
63 end |
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 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
|
66 end |
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
67 |
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
68 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
|
69 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
|
70 @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
|
71 @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
|
72 |
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
73 stencils = () |
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
74 for i ∈ 1:length(parsed_toml) |
600
dd7056869294
Fix a couple of types
Jonatan Werpers <jonatan@werpers.com>
parents:
599
diff
changeset
|
75 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
|
76 stencils = (stencils..., stencil) |
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 return stencils |
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
80 end |
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
81 |
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
82 get_tuple(parsed_toml, path...) = get_tuple(parsed_toml[path[1]], path[2:end]...) |
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
83 function get_tuple(parsed_toml, path...) |
19e1b169aa9c
Add funcitons for reading several stecils or reading tuples
Jonatan Werpers <jonatan@werpers.com>
parents:
597
diff
changeset
|
84 @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
|
85 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
|
86 return t |
596
a9744aa5e235
Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents:
594
diff
changeset
|
87 end |
a9744aa5e235
Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents:
594
diff
changeset
|
88 |
a9744aa5e235
Simplify read_D2_operator by introducing a get_stencil function
Jonatan Werpers <jonatan@werpers.com>
parents:
594
diff
changeset
|
89 # 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
|
90 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
|
91 return Tuple(T.(parse_rational.(arr))) |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
92 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
93 |
594
cc86b920531a
Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents:
340
diff
changeset
|
94 function parse_rational(str) |
cc86b920531a
Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents:
340
diff
changeset
|
95 expr = Meta.parse(replace(str, "/"=>"//")) |
599
a21fe9b6e5b6
Remove cast to Rational
Jonatan Werpers <jonatan@werpers.com>
parents:
598
diff
changeset
|
96 return eval(expr) |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
97 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
98 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
99 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
|
100 if N >= n |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
101 return t |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
102 else |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
103 return pad_tuple((t..., zero(T)), n) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
104 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
105 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
106 |
340
29df39a7b568
readoperator.jl: Fix path to operators
Jonatan Werpers <jonatan@werpers.com>
parents:
333
diff
changeset
|
107 sbp_operators_path() = (@__DIR__) * "/operators/" |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
108 export sbp_operators_path |