gmt 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/ext/gmt/extconf.rb +17 -2
  3. data/ext/gmt/gmt.c +46 -120
  4. data/lib/gmt.rb +123 -35
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d165e67cb791e80aecdbed1b817c6ba15c1f82ef
4
- data.tar.gz: 4ffda40ca008f338c9016e84326a2eb8f7242dfd
3
+ metadata.gz: eb3e6c00f7441e68367685e8e81ae9ab37d7b7df
4
+ data.tar.gz: 607921342ff51b589eb0a45cd29338f9b7103c67
5
5
  SHA512:
6
- metadata.gz: 69d55be3f508a2bb345622d90d7cda10363bd1ceb259a5f0f910c0daf96f91663cf17c9c2c693ddc17ac3ade4ea6e669b41b95a33a183ca0b8b6cfe6fbad3b35
7
- data.tar.gz: 311b0e6840f3d366ef17ea756ae581be1c8d3aa20978eb1bbb997802ecc154674631dcdac614bf9a1cba0c4a866a159c258447fd8d0579852b3e61097f0a9697
6
+ metadata.gz: bc29e208845fd2506a567ec89baf60b561a20df1fad75fd23b6b20c06692e224e69b5181175494e294678fe2cfbb1b28fceffa67222ec06533ce1904f10740a0
7
+ data.tar.gz: 078abee21e2518de7647b0c070ee5ddc57e7b11190b2a026d8f4873069841a0c81721e87a2daa7b72120f94b9c2248b5f366d67634eca9d5f8355c9aa1c0057d
@@ -2,8 +2,23 @@ require 'mkmf'
2
2
 
3
3
  $CFLAGS << ' -std=c99'
4
4
 
5
- HEADER_DIRS = [ '/usr/include/gmt' ]
6
- LIB_DIRS = [ '/usr/lib/x86_64-linux-gnu' ]
5
+ INCLUDEDIR = RbConfig::CONFIG['includedir']
6
+ HEADER_BASE = [
7
+ '/opt/local/include',
8
+ '/usr/local/include',
9
+ INCLUDEDIR,
10
+ '/usr/include',
11
+ ]
12
+ HEADER_GMT = HEADER_BASE.map { |dir| File.join(dir, 'gmt') }
13
+ HEADER_DIRS = HEADER_GMT + HEADER_BASE
14
+
15
+ LIBDIR = RbConfig::CONFIG['libdir']
16
+ LIB_DIRS = [
17
+ '/opt/local/lib',
18
+ '/usr/local/lib',
19
+ LIBDIR,
20
+ '/usr/lib'
21
+ ]
7
22
 
8
23
  dir_config('gmt', HEADER_DIRS, LIB_DIRS)
9
24
 
@@ -104,134 +104,52 @@ static VALUE gmt_simple(const char *name, int argc, VALUE *argv, VALUE self)
104
104
 
105
105
  /* The GMT functions */
106
106
 
