cdo 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/gemspec +1 -1
  3. data/lib/cdo.rb +30 -21
  4. data/test/test_cdo.rb +136 -179
  5. metadata +3 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2085dbda68e564e4449b83e69c840dcfc817b60adfe2010c597eeb795eade50d
4
- data.tar.gz: 34c2082c1ed7de54cb889dde3cd8fe3d3e8e9ba7abd6f20f655bd6d5478e0905
3
+ metadata.gz: 9f41ea1d14a2640c9c93ca33eaeacb7860f39fd723e857f740dc366bc284f020
4
+ data.tar.gz: 2c5fb959227006a1659c7c6fa97936d85ddd5b62fc1e9c0459e9029c043c1819
5
5
  SHA512:
6
- metadata.gz: 38f8689cf9674697d64c9958df35c85177e86c08d6becaa808cc13a56c460fcbce6a6f57c43ca376c129c531c26a1b09dbae38a07c1557e36ec1746f4365ca50
7
- data.tar.gz: 71d527c68c39531e5b3c8007a05fa0b46989efa4b49da2a4e3738ced45d60137d32071bfe77a2da11273a6a716f0c9e17484a4676680825f480633289521f921
6
+ metadata.gz: c1fea4d7b5c61a989b6b7ecab617604ab4977f771b072b8441149bd141a4fa95e0cfc5cc1e520d34f3c644c4d21fe15092ac332719ed526a03fc3edd9be657d5
7
+ data.tar.gz: 7e687fc0d277d2123eb815012ad023d38480b631e0414f33503928d09e39fc0dc12a3b22e2d259bd23d0343d668c3d2a8d5b781ea200c9d65d66218022b6cab1
data/gemspec CHANGED
@@ -3,7 +3,7 @@ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
3
3
 
4
4
  spec = Gem::Specification.new do |s|
5
5
  s.name = "cdo"
6
- s.version = '1.4.0'
6
+ s.version = '1.5.0'
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.files = ["lib/cdo.rb","gemspec","LICENSE"]
9
9
  s.test_file = "test/test_cdo.rb"
data/lib/cdo.rb CHANGED
@@ -35,18 +35,17 @@ class Cdo
35
35
 
36
36
 
37
37
  attr_accessor :cdo, :returnCdf, :forceOutput, :env, :debug, :logging, :logFile
38
- attr_reader :operators, :filetypes
38
+ attr_reader :operators, :filetypes, :hasNetcdf
39
39
 
40
40
  def initialize(cdo: 'cdo',
41
- returnCdf: false,
42
41
  returnFalseOnError: false,
42
+ returnNilOnError: false,
43
43
  forceOutput: true,
44
44
  env: {},
45
+ debug: false,
45
46
  tempdir: Dir.tmpdir,
46
47
  logging: false,
47
- logFile: StringIO.new,
48
- debug: false,
49
- returnNilOnError: false)
48
+ logFile: StringIO.new)
50
49
 
51
50
  # setup path to cdo executable
52
51
  @cdo = ENV.has_key?('CDO') ? ENV['CDO'] : cdo
@@ -54,12 +53,12 @@ class Cdo
54
53
  @operators = getOperators(@cdo)
55
54
  @noOutputOperators = @operators.select {|op,io| 0 == io}.keys
56
55
 
57
- @returnCdf = returnCdf
56
+ @hasNetcdf = loadOptionalLibs
57
+
58
58
  @forceOutput = forceOutput
59
59
  @env = env
60
60
  @debug = ENV.has_key?('DEBUG') ? true : debug
61
61
  @returnNilOnError = returnNilOnError
62
-
63
62
  @returnFalseOnError = returnFalseOnError
64
63
 
65
64
  @tempStore = CdoTempfileStore.new(tempdir)
@@ -76,6 +75,13 @@ class Cdo
76
75
  v
77
76
  end
78
77
  }
78
+
79
+ # ignore return code 1 for diff operators (from 1.9.6 onwards)
80
+ @exit_success = lambda {|operatorName|
81
+ return 0 if version < '1.9.6'
82
+ return 0 if 'diff' != operatorName[0,4]
83
+ return 1
84
+ }
79
85
  end
80
86
 
81
87
  private # {{{
@@ -209,11 +215,11 @@ class Cdo
209
215
  end
210
216
 
211
217
  # Error handling for the given command
212
- def _hasError(cmd,retvals)
218
+ def _hasError(cmd,operatorName,retvals)
213
219
  if @debug
214
220
  puts("RETURNCODE: #{retvals[:returncode]}")
215
221
  end
216
- if ( 0 != retvals[:returncode] )
222
+ if ( @exit_success[operatorName] < retvals[:returncode] )
217
223
  puts("Error in calling:")
218
224
  puts(">>> "+cmd+"<<<")
219
225
  puts(retvals[:stderr])
@@ -260,7 +266,7 @@ class Cdo
260
266
  case output
261
267
  when $stdout
262
268
  retvals = _call(cmd,env)
263
- unless _hasError(cmd,retvals)
269
+ unless _hasError(cmd,operatorName,retvals)
264
270
  _output = retvals[:stdout].split($/).map {|l| l.chomp.strip}
265
271
  unless autoSplit.nil?
266
272
  _output.map! {|line| line.split(autoSplit)}
@@ -290,7 +296,7 @@ class Cdo
290
296
 
291
297
  retvals = _call(cmd,env)
292
298
 
293
- if _hasError(cmd,retvals)
299
+ if _hasError(cmd,operatorName,retvals)
294
300
  if @returnNilOnError then
295
301
  return nil
296
302
  else
@@ -309,7 +315,7 @@ class Cdo
309
315
  readArray(outputs[0],returnArray)
310
316
  elsif not returnMaArray.nil?
311
317
  readMaArray(outputs[0],returnMaArray)
312
- elsif returnCdf or @returnCdf
318
+ elsif returnCdf
313
319
  retval = outputs.map{|f| readCdf(f)}
314
320
  return 1 == retval.size ? retval[0] : retval
315
321
  elsif /^split/.match(operatorName)
@@ -344,12 +350,13 @@ class Cdo
344
350
  end
345
351
 
346
352
  # load the netcdf bindings
347
- def loadCdf
353
+ def loadOptionalLibs
348
354
  begin
349
355
  require "numru/netcdf_miss"
350
- rescue LoadError
351
- warn "Could not load ruby's netcdf bindings. Please install it."
352
- raise
356
+ return true
357
+ rescue
358
+ warn "Could not load ruby's netcdf bindings"
359
+ return false
353
360
  end
354
361
  end
355
362
 
@@ -411,15 +418,17 @@ class Cdo
411
418
  end
412
419
 
413
420
  # return cdf handle to given file readonly
414
- def readCdf(iFile)
415
- loadCdf
416
- NumRu::NetCDF.open(iFile)
421
+ def readCdf(iFile,mode='r')
422
+ if @hasNetcdf then
423
+ NumRu::NetCDF.open(iFile,mode)
424
+ else
425
+ raise LoadError,"Could not load ruby-netcdf"
426
+ end
417
427
  end
418
428
 
419
429
  # return cdf handle opened in append more
420
430
  def openCdf(iFile)
421
- loadCdf
422
- NumRu::NetCDF.open(iFile,'r+')
431
+ readCdf(iFile,'r+')
423
432
  end
424
433
 
425
434
  # return narray for given variable name
@@ -66,6 +66,14 @@ class TestCdo < Minitest::Test
66
66
  assert(@cdo.operators.size > 700,"cound not find enough operators")
67
67
  end
68
68
 
69
+ def test_verifyGridOP
70
+ if "1.9.5" >= @cdo.version then
71
+ assert(@cdo.operators.keys.include?('gridverify'))
72
+ else
73
+ assert(@cdo.operators.keys.include?('verifygrid'))
74
+ end
75
+ end
76
+
69
77
  def test_outputOperators
