cdo 1.0.0 → 1.0.1
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.
- data/gemspec +2 -1
- data/lib/cdo.rb +2 -2
- data/test/test_cdo.rb +146 -0
- metadata +5 -3
data/gemspec
CHANGED
@@ -2,9 +2,10 @@ require 'rubygems'
|
|
2
2
|
|
3
3
|
spec = Gem::Specification.new do |s|
|
4
4
|
s.name = "cdo"
|
5
|
-
s.version = '1.0.
|
5
|
+
s.version = '1.0.1'
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.files = ["lib/cdo.rb"] + ["gemspec","COPYING","README.rdoc"]
|
8
|
+
s.test_file = "test/test_cdo.rb"
|
8
9
|
s.description = "Easy access to the Climate Data operators"
|
9
10
|
s.summary = "Easy access to the Climate Data operators"
|
10
11
|
s.author = "Ralf Mueller"
|
data/lib/cdo.rb
CHANGED
@@ -61,9 +61,9 @@ module Cdo
|
|
61
61
|
case ofile
|
62
62
|
when $stdout
|
63
63
|
cmd << " 2>/dev/null"
|
64
|
-
return IO.popen(cmd).
|
64
|
+
return IO.popen(cmd).readlines.map {|l| l.chomp.strip}
|
65
65
|
when nil
|
66
|
-
ofile = Tempfile.new("
|
66
|
+
ofile = Tempfile.new("Cdo.rb").path
|
67
67
|
end
|
68
68
|
cmd << "#{ofile}"
|
69
69
|
call(cmd)
|
data/test/test_cdo.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),"..","lib")
|
2
|
+
require 'test/unit'
|
3
|
+
require 'cdo'
|
4
|
+
|
5
|
+
class TestJobQueue < Test::Unit::TestCase
|
6
|
+
|
7
|
+
DEFAULT_CDO_PATH = '/usr/bin/cdo'
|
8
|
+
def setup
|
9
|
+
if ENV['CDO'].nil?
|
10
|
+
if File.exists?(DEFAULT_CDO_PATH)
|
11
|
+
Cdo.setCdo(DEFAULT_CDO_PATH)
|
12
|
+
else
|
13
|
+
stop(DEFAULT_CDO_PATH)
|
14
|
+
end
|
15
|
+
else
|
16
|
+
# Check user given path
|
17
|
+
unless File.exists?(ENV['CDO'])
|
18
|
+
stop(ENV['CDO'])
|
19
|
+
else
|
20
|
+
Cdo.setCdo(ENV['CDO'])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
def stop(path)
|
25
|
+
warn "Could not find CDO binary (#{path})! Abort tests"
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_getOperators
|
30
|
+
%w[for random stdatm info showlevel sinfo remap mask topo thicknessOfLevels].each {|op|
|
31
|
+
assert(Cdo.getOperators.include?(op),"Operator '#{op}' not found") unless op == "thicknessOfLevels"
|
32
|
+
assert(Cdo.respond_to?(op),"Operator '#{op}' not found") if op == "thicknessOfLevels"
|
33
|
+
}
|
34
|
+
end
|
35
|
+
def test_info
|
36
|
+
levels = Cdo.showlevel(:in => "-stdatm,0")
|
37
|
+
assert_equal([0,0].map(&:to_s),levels)
|
38
|
+
|
39
|
+
info = Cdo.sinfo(:in => "-stdatm,0")
|
40
|
+
assert_equal("File format: GRIB",info[0])
|
41
|
+
|
42
|
+
end
|
43
|
+
def test_operator_options
|
44
|
+
ofile = MyTempfile.path
|
45
|
+
targetLevels = [0,10,50,100,200,400,1000]
|
46
|
+
Cdo.stdatm(targetLevels,:out => ofile)
|
47
|
+
levels = Cdo.showlevel(:in => ofile)
|
48
|
+
[0,1].each {|i| assert_equal(targetLevels.map(&:to_s),levels[i].split)}
|
49
|
+
end
|
50
|
+
def test_CDO_options
|
51
|
+
names = Cdo.showname(:in => "-stdatm,0",:options => "-f nc")
|
52
|
+
assert_equal(["P T"],names)
|
53
|
+
|
54
|
+
ofile = MyTempfile.path
|
55
|
+
Cdo.topo(:out => ofile,:options => "-z szip")
|
56
|
+
assert_equal(["GRIB SZIP"],Cdo.showformat(:in => ofile))
|
57
|
+
end
|
58
|
+
def test_chain
|
59
|
+
ofile = MyTempfile.path
|
60
|
+
#Cdo.Debug = true
|
61
|
+
Cdo.chainCall("-setname,veloc -copy",:in => "-random,r1x1",:out => ofile,:options => "-f nc")
|
62
|
+
assert_equal(["veloc"],Cdo.showname(:in => ofile))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# # Calling simple operators
|
67
|
+
# #
|
68
|
+
# # merge:
|
69
|
+
# # let files be an erray of valid filenames and ofile is a string
|
70
|
+
# Cdo.merge(:in => outvars.join(" "),:out => ofile)
|
71
|
+
# # or with multiple arrays:
|
72
|
+
# Cdo.merge(:in => [ifiles0,ifiles1].flatten.join(' '),:out => ofile)
|
73
|
+
# # selname:
|
74
|
+
# # lets grep out some variables from ifile:
|
75
|
+
# ["T","U","V"].each {|varname|
|
76
|
+
# varfile = varname+".nc"
|
77
|
+
# Cdo.selname(varname,:in => ifile,:out => varfile)
|
78
|
+
# }
|
79
|
+
# # a threaded version of this could look like:
|
80
|
+
# ths = []
|
81
|
+
# ["T","U","V"].each {|outvar|
|
82
|
+
# ths << Thread.new(outvar) {|ovar|
|
83
|
+
# varfile = varname+".nc"
|
84
|
+
# Cdo.selname(varname,:in => ifile,:out => varfile)
|
85
|
+
# }
|
86
|
+
# }
|
87
|
+
# ths.each {|th| th.join}
|
88
|
+
# # another example with sub:
|
89
|
+
# Cdo.sub(:in => [oldfile,newfile].join(' '), :out => diff)
|
90
|
+
#
|
91
|
+
# # It is possible too use the 'send' method
|
92
|
+
# operator = /grb/.match(File.extname(ifile)) ? :showcode : :showname
|
93
|
+
# inputVars = Cdo.send(operator,:in => ifile)
|
94
|
+
# # show and info operators are writing to stdout. cdo.rb tries to collects this into arrays
|
95
|
+
# #
|
96
|
+
# # Same stuff with other operators:
|
97
|
+
# operator = case var
|
98
|
+
# when Fixnum then 'selcode'
|
99
|
+
# when String then 'selname'
|
100
|
+
# else
|
101
|
+
# warn "Wrong usage of variable identifier for '#{var}' (class #{var.class})!"
|
102
|
+
# end
|
103
|
+
# Cdo.send(operator,var,:in => @ifile, :out => varfile)
|
104
|
+
#
|
105
|
+
# # For chaining operators, there is a special method:
|
106
|
+
# Cdo.chainCall("-setname,veloc -copy",:in => ifile,:out => ofile,:options => "-f nc")
|
107
|
+
# # another example with 3 operators and a different hash syntax
|
108
|
+
# C_R = 287.05
|
109
|
+
# Cdo.chainCall("setname,#{rho} -divc,#{C_R} -div",in: [pressureFile,temperatureFile].join(' '), out: densityFile)
|
110
|
+
#
|
111
|
+
# # Pass an array for operators with multiple options:
|
112
|
+
# # Perform conservative remapping with pregenerated weights
|
113
|
+
# Cdo.remap([gridfile,weightfile],:in => copyfile,:out => outfile)
|
114
|
+
# # Create vertical height levels out of hybrid model levels
|
115
|
+
# Cdo.ml2hl([0,20,50,100,200,400,800,1200].join(','),:in => hybridlayerfile, :out => reallayerfile)
|
116
|
+
# # or use multiple arguments directly
|
117
|
+
# Cdo.remapeta(vctfile,orofile,:in => ifile,:out => hybridlayerfile)
|
118
|
+
#
|
119
|
+
# # the powerfull expr operator:
|
120
|
+
# # taken from the tutorial in https://code.zmaw.de/projects/cdo/wiki/Tutorial#The-_expr_-Operator
|
121
|
+
# SCALEHEIGHT = 10000.0
|
122
|
+
# C_EARTH_GRAV = 9.80665
|
123
|
+
# # function for later computation of hydrostatic atmosphere pressure
|
124
|
+
# PRES_EXPR = lambda {|height| "101325.0*exp((-1)*(1.602769777072154)*log((exp(#{height}/#{SCALEHEIGHT})*213.15+75.0)/288.15))"}
|
125
|
+
# TEMP_EXPR = lambda {|height| "213.0+75.0*exp(-#{height}/#{SCALEHEIGHT})"}
|
126
|
+
#
|
127
|
+
# # Create Pressure and Temperature out of a height field 'geopotheight' from ifile
|
128
|
+
# Cdo.expr("'p=#{PRES_EXPR['geopotheight']}'", :in => ifile, :out => presFile)
|
129
|
+
# Cdo.expr("'t=#{TEMP_EXPR['geopotheight']}'", :in => ifile, :out => tempFile)
|
130
|
+
#
|
131
|
+
#
|
132
|
+
# # TIPS: I often work with temporary files and for getting rid of handling them manually the MyTempfile module can be used:
|
133
|
+
# # Simply include the following methods into you scripts and use tfile for any temporary variable
|
134
|
+
# def tfile
|
135
|
+
# MyTempfile.path
|
136
|
+
# end
|
137
|
+
# # As an example, the computation of simple atmospherric density could look like
|
138
|
+
# presFile, tempFile = tfile, tfile
|
139
|
+
# Cdo.expr("'p=#{PRES_EXPR['geopotheight']}'", :in => ifile, :out => presFile)
|
140
|
+
# Cdo.expr("'t=#{TEMP_EXPR['geopotheight']}'", :in => ifile, :out => tempFile)
|
141
|
+
# Cdo.chainCall("setname,#{rho} -divc,#{C_R} -div",in: [presFile,tempFile].join(' '), out: densityFile)
|
142
|
+
#
|
143
|
+
# # For debugging, it is helpfull, to avoid the automatic cleanup at the end of the scripts:
|
144
|
+
# MyTempfile.setPersist(true)
|
145
|
+
# # creates randomly names files. Switch on debugging with
|
146
|
+
# Cdo.Debug = true
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cdo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-12-
|
12
|
+
date: 2011-12-15 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Easy access to the Climate Data operators
|
15
15
|
email: stark.dreamdetective@gmail.com
|
@@ -23,6 +23,7 @@ files:
|
|
23
23
|
- gemspec
|
24
24
|
- COPYING
|
25
25
|
- README.rdoc
|
26
|
+
- test/test_cdo.rb
|
26
27
|
homepage: http://code.zmaw.de/projects/cdo
|
27
28
|
licenses:
|
28
29
|
- GPLv2
|
@@ -48,4 +49,5 @@ rubygems_version: 1.8.11
|
|
48
49
|
signing_key:
|
49
50
|
specification_version: 3
|
50
51
|
summary: Easy access to the Climate Data operators
|
51
|
-
test_files:
|
52
|
+
test_files:
|
53
|
+
- test/test_cdo.rb
|