107
- /* Mathematical Operations on Tables or Grids */
108
-
109
- static VALUE gmt_gmtmath(int argc, VALUE *argv, VALUE self)
110
- {
111
- return gmt_simple("gmtmath", argc, argv, self);
112
- }
113
-
114
- static VALUE gmt_makecpt(int argc, VALUE *argv, VALUE self)
115
- {
116
- return gmt_simple("makecpt", argc, argv, self);
107
+ #define GMT_FUN(name) \
108
+ static VALUE gmt_ ## name (int argc, VALUE *argv, VALUE self) \
109
+ { \
110
+ return gmt_simple(#name, argc, argv, self); \
117
111
  }
118
112
 
119
- static VALUE gmt_spectrum1d(int argc, VALUE *argv, VALUE self)
120
- {
121
- return gmt_simple("spectrum1d", argc, argv, self);
122
- }
113
+ /* Filtering of 1-D and 2-D Data */
123
114
 
124
- static VALUE gmt_sph2grd(int argc, VALUE *argv, VALUE self)
125
- {
126
- return gmt_simple("sph2grd", argc, argv, self);
127
- }
115
+ GMT_FUN(blockmean)
116
+ GMT_FUN(blockmedian)
117
+ GMT_FUN(blockmode)
118
+ GMT_FUN(filter1d)
119
+ GMT_FUN(grdfilter)
128
120
 
129
- static VALUE gmt_sphdistance(int argc, VALUE *argv, VALUE self)
130
- {
131
- return gmt_simple("sphdistance", argc, argv, self);
132
- }
121
+ /* Mathematical Operations on Tables or Grids */
133
122
 
134
- static VALUE gmt_sphtriangulate(int argc, VALUE *argv, VALUE self)
135
- {
136
- return gmt_simple("sphtriangulate", argc, argv, self);
137
- }
123
+ GMT_FUN(gmtmath)
124
+ GMT_FUN(makecpt)
125
+ GMT_FUN(spectrum1d)
126
+ GMT_FUN(sph2grd)
127
+ GMT_FUN(sphdistance)
128
+ GMT_FUN(sphtriangulate)
138
129
 
139
130
  /* Plotting of 1-D and 2-D Data */
140
131
 
141
- static VALUE gmt_gmtlogo(int argc, VALUE *argv, VALUE self)
142
- {
143
- return gmt_simple("gmtlogo", argc, argv, self);
144
- }
145
-
146
- static VALUE gmt_grdcontour(int argc, VALUE *argv, VALUE self)
147
- {
148
- return gmt_simple("grdcontour", argc, argv, self);
149
- }
150
-
151
- static VALUE gmt_grdimage(int argc, VALUE *argv, VALUE self)
152
- {
153
- return gmt_simple("grdimage", argc, argv, self);
154
- }
155
-
156
- static VALUE gmt_grdvector(int argc, VALUE *argv, VALUE self)
157
- {
158
- return gmt_simple("grdvector", argc, argv, self);
159
- }
160
-
161
- static VALUE gmt_grdview(int argc, VALUE *argv, VALUE self)
162
- {
163
- return gmt_simple("grdview", argc, argv, self);
164
- }
165
-
166
- static VALUE gmt_psbasemap(int argc, VALUE *argv, VALUE self)
167
- {
168
- return gmt_simple("psbasemap", argc, argv, self);
169
- }
170
-
171
- static VALUE gmt_psclip(int argc, VALUE *argv, VALUE self)
172
- {
173
- return gmt_simple("psclip", argc, argv, self);
174
- }
175
-
176
- static VALUE gmt_pscoast(int argc, VALUE *argv, VALUE self)
177
- {
178
- return gmt_simple("pscoast", argc, argv, self);
179
- }
180
-
181
- static VALUE gmt_pscontour(int argc, VALUE *argv, VALUE self)
182
- {
183
- return gmt_simple("pscontour", argc, argv, self);
184
- }
185
-
186
- static VALUE gmt_pshistogram(int argc, VALUE *argv, VALUE self)
187
- {
188
- return gmt_simple("pshistogram", argc, argv, self);
189
- }
190
-
191
- static VALUE gmt_psimage(int argc, VALUE *argv, VALUE self)
192
- {
193
- return gmt_simple("psimage", argc, argv, self);
194
- }
195
-
196
- static VALUE gmt_pslegend(int argc, VALUE *argv, VALUE self)
197
- {
198
- return gmt_simple("pslegend", argc, argv, self);
199
- }
200
-
201
- static VALUE gmt_psmask(int argc, VALUE *argv, VALUE self)
202
- {
203
- return gmt_simple("psmask", argc, argv, self);
204
- }
205
-
206
- static VALUE gmt_psrose(int argc, VALUE *argv, VALUE self)
207
- {
208
- return gmt_simple("psrose", argc, argv, self);
209
- }
210
-
211
- static VALUE gmt_psscale(int argc, VALUE *argv, VALUE self)
212
- {
213
- return gmt_simple("psscale", argc, argv, self);
214
- }
215
-
216
- static VALUE gmt_pstext(int argc, VALUE *argv, VALUE self)
217
- {
218
- return gmt_simple("pstext", argc, argv, self);
219
- }
220
-
221
- static VALUE gmt_pswiggle(int argc, VALUE *argv, VALUE self)
222
- {
223
- return gmt_simple("pswiggle", argc, argv, self);
224
- }
225
-
226
- static VALUE gmt_psxy(int argc, VALUE *argv, VALUE self)
227
- {
228
- return gmt_simple("psxy", argc, argv, self);
229
- }
230
-
231
- static VALUE gmt_psxyz(int argc, VALUE *argv, VALUE self)
232
- {
233
- return gmt_simple("psxyz", argc, argv, self);
234
- }
132
+ GMT_FUN(gmtlogo)
133
+ GMT_FUN(grdcontour)
134
+ GMT_FUN(grdimage)
135
+ GMT_FUN(grdvector)
136
+ GMT_FUN(grdview)
137
+ GMT_FUN(psbasemap)
138
+ GMT_FUN(psclip)
139
+ GMT_FUN(pscoast)
140
+ GMT_FUN(pscontour)
141
+ GMT_FUN(pshistogram)
142
+ GMT_FUN(psimage)
143
+ GMT_FUN(pslegend)
144
+ GMT_FUN(psmask)
145
+ GMT_FUN(psrose)
146
+ GMT_FUN(psscale)
147
+ GMT_FUN(pstext)
148
+ GMT_FUN(pswiggle)
149
+ GMT_FUN(psxy)
150
+ GMT_FUN(psxyz)
151
+
152
+ #undef GMT_FUN
235
153
 
236
154
  void Init_gmt(void)
237
155
  {
@@ -241,6 +159,14 @@ void Init_gmt(void)
241
159
  rb_define_method(cGMT, "initialize", gmt_init, 0);
242
160
  rb_define_method(cGMT, "free", gmt_release, 0);
243
161
 
162
+ /* Filtering of 1-D and 2-D Data */
163
+
164
+ rb_define_private_method(cGMT, "blockmean_c", gmt_blockmean, -1);
165
+ rb_define_private_method(cGMT, "blockmedian_c", gmt_blockmedian, -1);
166
+ rb_define_private_method(cGMT, "blockmode_c", gmt_blockmode, -1);
167
+ rb_define_private_method(cGMT, "filter1d_c", gmt_filter1d, -1);
168
+ rb_define_private_method(cGMT, "grdfilter_c", gmt_grdfilter, -1);
169
+
244
170
  /* Mathematical Operations on Tables or Grids */
245
171
 
246
172
  rb_define_private_method(cGMT, "gmtmath_c", gmt_gmtmath, -1);
data/lib/gmt.rb CHANGED
@@ -30,69 +30,157 @@
30
30
  # Those familiar with GMT will recognise the +-R+ (range) and +-J+ (projection)
31
31
  # options which are now keys for the program options hash.
32
32
  #
33
- # More details to follow ...
34
-
33
+ # == The session
34
+ #
35
+ # All GMT functions (modules in the GMT parlance) require a session context,
36
+ # and an instance of the GMT class is exactly such a context.
37
+ #
38
+ # gmt = GMT.new
39
+ #
40
+ # There are no arguments for the constructor.
41
+ #
42
+ # == GMT functions
43
+ #
44
+ # Each GMT function is available as instance method, and each has the same
45
+ # signatures: several _arguments_, typically input files, followed by a
46
+ # single options hash. The options has corresponds to the command-line
47
+ # options of the GMT program; hence the shell command
48
+ #
49
+ # gmt makecpt -Cgebco depths.txt -i2 -Z -E24 > my_depths.cpt
50
+ #
51
+ # would be replicated by the Ruby
52
+ #
53
+ # gmt = GMT.new
54
+ # gmt.makecpt('depths.txt',
55
+ # :C => 'gebco', :i => 2, :Z => nil, :E => 24, :> => 'my_depths.cpt')
56
+ #
57
+ # Note that
58
+ # - the single argument (the input file <code>'depths.txt'</code>) preceeds
59
+ # the options hash
60
+ # - the options hash has keys which are symbols
61
+ # - options which lack arguments correspond to hash keys with nil values
62
+ # <code>:Z => nil</code>.
63
+ # - the output redirection is _also_ treated as hash option, with key
64
+ # <code>:></code> and value which is the output file.
65
+ #
66
+ # == PostScript functions
67
+ #
68
+ # When creating complex PostScript plots one needs to make several calls to
69
+ # GMT functions, to use the +-O+ and +-K+ options, and to append output of
70
+ # the second and subsequent calls (rather than overwriting). This is tiresome
71
+ # and error-prone on the command-line, and more so in the "options hash"
72
+ # representation in the Ruby module.
73
+ #
74
+ # So we add some syntatactic sugar for these PostScript functions: if the
75
+ # options hash has the keys +:position+ (with values one of +:first+, +:middle+,
76
+ # or +:last+) and +:file+ (with the value of the ouptut file), then the
77
+ # +-O+ and +-K+ options and the output redirection are handled by the class.
78
+ # So one might write
79
+ #
80
+ # gmt = GMT.new
81
+ # gmt.psbasemap( …, :file => 'map.ps', :position => :first)
82
+ # gmt.pstext( …, :file => 'map.ps', :position => :middle)
83
+ # gmt.psxy( …, :file => 'map.ps', :position => :middle)
84
+ # gmt.pslogo( …, :file => 'map.ps', :position => :last)
85
+ #
35
86
  class GMT
36
87
 
37
88
  class << self
38
89
 
39
90
  private
40
91
 
41
- def opts_normalise(options)
42
- file = options.delete(:file)
43
- position = options.delete(:position)
44
- if file && position then
45
- file_options =
46
- case position
47
- when :first
48
- { :K => nil, :> => file }
49
- when :middle
50
- { :O => nil, :K => nil, :>> => file }
51
- when :last
52
- { :O => nil, :>> => file }
53
- else
54
- raise ArguemntError, 'position should be :first, :middle or :last'
55
- end
56
- options.merge(file_options)
57
- else
58
- options
59
- end
60
- end
61
-
62
- def method_c(method)
63
- [method.to_s, 'c'].join('_').to_sym
64
- end
65
-
66
92
  # @macro [attach] wrapper_ps
93
+ #
94
+ # A PostScript function (accepts +:file+ and +:position+ options).
67
95
  # @method $1(*files, options)
68
96
  # @param [Array<String>] files The input files
69
97
  # @param [Hash] options The GMT command-line options in hash form
70
98
  # @return [Boolean] +true+ on success
71
99
  # @see http://gmt.soest.hawaii.edu/doc/latest/$1.html
72
100
  def wrapper_ps(method)
73
- define_method(method) do |*files, options|
74
- self.send(GMT.send(:method_c, method),
75
- *files,
76
- GMT.send(:opts_normalise, options))
101
+ define_method(method) do |*args, options|
102
+ self.send(api_function(method),
103
+ *string_arguments(args),
104
+ postscript_options(options))
77
105
  end
78
106
  end
79
107
 
80
108
  # @macro [attach] wrapper_other
81
- # @method $1(*files, options)
82
- # @param [Array<String>] files The input files
109
+ # @method $1(*arguments, options)
110
+ # @param [Array<String>] arguments The arguments
83
111
  # @param [Hash] options The GMT command-line options in hash form
84
112
  # @return [Boolean] +true+ on success
85
113
  # @see http://gmt.soest.hawaii.edu/doc/latest/$1.html
86
114
  def wrapper_other(method)
87
- define_method(method) do |*args|
88
- self.send(GMT.send(:method_c, method), *args)
115
+ define_method(method) do |*args, options|
116
+ self.send(api_function(method),
117
+ *string_arguments(args),
118
+ options)
89
119
  end
90
120
  end
91
121
 
92
122
  end
93
123
 
124
+ private
125
+
126
+ # the name of the C function
127
+
128
+ def api_function(method)
129
+ [method.to_s, 'c'].join('_').to_sym
130
+ end
131
+
132
+ # convert non-option arguments to strings
133
+
134
+ def string_arguments(args)
135
+ args.map(&:to_s)
136
+ end
137
+
138
+ # for GMT modules which produce PostScript, convert the
139
+ # convenience options (:position, :file) to the hash
140
+ # equivalent of the -K, -O options, and the creation of
141
+ # or appending to the PostScript output file
142
+
143
+ def postscript_options(options)
144
+ file = options.delete(:file)
145
+ position = options.delete(:position)
146
+ if file && position then
147
+ file_options =
148
+ case position
149
+ when :first
150
+ { :K => nil, :> => file }
151
+ when :middle
152
+ { :O => nil, :K => nil, :>> => file }
153
+ when :last
154
+ { :O => nil, :>> => file }
155
+ else
156
+ raise ArguemntError, 'position should be :first, :middle or :last'
157
+ end
158
+ options.merge(file_options)
159
+ else
160
+ options
161
+ end
162
+ end
163
+
94
164
  public
95
165
 
166
+ ### Filtering of 1-D and 2-D Data
167
+
168
+ # L2 (x,y,z) table data filter/decimator
169
+ wrapper_other :blockmean
170
+
171
+ # L1 (x,y,z) table data filter/decimator
172
+ wrapper_other :blockmedian
173
+
174
+ # Mode estimate (x,y,z) table data filter/decimator
175
+ wrapper_other :blockmode
176
+
177
+ # Time domain filtering of 1-D data tables
178
+ wrapper_other :filter1d
179
+
180
+ # Filter 2-D gridded data sets in the space domain
181
+ wrapper_other :grdfilter
182
+
183
+
96
184
  ### Mathematical Operations on Tables or Grids
97
185
 
98
186
  # Mathematical operations on table data
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gmt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - J.J. Green
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-01 00:00:00.000000000 Z
11
+ date: 2016-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler