Mercurial > repos > public > sbplib_julia
annotate src/SbpOperators/readoperator.jl @ 792:26bf5b2b3e32 operator_storage_array_of_table
Comment on naming and add suggestion for restructure of check_stencil_toml
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Thu, 22 Jul 2021 14:26:34 +0200 |
parents | 7669c1e3a9a4 |
children | 04e549669b10 |
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 |
764
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
3 export read_stencil_set |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
4 export get_stencil_set |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
5 |
766 | 6 export parse_stencil |
782
f6e56d5dbc17
Export parse_rational
Jonatan Werpers <jonatan@werpers.com>
parents:
771
diff
changeset
|
7 export parse_rational |
766 | 8 |
768
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
9 # The read_stencil_set and get_stencil_set functions return the freshly parsed |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
10 # toml. The generic code in these functions can't be expected to know anyhting |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
11 # about how to read different stencil sets as they may contain many different |
791 | 12 # kinds of stencils. We should how ever add read_ and get_ functions for all |
768
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
13 # the types of stencils we know about. |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
14 # |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
15 # After getting a stencil set the user can use parse functions to parse what |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
16 # they want from the TOML dict. I.e no more "paths". |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
17 # Functions needed: |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
18 # * parse stencil |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
19 # * parse rational |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
20 # |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
21 # maybe there is a better name than parse? |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
22 # Would be nice to be able to control the type in the stencil |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
23 |
768
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
24 # TODO: Control type for the stencil |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
25 # TODO: Think about naming and terminology around freshly parsed TOML. |
792
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
26 # Vidar: What about get_stencil instead of parse_stencil for an already parsed |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
27 # toml. It matches get_stencil_set. |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
28 |
655
ec7490fb4404
Start sketching the toml format and needed functions
Jonatan Werpers <jonatan@werpers.com>
parents:
637
diff
changeset
|
29 """ |
767
210d3f58bd56
Make signature of read_stencil_set conform to signature of get_stencil_set
Jonatan Werpers <jonatan@werpers.com>
parents:
766
diff
changeset
|
30 read_stencil_set(fn; filters) |
655
ec7490fb4404
Start sketching the toml format and needed functions
Jonatan Werpers <jonatan@werpers.com>
parents:
637
diff
changeset
|
31 |
ec7490fb4404
Start sketching the toml format and needed functions
Jonatan Werpers <jonatan@werpers.com>
parents:
637
diff
changeset
|
32 Picks out a stencil set from the given toml file based on some filters. |
ec7490fb4404
Start sketching the toml format and needed functions
Jonatan Werpers <jonatan@werpers.com>
parents:
637
diff
changeset
|
33 If more than one set matches the filters an error is raised. |
ec7490fb4404
Start sketching the toml format and needed functions
Jonatan Werpers <jonatan@werpers.com>
parents:
637
diff
changeset
|
34 |
764
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
35 The stencil set is not parsed beyond the inital toml parse. To get usable |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
36 stencils use the `parse_stencil` functions on the fields of the stencil set. |
655
ec7490fb4404
Start sketching the toml format and needed functions
Jonatan Werpers <jonatan@werpers.com>
parents:
637
diff
changeset
|
37 """ |
771
d0c1d0b4da52
Fix type in call to get_stencil_set
Jonatan Werpers <jonatan@werpers.com>
parents:
768
diff
changeset
|
38 read_stencil_set(fn; filters...) = get_stencil_set(TOML.parsefile(fn); filters...) |
655
ec7490fb4404
Start sketching the toml format and needed functions
Jonatan Werpers <jonatan@werpers.com>
parents:
637
diff
changeset
|
39 |
764
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
40 """ |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
41 get_stencil_set(parsed_toml; filters...) |
655
ec7490fb4404
Start sketching the toml format and needed functions
Jonatan Werpers <jonatan@werpers.com>
parents:
637
diff
changeset
|
42 |
764
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
43 Same as `read_stencil_set` but works on already parsed TOML. |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
44 """ |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
45 function get_stencil_set(parsed_toml; filters...) |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
46 matches = findall(parsed_toml["stencil_set"]) do set |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
47 for (key, val) ∈ filters |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
48 if set[string(key)] != val |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
49 return false |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
50 end |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
51 end |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
52 |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
53 return true |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
54 end |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
55 |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
56 if length(matches) != 1 |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
57 throw(ArgumentError("filters must pick out a single stencil set")) |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
58 end |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
59 |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
60 i = matches[1] |
d34b515b0ae7
Add functions for reading stencil sets
Jonatan Werpers <jonatan@werpers.com>
parents:
655
diff
changeset
|
61 return parsed_toml["stencil_set"][i] |
655
ec7490fb4404
Start sketching the toml format and needed functions
Jonatan Werpers <jonatan@werpers.com>
parents:
637
diff
changeset
|
62 end |
597
98cd99237176
Add a function for reading a stencil directly from the a file
Jonatan Werpers <jonatan@werpers.com>
parents:
596
diff
changeset
|
63 |
768
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
64 """ |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
65 parse_stencil(toml) |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
66 |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
67 Accepts parsed toml and reads it as a stencil |
7c87a33963c5
Add some notes, delete functions that won't be needed
Jonatan Werpers <jonatan@werpers.com>
parents:
767
diff
changeset
|
68 """ |
766 | 69 function parse_stencil(toml) |
70 check_stencil_toml(toml) | |
71 | |
72 if toml isa Array | |
73 weights = Float64.(parse_rational.(toml)) | |
74 return CenteredStencil(weights...) | |
75 end | |
76 | |
77 weights = Float64.(parse_rational.(toml["s"])) | |
78 return Stencil(weights..., center = toml["c"]) | |
79 end | |
80 | |
792
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
81 # TBD Vidar: |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
82 # I suggest the following restructure, for a clearer control flow. |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
83 # function check_stencil_toml(toml) |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
84 # if toml isa Vector{String} |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
85 # return |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
86 # end |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
87 # |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
88 # if toml isa Dict |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
89 # if !(haskey(toml, "s") && haskey(toml, "c")) |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
90 # throw(ArgumentError("the table form of a stencil must have fields `s` and `c`.")) |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
91 # end |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
92 # |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
93 # if !(toml["s"] isa Vector{String}) |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
94 # throw(ArgumentError("a stencil must be specified as a vector of strings.")) |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
95 # end |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
96 # |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
97 # if !(toml["c"] isa Int) |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
98 # throw(ArgumentError("the center of a stencil must be specified as an integer.")) |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
99 # end |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
100 # return |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
101 # end |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
102 # throw(ArgumentError("the TOML for a stencil must be a vector of strings or a table.")) |
26bf5b2b3e32
Comment on naming and add suggestion for restructure of check_stencil_toml
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
791
diff
changeset
|
103 # end |
766 | 104 function check_stencil_toml(toml) |
105 if !(toml isa Dict || toml isa Vector{String}) | |
791 | 106 throw(ArgumentError("the TOML for a stencil must be a vector of strings or a table.")) |
766 | 107 end |
108 | |
109 if toml isa Vector{String} | |
110 return | |
111 end | |
112 | |
113 if !(haskey(toml, "s") && haskey(toml, "c")) | |
114 throw(ArgumentError("the table form of a stencil must have fields `s` and `c`.")) | |
115 end | |
116 | |
117 if !(toml["s"] isa Vector{String}) | |
118 throw(ArgumentError("a stencil must be specified as a vector of strings.")) | |
119 end | |
120 | |
121 if !(toml["c"] isa Int) | |
122 throw(ArgumentError("the center of a stencil must be specified as an integer.")) | |
123 end | |
124 end | |
125 | |
594
cc86b920531a
Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents:
340
diff
changeset
|
126 function parse_rational(str) |
cc86b920531a
Change the readoperator function to use the .toml format
Jonatan Werpers <jonatan@werpers.com>
parents:
340
diff
changeset
|
127 expr = Meta.parse(replace(str, "/"=>"//")) |
603
fbff4009c08a
Add tests for parse_rational()
Jonatan Werpers <jonatan@werpers.com>
parents:
602
diff
changeset
|
128 return eval(:(Rational($expr))) |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
129 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
130 |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
131 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
|
132 if N >= n |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
133 return t |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
134 else |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
135 return pad_tuple((t..., zero(T)), n) |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
136 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
137 end |
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
138 |
340
29df39a7b568
readoperator.jl: Fix path to operators
Jonatan Werpers <jonatan@werpers.com>
parents:
333
diff
changeset
|
139 sbp_operators_path() = (@__DIR__) * "/operators/" |
249
7cb4492ccd60
Refactor package SbpOperators
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff
changeset
|
140 export sbp_operators_path |