70
78
  @cdo.debug = @@debug
71
79
  levels = @cdo.showlevel(:input => "-stdatm,0")
@@ -214,11 +222,11 @@ class TestCdo < Minitest::Test
214
222
  end
215
223
 
216
224
  def test_parseArgs
217
- io,opts = Cdo.parseArgs([1,2,3,:input => '1',:output => '2',:force => true,:returnCdf => "T",:autoSplit => ' '])
225
+ io,opts = Cdo.parseArgs([1,2,3,:input => '1',:output => '2',:force => true,:returnCdf => true,:autoSplit => ' '])
218
226
  assert_equal("1",io[:input])
219
227
  assert_equal("2",io[:output])
220
228
  assert_equal(true,io[:force])
221
- assert_equal("T",io[:returnCdf])
229
+ assert_equal(true,io[:returnCdf])
222
230
  assert_equal(" ",io[:autoSplit])
223
231
  pp [io,opts]
224
232
  end
@@ -273,7 +281,7 @@ class TestCdo < Minitest::Test
273
281
 
274
282
  def test_noOutputOps
275
283
  operators = @cdo.operators
276
- %w[griddes griddes2 gridverify info infoc infon infop infos infov map
284
+ %w[griddes griddes2 info infoc infon infop infos infov map
277
285
  outputarr outputbounds outputboundscpt outputcenter outputcenter2
278
286
  outputcentercpt outputext outputf outputfld outputint outputkey outputsrv
279
287
  outputtab outputtri outputts outputvector outputvrml outputxyz pardes partab].each {|op|
@@ -355,91 +363,104 @@ class TestCdo < Minitest::Test
355
363
  end
356
364
 
357
365
  def test_returnArray
358
- temperature = @cdo.stdatm(0,:returnCdf => true).var('T').get.flatten[0]
359
- assert(1.7 < temperature,"Temperature to low!")
360
- assert_raises ArgumentError do
361
- @cdo.stdatm(0,:returnArray => 'TT')
366
+ if @cdo.hasNetcdf then
367
+ temperature = @cdo.stdatm(0,:returnCdf => true).var('T').get.flatten[0]
368
+ assert(1.7 < temperature,"Temperature to low!")
369
+ assert_raises ArgumentError do
370
+ @cdo.stdatm(0,:returnArray => 'TT')
371
+ end
372
+ temperature = @cdo.stdatm(0,:returnArray => 'T')
373
+ assert_equal(288.0,temperature.flatten[0])
374
+ pressure = @cdo.stdatm(0,1000,:options => '-b F64',:returnArray => 'P')
375
+ assert_equal("1013.25 898.543456035875",pressure.flatten.to_a.join(' '))
376
+ else
377
+ assert_raises LoadError do
378
+ temperature = @cdo.stdatm(0,:returnCdf => true).var('T').get.flatten[0]
379
+ end
362
380
  end
363
- temperature = @cdo.stdatm(0,:returnArray => 'T')
364
- assert_equal(288.0,temperature.flatten[0])
365
- pressure = @cdo.stdatm(0,1000,:options => '-b F64',:returnArray => 'P')
366
- assert_equal("1013.25 898.543456035875",pressure.flatten.to_a.join(' '))
367
381
  end
368
382
  def test_returnMaArray
369
- @cdo.debug = @@debug
370
- topo = @cdo.topo(:returnMaArray => 'topo')
371
- assert_equal(-1890.0,topo.mean.round)
372
- bathy = @cdo.setrtomiss(0,10000,
373
- :input => @cdo.topo(:options => '-f nc'),:returnMaArray => 'topo')
374
- assert_equal(-3386.0,bathy.mean.round)
375
- oro = @cdo.setrtomiss(-10000,0,
376
- :input => @cdo.topo(:options => '-f nc'),:returnMaArray => 'topo')
377
- assert_equal(1142.0,oro.mean.round)
378
- bathy = @cdo.remapnn('r2x2',:input => @cdo.topo(:options => '-f nc'), :returnMaArray => 'topo')
379
- assert_equal(-4298.0,bathy[0,0])
380
- assert_equal(-2669.0,bathy[1,0])
381
- ta = @cdo.remapnn('r2x2',:input => @cdo.topo(:options => '-f nc'))
382
- tb = @cdo.subc(-2669.0,:input => ta)
383
- withMask = @cdo.div(:input => ta+" "+tb,:returnMaArray => 'topo')
384
- assert(-8.0e+33 > withMask[1,0])
385
- assert(0 < withMask[0,0])
386
- assert(0 < withMask[0,1])
387
- assert(0 < withMask[1,1])
388
- end
389
- def test_combine
390
- ofile0, ofile1 = @tempStore.newFile, @tempStore.newFile
391
- @cdo.fldsum(:input => @cdo.stdatm(25,100,250,500,875,1400,2100,3000,4000,5000,:options => "-f nc"),:output => ofile0)
392
- @cdo.fldsum(:input => "-stdatm,25,100,250,500,875,1400,2100,3000,4000,5000",:options => "-f nc",:output => ofile1)
393
- @cdo.returnCdf = true
394
- @tempStore.showFiles
395
- diff = @cdo.sub(:input => [ofile0,ofile1].join(' ')).var('T').get
396
- assert_equal(0.0,diff.min)
397
- assert_equal(0.0,diff.max)
398
- @cdo.returnCdf = false
383
+ if @cdo.hasNetcdf then
384
+ @cdo.debug = @@debug
385
+ topo = @cdo.topo(:returnMaArray => 'topo')
386
+ assert_equal(-1890.0,topo.mean.round)
387
+ bathy = @cdo.setrtomiss(0,10000,
388
+ :input => @cdo.topo(:options => '-f nc'),:returnMaArray => 'topo')
389
+ assert_equal(-3386.0,bathy.mean.round)
390
+ oro = @cdo.setrtomiss(-10000,0,
391
+ :input => @cdo.topo(:options => '-f nc'),:returnMaArray => 'topo')
392
+ assert_equal(1142.0,oro.mean.round)
393
+ bathy = @cdo.remapnn('r2x2',:input => @cdo.topo(:options => '-f nc'), :returnMaArray => 'topo')
394
+ assert_equal(-4298.0,bathy[0,0])
395
+ assert_equal(-2669.0,bathy[1,0])
396
+ ta = @cdo.remapnn('r2x2',:input => @cdo.topo(:options => '-f nc'))
397
+ tb = @cdo.subc(-2669.0,:input => ta)
398
+ withMask = @cdo.div(:input => ta+" "+tb,:returnMaArray => 'topo')
399
+ assert(-8.0e+33 > withMask[1,0])
400
+ assert(0 < withMask[0,0])
401
+ assert(0 < withMask[0,1])
402
+ assert(0 < withMask[1,1])
403
+ else
404
+ assert_raises LoadError do
405
+ topo = @cdo.topo(:returnMaArray => 'topo')
406
+ end
407
+ end
399
408
  end
400
409
 
401
410
  def test_returnCdf
402
411
  ofile = rand(0xfffff).to_s + '_test_returnCdf.nc'
403
412
  vals = @cdo.stdatm(25,100,250,500,875,1400,2100,3000,4000,5000,:output => ofile,:options => "-f nc")
404
413
  assert_equal(ofile,vals)
405
- @cdo.returnCdf = true
406
- vals = @cdo.stdatm(25,100,250,500,875,1400,2100,3000,4000,5000,:output => ofile,:options => "-f nc")
407
- assert_equal(["lon","lat","level","P","T"],vals.var_names)
408
- assert_equal(276,vals.var("T").get.flatten.mean.floor)
409
- @cdo.returnCdf = false
410
- vals = @cdo.stdatm(25,100,250,500,875,1400,2100,3000,4000,5000,:output => ofile,:options => "-f nc")
411
- assert_equal(ofile,vals)
414
+ if @cdo.hasNetcdf then
415
+ vals = @cdo.stdatm(25,100,250,500,875,1400,2100,3000,4000,5000,:output => ofile,:returnCdf => true)
416
+ assert_equal(["lon","lat","level","P","T"],vals.var_names)
417
+ assert_equal(276,vals.var("T").get.flatten.mean.floor)
418
+ vals = @cdo.stdatm(25,100,250,500,875,1400,2100,3000,4000,5000,:output => ofile,:options => "-f nc")
419
+ assert_equal(ofile,vals)
420
+ end
412
421
  FileUtils.rm(ofile)
413
422
  end
414
423
  def test_simple_returnCdf
415
- ofile0, ofile1 = @tempStore.newFile, @tempStore.newFile
416
- sum = @cdo.fldsum(:input => @cdo.stdatm(0,:options => "-f nc"),
417
- :returnCdf => true).var("P").get
418
- assert_equal(1013.25,sum.min)
419
- sum = @cdo.fldsum(:input => @cdo.stdatm(0,:options => "-f nc"),:output => ofile0)
420
- assert_equal(ofile0,sum)
421
- test_returnCdf
424
+ if @cdo.hasNetcdf then
425
+ ofile0, ofile1 = @tempStore.newFile, @tempStore.newFile
426
+ sum = @cdo.fldsum(:input => @cdo.stdatm(0,:options => "-f nc"),
427
+ :returnCdf => true).var("P").get
428
+ assert_equal(1013.25,sum.min)
429
+ sum = @cdo.fldsum(:input => @cdo.stdatm(0,:options => "-f nc"),:output => ofile0)
430
+ assert_equal(ofile0,sum)
431
+ test_returnCdf
432
+ else
433
+ puts "test_simple_returnCdf is disabled because of missing ruby-netcdf"
434
+ end
422
435
  end
423
436
  def test_readCdf
424
437
  input = "-settunits,days -setyear,2000 -for,1,4"
425
438
  cdfFile = @cdo.copy(:options =>"-f nc",:input=>input)
426
- cdf = @cdo.readCdf(cdfFile)
427
- assert_empty(['lon','lat','for','time'] - cdf.var_names)
439
+ if @cdo.hasNetcdf then
440
+ cdf = @cdo.readCdf(cdfFile)
441
+ assert_empty(['lon','lat','for','time'] - cdf.var_names)
442
+ else
443
+ assert_raises LoadError do
444
+ cdf = @cdo.readCdf(cdfFile)
445
+ end
446
+ end
428
447
  end
429
448
  def test_combine
430
449
  ofile0, ofile1 = @tempStore.newFile, @tempStore.newFile
431
450
  @cdo.fldsum(:input => @cdo.stdatm(25,100,250,500,875,1400,2100,3000,4000,5000,:options => "-f nc"),:output => ofile0)
432
451
  @cdo.fldsum(:input => "-stdatm,25,100,250,500,875,1400,2100,3000,4000,5000",:options => "-f nc",:output => ofile1)
433
- @cdo.returnCdf = true
434
452
  @tempStore.showFiles
435
- diff = @cdo.sub(:input => [ofile0,ofile1].join(' ')).var('T').get
436
- assert_equal(0.0,diff.min)
437
- assert_equal(0.0,diff.max)
438
- @cdo.returnCdf = false
453
+ if @cdo.hasNetcdf then
454
+ diff = @cdo.sub(:returnCdf => true, :input => [ofile0,ofile1].join(' ')).var('T').get
455
+ assert_equal(0.0,diff.min)
456
+ assert_equal(0.0,diff.max)
457
+ end
439
458
  end
440
459
  def test_readArray
441
- @cdo.debug = @@debug
442
- assert_equal([40,80],@cdo.readArray(@cdo.sellonlatbox(-10,10,-20,20,:input => '-topo',:options => '-f nc'), 'topo').shape)
460
+ if @cdo.hasNetcdf then
461
+ @cdo.debug = @@debug
462
+ assert_equal([40,80],@cdo.readArray(@cdo.sellonlatbox(-10,10,-20,20,:input => '-topo',:options => '-f nc'), 'topo').shape)
463
+ end
443
464
  end
444
465
  def test_env
445
466
  oTag = 'test_env_with_splitlevel_'
@@ -557,45 +578,57 @@ class TestCdo < Minitest::Test
557
578
  @cdo.help
558
579
  end
559
580
  def test_fillmiss
560
- @cdo.debug = @@debug
561
- # check up-down replacement
562
- rand = @cdo.setname('v',:input => '-random,r1x10 ', :options => ' -f nc',:output => '/tmp/rand.nc')
563
- cdf = @cdo.openCdf(rand)
564
- vals = cdf.var('v').get
565
- cdf.var('v').put(vals.sort)
566
- cdf.sync
567
- cdf.close
568
-
569
- missRange = '0.3,0.8'
570
- arOrg = @cdo.setrtomiss(missRange,:input => cdf.path,:returnMaArray => 'v')
571
- arFm = @cdo.fillmiss(:input => "-setrtomiss,#{missRange} #{cdf.path}",:returnMaArray => 'v')
572
- arFm1s= @cdo.fillmiss2(:input => "-setrtomiss,#{missRange} #{cdf.path}",:returnMaArray => 'v')
573
- vOrg = arOrg[0,0..-1]
574
- vFm = arFm[0,0..-1]
575
- vFm1s = arFm1s[0,0..-1]
576
- UnifiedPlot.linePlot([{:y => vOrg, :style => 'line',:title => 'org'},
577
- {:y => vFm, :style => 'points',:title => 'fillmiss'},
578
- {:y => vFm1s,:style => 'points',:title => 'fillmiss2'}],
579
- plotConf: {:yrange => '[0:1]'},title: 'r1x10') if @@show
580
- # check left-right replacement
581
- rand = @cdo.setname('v',:input => '-random,r10x1 ', :options => ' -f nc',:output => '/tmp/rand.nc')
582
- cdf = @cdo.openCdf(rand)
583
- vals = cdf.var('v').get
584
- cdf.var('v').put(vals.sort)
585
- cdf.sync
586
- cdf.close
587
-
588
- missRange = '0.3,0.8'
589
- arOrg = @cdo.setrtomiss(missRange,:input => cdf.path,:returnMaArray => 'v')
590
- arFm = @cdo.fillmiss(:input => "-setrtomiss,#{missRange} #{cdf.path}",:returnMaArray => 'v')
591
- arFm1s= @cdo.fillmiss2(:input => "-setrtomiss,#{missRange} #{cdf.path}",:returnMaArray => 'v')
592
- vOrg = arOrg[0..-1,0]
593
- vFm = arFm[0..-1,0]
594
- vFm1s = arFm1s[0..-1,0]
595
- UnifiedPlot.linePlot([{:y => vOrg, :style => 'line',:title => 'org'},
596
- {:y => vFm, :style => 'points',:title => 'fillmiss'},
597
- {:y => vFm1s,:style => 'points',:title => 'fillmiss2'}],
598
- plotConf: {:yrange => '[0:1]'},title: 'r10x1') if @@show
581
+ rand = @cdo.setname('v',
582
+ :input => '-random,r1x10 ',
583
+ :options => ' -f nc')
584
+
585
+ if @cdo.hasNetcdf then
586
+ @cdo.debug = @@debug
587
+ cdf = @cdo.openCdf(rand)
588
+ vals = cdf.var('v').get
589
+ cdf.var('v').put(vals.sort)
590
+ cdf.sync
591
+ cdf.close
592
+ else
593
+ assert_raises LoadError do
594
+ cdf = @cdo.openCdf(rand)
595
+ end
596
+ end
597
+
598
+ if @cdo.hasNetcdf then
599
+ missRange = '0.3,0.8'
600
+ arOrg = @cdo.setrtomiss(missRange,:input => cdf.path,:returnMaArray => 'v')
601
+ arFm = @cdo.fillmiss(:input => "-setrtomiss,#{missRange} #{cdf.path}",:returnMaArray => 'v')
602
+ arFm1s= @cdo.fillmiss2(:input => "-setrtomiss,#{missRange} #{cdf.path}",:returnMaArray => 'v')
603
+ vOrg = arOrg[0,0..-1]
604
+ vFm = arFm[0,0..-1]
605
+ vFm1s = arFm1s[0,0..-1]
606
+ UnifiedPlot.linePlot([{:y => vOrg, :style => 'line',:title => 'org'},
607
+ {:y => vFm, :style => 'points',:title => 'fillmiss'},
608
+ {:y => vFm1s,:style => 'points',:title => 'fillmiss2'}],
609
+ plotConf: {:yrange => '[0:1]'},title: 'r1x10') if @@show
610
+ # check left-right replacement
611
+ rm([rand])
612
+ rand = @cdo.setname('v',:input => '-random,r10x1 ', :options => ' -f nc',:output => '/tmp/rand.nc')
613
+ cdf = @cdo.openCdf(rand)
614
+ vals = cdf.var('v').get
615
+ cdf.var('v').put(vals.sort)
616
+ cdf.sync
617
+ cdf.close
618
+
619
+ missRange = '0.3,0.8'
620
+ arOrg = @cdo.setrtomiss(missRange,:input => cdf.path,:returnMaArray => 'v')
621
+ arFm = @cdo.fillmiss(:input => "-setrtomiss,#{missRange} #{cdf.path}",:returnMaArray => 'v')
622
+ arFm1s= @cdo.fillmiss2(:input => "-setrtomiss,#{missRange} #{cdf.path}",:returnMaArray => 'v')
623
+ vOrg = arOrg[0..-1,0]
624
+ vFm = arFm[0..-1,0]
625
+ vFm1s = arFm1s[0..-1,0]
626
+ UnifiedPlot.linePlot([{:y => vOrg, :style => 'line',:title => 'org'},
627
+ {:y => vFm, :style => 'points',:title => 'fillmiss'},
628
+ {:y => vFm1s,:style => 'points',:title => 'fillmiss2'}],
629
+ plotConf: {:yrange => '[0:1]'},title: 'r10x1') if @@show
630
+ rm([rand])
631
+ end
599
632
  end
600
633
 
601
634
  # opendap test - broken since 1.9.0
@@ -605,79 +638,3 @@ class TestCdo < Minitest::Test
605
638
  end if @@debug
606
639
  end
607
640
  end
608
-
609
- # # Calling simple operators
610
- # #
611
- # # merge:
612
- # # let files be an erray of valid filenames and ofile is a string
613
- # @cdo.merge(:input => outvars.join(" "),:output => ofile)
614
- # # or with multiple arrays:
615
- # @cdo.merge(:input => [ifiles0,ifiles1].flatten.join(' '),:output => ofile)
616
- # # selname:
617
- # # lets grep out some variables from ifile:
618
- # ["T","U","V"].each {|varname|
619
- # varfile = varname+".nc"
620
- # @cdo.selname(varname,:input => ifile,:output => varfile)
621
- # }
622
- # # a threaded version of this could look like:
623
- # ths = []
624
- # ["T","U","V"].each {|outvar|
625
- # ths << Thread.new(outvar) {|ovar|
626
- # varfile = varname+".nc"
627
- # @cdo.selname(varname,:input => ifile,:output => varfile)
628
- # }
629
- # }
630
- # ths.each {|th| th.join}
631
- # # another example with sub:
632
- # @cdo.sub(:input => [oldfile,newfile].join(' '), :output => diff)
633
- #
634
- # # It is possible too use the 'send' method
635
- # operator = /grb/.match(File.extname(ifile)) ? :showcode : :showname
636
- # inputVars = @cdo.send(operator,:input => ifile)
637
- # # show and info operators are writing to stdout. cdo.rb tries to collects this into arrays
638
- # #
639
- # # Same stuff with other operators:
640
- # operator = case var
641
- # when Fixnum then 'selcode'
642
- # when String then 'selname'
643
- # else
644
- # warn "Wrong usage of variable identifier for '#{var}' (class #{var.class})!"
645
- # end
646
- # @cdo.send(operator,var,:input => @ifile, :output => varfile)
647
- #
648
- # # Pass an array for operators with multiple options:
649
- # # Perform conservative remapping with pregenerated weights
650
- # @cdo.remap([gridfile,weightfile],:input => copyfile,:output => outfile)
651
- # # Create vertical height levels out of hybrid model levels
652
- # @cdo.ml2hl([0,20,50,100,200,400,800,1200].join(','),:input => hybridlayerfile, :output => reallayerfile)
653
- # # or use multiple arguments directly
654
- # @cdo.remapeta(vctfile,orofile,:input => ifile,:output => hybridlayerfile)
655
- #
656
- # # the powerfull expr operator:
657
- # # taken from the tutorial in https://code.zmaw.de/projects/cdo/wiki/Tutorial#The-_expr_-Operator
658
- # SCALEHEIGHT = 10000.0
659
- # C_EARTH_GRAV = 9.80665
660
- # # function for later computation of hydrostatic atmosphere pressure
661
- # PRES_EXPR = lambda {|height| "101325.0*exp((-1)*(1.602769777072154)*log((exp(#{height}/#{SCALEHEIGHT})*213.15+75.0)/288.15))"}
662
- # TEMP_EXPR = lambda {|height| "213.0+75.0*exp(-#{height}/#{SCALEHEIGHT})"}
663
- #
664
- # # Create Pressure and Temperature out of a height field 'geopotheight' from ifile
665
- # @cdo.expr("'p=#{PRES_EXPR['geopotheight']}'", :input => ifile, :output => presFile)
666
- # @cdo.expr("'t=#{TEMP_EXPR['geopotheight']}'", :input => ifile, :output => tempFile)
667
- #
668
- #
669
- # # TIPS: I often work with temporary files and for getting rid of handling them manually the CdoTempfileStore module can be used:
670
- # # Simply include the following methods into you scripts and use tfile for any temporary variable
671
- # def tfile
672
- # CdoTempfileStore.path
673
- # end
674
- # # As an example, the computation of simple atmospherric density could look like
675
- # presFile, tempFile = tfile, tfile
676
- # @cdo.expr("'p=#{PRES_EXPR['geopotheight']}'", :input => ifile, :output => presFile)
677
- # @cdo.expr("'t=#{TEMP_EXPR['geopotheight']}'", :input => ifile, :output => tempFile)
678
- # @cdo.chainCall("setname,#{rho} -divc,#{C_R} -div",in: [presFile,tempFile].join(' '), out: densityFile)
679
- #
680
- # # For debugging, it is helpfull, to avoid the automatic cleanup at the end of the scripts:
681
- # CdoTempfileStore.setPersist(true)
682
- # # creates randomly names files. Switch on debugging with
683
- # @cdo.Debug = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cdo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ralf Mueller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-19 00:00:00.000000000 Z
11
+ date: 2019-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: unifiedPlot
@@ -109,8 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  requirements: []
112
- rubyforge_project:
113
- rubygems_version: 2.7.4
112
+ rubygems_version: 3.0.2
114
113
  signing_key:
115
114
  specification_version: 4
116
115
  summary: Easy access to the Climate Data operators