iconPlot 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/gemspec +1 -1
- data/lib/iconPlot.rb +17 -17
- data/lib/icon_plot.ncl +111 -51
- data/lib/icon_plot_lib.ncl +227 -61
- data/test/test_iconPlot.rb +2 -2
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df59cf8fcb883833c0355e39533c5da8e3075d25
|
4
|
+
data.tar.gz: 8346f47771d4ce6573732e64986e928a05eb9878
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b0086f6cb9c924a88b124b560298971805f810437da1bd3b0682f3339aca3bc7a36af54ae8d5f976df00710cc7aa951e50061b483de699b605dde68593187b9
|
7
|
+
data.tar.gz: 25de6154c6143f65914063ae23a1e4096e57fbae0e4c5636bed530f456c5f8e8206186e0b254de92a436d19feebcc16f30e6388232ae51a7f53cc0259a553c3f
|
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 = "iconPlot"
|
6
|
-
s.version = '0.0.
|
6
|
+
s.version = '0.0.9'
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.files = ["lib/iconPlot.rb"] + ["gemspec"] + ["bin/nclsh"] + Dir.glob("lib/*ncl")
|
9
9
|
s.executables << 'nclsh'
|
data/lib/iconPlot.rb
CHANGED
@@ -35,7 +35,7 @@ class IconPlot < Struct.new(:caller,:plotter,:libdir,:otype,:display,:cdo,:debug
|
|
35
35
|
raise ArgumentError
|
36
36
|
end
|
37
37
|
|
38
|
-
opts[:tStrg] =
|
38
|
+
opts[:tStrg] = opts[:tStrg].nil? ? ofile : opts[:tStrg]
|
39
39
|
|
40
40
|
cmd = [self.caller,self.plotter].join(' ')
|
41
41
|
cmd << " -altLibDir=#{self.libdir} #{varIdent} -iFile=#{ifile} -oFile=#{ofile} -oType=#{self.otype}"
|
@@ -68,16 +68,16 @@ class IconPlot < Struct.new(:caller,:plotter,:libdir,:otype,:display,:cdo,:debug
|
|
68
68
|
exit -1
|
69
69
|
end
|
70
70
|
Cdo.debug = true
|
71
|
-
unit = Cdo.showunit(:
|
71
|
+
unit = Cdo.showunit(:input => "-selname,#{varname} #{ifile}").first
|
72
72
|
ExtCsvDiagram.plot_xy(icon,"datetime",varname,
|
73
73
|
"ICON: #{operation} on #{varname} (file:#{ifile})", # Change title here
|
74
|
-
|
75
|
-
|
74
|
+
:label_position => 'below',:skipColumnCheck => true,
|
75
|
+
:type => 'lines',:groupBy => ["depth"], :onlyGroupTitle => true,
|
76
76
|
# :addSettings => ["logscale y"], # Commend theses out for large scale values like Vert_Mixing_V
|
77
77
|
# :yrange => '[0.0001:10]', # Otherwise you'll see nothing reasonable
|
78
78
|
:terminal => true ? 'png' : 'x11',
|
79
79
|
:ylabel => "#{varname} [#{Shellwords.escape(unit)}]", # Correct the label if necessary
|
80
|
-
:input_time_format => "'%Y
|
80
|
+
:input_time_format => "'%Y-%m-%d %H:%M:%S'",
|
81
81
|
:filename => ofile,
|
82
82
|
:output_time_format => '"%d.%m.%y \n %H:%M"',:size => "1600,600")
|
83
83
|
return "#{ofile}.png"
|
@@ -85,7 +85,7 @@ class IconPlot < Struct.new(:caller,:plotter,:libdir,:otype,:display,:cdo,:debug
|
|
85
85
|
def scatterPlot(ifile,ofile,xVarname,yVarname,opts={})
|
86
86
|
# is there a variable which discribes different regions in the ocean
|
87
87
|
regionVar = opts[:regionVar].nil? ? 'rregio_c' : opts[:regionVar]
|
88
|
-
hasRegion = Cdo.showname(:
|
88
|
+
hasRegion = Cdo.showname(:input => ifile).join.split.include?(regionName)
|
89
89
|
unless hasRegion
|
90
90
|
warn "Variable '#{regionName}' for showing regions is NOT found in the input '#{ifile}'!"
|
91
91
|
warn "Going on without plotting regions!"
|
@@ -100,7 +100,7 @@ class IconPlot < Struct.new(:caller,:plotter,:libdir,:otype,:display,:cdo,:debug
|
|
100
100
|
FileUtils.rm(file) if File.exists?(file)
|
101
101
|
end
|
102
102
|
def show(*files)
|
103
|
-
files.flatten.each {|file| IO.popen("#{self.display} #{file} &") }
|
103
|
+
files.flatten.each {|file| out = IO.popen("#{self.display} #{file} &").read; puts out if self.debug }
|
104
104
|
end
|
105
105
|
def defaultPlot(ifile,ofile,opts={})
|
106
106
|
show(scalarPlot(ifile,ofile,'T',opts))
|
@@ -117,13 +117,13 @@ class IconPlot < Struct.new(:caller,:plotter,:libdir,:otype,:display,:cdo,:debug
|
|
117
117
|
IO.popen("echo 'date|time|depth|#{varname}' > #{dataFile}")
|
118
118
|
Cdo.debug = true
|
119
119
|
Cdo.outputkey('date,time,level,value',
|
120
|
-
:
|
120
|
+
:input => "-#{operation} -selname,#{varname} #{ifile} >>#{dataFile} 2>/dev/null")
|
121
121
|
|
122
122
|
# postprocessing for correct time values
|
123
123
|
data = []
|
124
124
|
File.open(dataFile).each_with_index {|line,lineIndex|
|
125
125
|
next if line.chomp.empty?
|
126
|
-
_t = line.chomp.gsub(/ +/,'|').split('|')
|
126
|
+
_t = line.chomp.sub(/^ /,'').gsub(/ +/,'|').split('|')
|
127
127
|
if 0 == lineIndex then
|
128
128
|
data << _t
|
129
129
|
next
|
@@ -131,14 +131,14 @@ class IconPlot < Struct.new(:caller,:plotter,:libdir,:otype,:display,:cdo,:debug
|
|
131
131
|
if "0" == _t[1] then
|
132
132
|
_t[1] = '00:00:00'
|
133
133
|
else
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
134
|
+
#time = _t[1].reverse
|
135
|
+
#timeStr = ''
|
136
|
+
#while time.size > 2 do
|
137
|
+
# timeStr << time[0,2] << ':'
|
138
|
+
# time = time[2..-1]
|
139
|
+
#end
|
140
|
+
#timeStr << time.ljust(2,'0') unless time.size == 0
|
141
|
+
#_t[1] = timeStr.reverse
|
142
142
|
end
|
143
143
|
data << _t
|
144
144
|
}
|
data/lib/icon_plot.ncl
CHANGED
@@ -55,7 +55,8 @@
|
|
55
55
|
end if
|
56
56
|
;------------------------------------------------------------------------------
|
57
57
|
;==============================================================================
|
58
|
-
VERSION = "0.0.
|
58
|
+
VERSION = "0.0.9"
|
59
|
+
; setfileoption("nc", "filestructure", "advanced")
|
59
60
|
;----- MAIN PROGRAM -----------------------------------------------------------
|
60
61
|
if (isvar("help")) then
|
61
62
|
dq = str_get_dq()
|
@@ -63,7 +64,7 @@
|
|
63
64
|
print("; Basic Usage:")
|
64
65
|
print("; ncl icon_plot.ncl 'iFile=" + dq + "path/file.nc" + dq + "' 'varName=" + dq + "ELEV" + dq + "' 'oFile=" + dq + "test" + dq + "' timeStep=1 levIndex=1")
|
65
66
|
print(";")
|
66
|
-
print("; Select
|
67
|
+
print("; Select a special area of the globe with mapLLC (LowerLeftCorner) and mapURC (UpperRightCorner) ")
|
67
68
|
print("; ncl icon_plot.ncl 'iFile=" + dq + "path/file.nc" + dq + "' 'varName=" + dq + "W" + dq + "' 'mapLLC=(/35.0, -8/)' 'mapURC=(/55, 8/)'")
|
68
69
|
print(";")
|
69
70
|
print("; Masking:")
|
@@ -98,7 +99,9 @@
|
|
98
99
|
print(";")
|
99
100
|
print("; Optional Parameter:")
|
100
101
|
print("; oType : output graphics format (ps, eps, png, default: eps)")
|
101
|
-
print(";
|
102
|
+
print("; xsize : width of plot (PNG only)")
|
103
|
+
print("; ysize : height of plot (PNG only)")
|
104
|
+
print("; resolution : resolution string which is used for remapping the icon data")
|
102
105
|
print("; to regular grid (default: r90x45)")
|
103
106
|
print("; vecRefLength : reference vector length (default: 8.0)")
|
104
107
|
print("; vecColByLen : should vectors get coloured according to their lengths (default:False)")
|
@@ -112,15 +115,15 @@
|
|
112
115
|
print("; mapLLC : (lon,lat) value array of the Lower Left Corner of the map")
|
113
116
|
print("; mapURC : (lon,lat) ------- || ------- Upper Right Corner of the map")
|
114
117
|
print("; use -180 to 180 for longitude !")
|
115
|
-
print("; secLC, secRC : start and
|
116
|
-
print("; section is plotted
|
117
|
-
print("; secMode : perform transection along a great
|
118
|
+
print("; secLC, secRC : start and end point of a vertical section (no default value)")
|
119
|
+
print("; section is plotted if secLC and secRC are present")
|
120
|
+
print("; secMode : perform transection along a great cricle or on a straight line")
|
118
121
|
print("; possible values: circle, straight (default)")
|
119
122
|
print("; : ATTENTION: using 'circle' for sections with a small angle wrt the equator is NOT RECOMMENDED")
|
120
123
|
print("; showSecMap : display the location of the vertical section in an additional map (default:true)")
|
121
124
|
print("; centerLon : center longitute for satelite view (default:30.)")
|
122
125
|
print("; centerLat : center latitude for satelite view (default:20.)")
|
123
|
-
print("; satDist :
|
126
|
+
print("; satDist : satellite distance (default:20.0)")
|
124
127
|
print("; scaleFactor : optional scale factor")
|
125
128
|
print("; fillMode : how to color contour plots,i.e. sets cnFillMode: CellFill or RasterFill (default:RasterFill)")
|
126
129
|
print("; selMode : mode for level spacing of the plot:")
|
@@ -128,14 +131,17 @@
|
|
128
131
|
print("; manual (automatic linear spacing with usage of minVar and maxVar)")
|
129
132
|
print("; auto (default: let do ncl the spacing)")
|
130
133
|
print("; scaleLimit : Limits the number of decades for levels in selMode-halflog")
|
131
|
-
print("; minVar/maxVar : min/maximal
|
134
|
+
print("; minVar/maxVar : min/maximal value to plot for selMode = 'manual' or 'halflog'")
|
132
135
|
print("; numLevs : set a number of labels for manual selMode only. NumCol=numLevs+2")
|
133
136
|
print("; (Not set directly, but used for computing the contour level spacing. default=10)")
|
134
137
|
print("; plotLevs : set individual contour levels, selMode is set to 'manual' automatically")
|
135
138
|
print("; mapType : projection type (default: lonlat), other: ortho (not compatible with showGrid), NHps")
|
136
139
|
print("; and SHps (polar stereographic projections centered at the north and south pole respectively),")
|
137
140
|
print("; sat (satelite view, use option centerLat, centerLon and satDist)")
|
138
|
-
print("; hov
|
141
|
+
print("; hov[Depth] : plot hovmoeller diagram, expects variable with only two 'active' dimensions, i.e. time/depth")
|
142
|
+
print("; hovCut : plot hovmoeller diagram, input is 'levIndex' and 'hovLC' 'hovRC'")
|
143
|
+
print("; hovLC, hovRC : start and end point of a section for hovCut - currently same longitude allowed only,")
|
144
|
+
print("; the Northern and Southern values are used as plotting boundaries; switches to hovCut")
|
139
145
|
print("; mapLine : (logical) draws continent lines on the plot (foreground/transparent)")
|
140
146
|
print("; maskName : variable to mask with. maskName is expected NOT to have time dimension")
|
141
147
|
print("; 'maskName=" + dq + "none" + dq + "' is same as default (no mask variable)")
|
@@ -146,17 +152,17 @@
|
|
146
152
|
print("; lStrg : left string")
|
147
153
|
print("; rStrg : right string")
|
148
154
|
print("; tStrg : title string")
|
149
|
-
print("; bStrg : base string - default is
|
155
|
+
print("; bStrg : base string - default is program name and time stamp only")
|
150
156
|
print("; maxView : (logical) maximize plot area on paper (not for buildbot -> convert to png)")
|
151
157
|
print("; colormap : string for predefined colormaps of the plot (e.g. 'colormap=" + dq + "BlAqGrYeOrReVi200" + dq + "')")
|
152
158
|
print("; withLines : draw lines between each contour color (default:True)")
|
153
|
-
print("; withLineLabels: label the countour lines with
|
159
|
+
print("; withLineLabels: label the countour lines with their values (auto-enable withLines, default:False)")
|
154
160
|
print("; showGrid : display polygon lines with filled colors instead of contour plot")
|
155
161
|
print("; markCells : mark cell centers with dots")
|
156
162
|
print("; showNcd : display NDC Grid to find Normalized Device Coordinates on the plot")
|
157
163
|
print("; k2c : if True, perform Kelvin2Celsius shift (default:True)")
|
158
164
|
print(";")
|
159
|
-
print(";
|
165
|
+
print("; ATMOSPHERE STUFF:")
|
160
166
|
print("; atmLev : chooses vertical plot levels for atmosphere input (h: height,p:pressure,m:modellevel,default:p)")
|
161
167
|
print(";---------------------------------------------------------------")
|
162
168
|
print("; altLibDir : Alternative directory for loading icon_plot_lib.ncl")
|
@@ -374,30 +380,37 @@
|
|
374
380
|
end if
|
375
381
|
end if
|
376
382
|
|
377
|
-
if (
|
378
|
-
print("Please provide secLC AND secRC for
|
383
|
+
if ((isvar("secLC").or.isvar("secRC")).ne.(isvar("secLC").and.isvar("secRC"))) then
|
384
|
+
print("Please provide secLC AND secRC for generating a section plot!")
|
379
385
|
exit
|
380
386
|
end if
|
381
387
|
if (isvar("secLC").and.isvar("secRC")) plotMode = "section" end if
|
382
|
-
|
388
|
+
|
389
|
+
if ((isvar("hovLC").or.isvar("hovRC")).ne.(isvar("hovLC").and.isvar("hovRC"))) then
|
390
|
+
print("Please provide hovLC AND hovRC for generating a Hovmoeller plot!")
|
391
|
+
exit
|
392
|
+
end if
|
393
|
+
if (isvar("hovLC").and.isvar("hovRC")) plotMode = "hovmoeller" end if
|
394
|
+
if (isvar("hovDepth").or.isvar("hovCut").or.(isvar("hov"))) plotMode = "hovmoeller" end if
|
383
395
|
|
384
396
|
if (plotMode.eq."vector" .or. plotMode.eq."overlay" .or. plotMode.eq."section") then
|
385
397
|
if (horizonalGridType .ne. "unstructured") then ; regular grid expected, i.e. remappgin is NOT required
|
386
398
|
rFile = addfile(iFile+".nc","r")
|
387
399
|
else
|
388
|
-
;
|
400
|
+
; perform some remapping to a regular grid because ncl cannot draw vector
|
389
401
|
; from unstructured grids
|
390
402
|
; TODO addVars=(/ "PS","PHIS"/)
|
391
|
-
|
403
|
+
operator = "remapnn"
|
404
|
+
remapFilename = setRemapFilename(iFile,iType,resolution,atmLev,operator)
|
392
405
|
print("remapFilename:"+remapFilename)
|
393
406
|
if (.not. checkRemappedFile(iFile,remapFilename,ivarname,iType,atmLev,atmPLevs,atmHLevs) ) then
|
394
407
|
addVars=(/""/)
|
395
408
|
print("PERFORM remapnn again!")
|
396
|
-
remapForVecPlot(iFile,remapFilename,resolution,useMask,plotMode,DEBUG,addVars)
|
409
|
+
remapForVecPlot(iFile,remapFilename,resolution,useMask,plotMode,DEBUG,addVars,operator)
|
397
410
|
end if
|
398
411
|
rFile = addfile( remapFilename+".nc", "r" )
|
399
412
|
end if
|
400
|
-
;if (plotMode .eq. "
|
413
|
+
;if (plotMode .eq. "hovmoeller") then ; perform zonmean
|
401
414
|
; zonmeanFilename = setZonmeanFilename(remapFilename,ivarname,atmLev)
|
402
415
|
; zonmean4HoffmuellerPlot(remapFilename,ivarname,zonmeanFilename)
|
403
416
|
;end if
|
@@ -437,6 +450,7 @@
|
|
437
450
|
print("oFile = "+oFile)
|
438
451
|
print("Graphics format is " +oType)
|
439
452
|
print("plotMode = "+plotMode)
|
453
|
+
print("showGrid = "+showGrid)
|
440
454
|
|
441
455
|
if (plotMode.eq."scalar" .or. plotMode.eq."section" .or. plotMode.eq."hovmoeller") then
|
442
456
|
print("varName = "+varName)
|
@@ -465,24 +479,6 @@
|
|
465
479
|
|
466
480
|
var = selField(varName,File,timeStep,levIndex,horizonalGridType)
|
467
481
|
|
468
|
-
if (horizonalGridType .eq. "unstructured") then
|
469
|
-
if (isvar("gridFile")) then
|
470
|
-
x = getCoordinateFromFile(lonCo,gridFile)
|
471
|
-
y = getCoordinateFromFile(latCo,gridFile)
|
472
|
-
if (showGrid) then
|
473
|
-
bounds = getBoundsFromFile(lonCo,latCo,gridFile)
|
474
|
-
end if
|
475
|
-
else
|
476
|
-
lonlatSizes = getCoordSizes(var,File)
|
477
|
-
x = new(lonlatSizes(0),double)
|
478
|
-
y = new(lonlatSizes(1),double)
|
479
|
-
getLonLats(var,File,x,y)
|
480
|
-
if (showGrid) then
|
481
|
-
bounds = getBoundsOfCoordinates(var,File)
|
482
|
-
end if
|
483
|
-
end if
|
484
|
-
end if
|
485
|
-
|
486
482
|
scaleVar(var,scaleFactor)
|
487
483
|
|
488
484
|
; set minVar_maxVar for plotting
|
@@ -562,6 +558,10 @@
|
|
562
558
|
; make the plot
|
563
559
|
;---------------------------------------------------------------
|
564
560
|
; preparations
|
561
|
+
if (oType .eq. "png") then
|
562
|
+
if(isvar("xsize")) oType@wkWidth = xsize end if
|
563
|
+
if(isvar("ysize")) oType@wkHeight = ysize end if
|
564
|
+
end if
|
565
565
|
wks = gsn_open_wks(oType,oFile)
|
566
566
|
|
567
567
|
gsn_define_colormap(wks,colormap)
|
@@ -570,7 +570,7 @@
|
|
570
570
|
drawNDCGrid(wks)
|
571
571
|
end if
|
572
572
|
|
573
|
-
ResC = setDefaultResource(True,withLines,withLineLabels,fillMode)
|
573
|
+
ResC = setDefaultResource(True,withLines,withLineLabels,fillMode,mapType)
|
574
574
|
|
575
575
|
if (.not. userColors) setDefaultColors(ResC,minVar,maxVar,DEBUG) end if
|
576
576
|
|
@@ -578,10 +578,28 @@
|
|
578
578
|
|
579
579
|
if (useMask) setMaskColor(wks,ResC) end if
|
580
580
|
|
581
|
-
|
582
|
-
if (getHorizGridType(iFile,ivarname,isIcon) .eq. "unstructured") then
|
581
|
+
if (horizonalGridType .eq. "unstructured" .or. horizonalGridType .eq. "curvilinear") then
|
583
582
|
if (plotMode.eq."scalar" .or. plotMode.eq."overlay")
|
584
|
-
|
583
|
+
if (horizonalGridType .eq. "unstructured") then
|
584
|
+
if (isvar("gridFile")) then
|
585
|
+
;TODO: fix x,y creation for external gridfile (plot restart data)
|
586
|
+
coords = setCoordinatesFromExtraFile(lonCo,latCo,gridFile,var,ResC)
|
587
|
+
if (showGrid) then
|
588
|
+
bounds = getBoundsFromFile(lonCo,latCo,gridFile)
|
589
|
+
end if
|
590
|
+
else
|
591
|
+
if (showGrid) then
|
592
|
+
bounds = getBoundsOfCoordinates(var,File)
|
593
|
+
end if
|
594
|
+
end if
|
595
|
+
end if
|
596
|
+
end if
|
597
|
+
if (.not.isvar("coords")) then
|
598
|
+
if (isvar("rFile")) then
|
599
|
+
coords = setCoordinates(ResC,rFile,var)
|
600
|
+
else
|
601
|
+
coords = setCoordinates(ResC,File,var)
|
602
|
+
end if
|
585
603
|
end if
|
586
604
|
end if
|
587
605
|
|
@@ -608,7 +626,11 @@
|
|
608
626
|
|
609
627
|
setMapType(ResC,mapType,centerLon,centerLat,satDist)
|
610
628
|
|
611
|
-
|
629
|
+
if (isvar("limitMap")) then
|
630
|
+
limitMap2Coords(ResC)
|
631
|
+
else
|
632
|
+
selMapCut(ResC,mapLLC,mapURC)
|
633
|
+
end if
|
612
634
|
|
613
635
|
setMapVisibility(ResC,mapLine)
|
614
636
|
|
@@ -654,29 +676,67 @@
|
|
654
676
|
draw(plot)
|
655
677
|
end if
|
656
678
|
if (plotMode.eq."scalar") then
|
657
|
-
if (DEBUG .and. horizonalGridType.eq."unstructured") print("Gridtype is "+getGridType(var)) end if
|
679
|
+
;if (DEBUG .and. horizonalGridType.eq."unstructured") print("Gridtype is "+getGridType(var)) end if
|
680
|
+
if ( horizonalGridType .eq. "curvilinear") then
|
681
|
+
ResC@cnFillMode = "CellFill"
|
682
|
+
end if
|
683
|
+
if (showGrid ) then
|
684
|
+
if ( horizonalGridType .eq. "curvilinear") then
|
685
|
+
ResC@cnLinesOn = False
|
686
|
+
ResC@cnFillMode = "CellFill"
|
687
|
+
ResC@cnCellFillEdgeColor = "black" ;-- set edge color (default: -1 transparent)
|
688
|
+
ResC@cnCellFillMissingValEdgeColor = "grey" ;-- set miss val edge color (default: -1 transparent)
|
689
|
+
end if
|
690
|
+
end if
|
658
691
|
plot = gsn_csm_contour_map(wks,var,ResC)
|
659
|
-
|
660
692
|
if (showGrid) then
|
661
|
-
if (
|
693
|
+
if (horizonalGridType .eq. "unstructured") then
|
694
|
+
;=======================================================================================
|
695
|
+
;plotGrid(wks,plot,var,coords(1,:),bounds,File,ResC,DEBUG)
|
696
|
+
boundslon = bounds(0,:,:)
|
697
|
+
boundslat = bounds(1,:,:)
|
698
|
+
pres = plotGrid_62(wks,plot,var,boundslon,boundslat)
|
699
|
+
gsid = gsn_add_polygon(wks,plot,ndtooned(boundslon),ndtooned(boundslat),pres)
|
700
|
+
; }}}
|
701
|
+
;=======================================================================================
|
702
|
+
end if
|
703
|
+
if ( horizonalGridType .ne. "curvilinear" .and. horizonalGridType .ne. "unstructured") then
|
662
704
|
print("#=====================================================================")
|
663
705
|
print("Grid representation is only implemented for the unstructured ICON grid")
|
664
706
|
exit
|
665
707
|
end if
|
666
|
-
plotGrid(wks,plot,var,x,bounds,File,ResC,DEBUG)
|
667
708
|
end if
|
668
709
|
if ( markCells ) then
|
710
|
+
x = coords(0,:)
|
711
|
+
y = coords(1,:)
|
669
712
|
plotCellMarkers(x,y,wks,plot,True)
|
670
713
|
end if
|
714
|
+
draw(plot)
|
671
715
|
end if
|
672
716
|
if (plotMode.eq."scatter") then
|
673
717
|
plot = gsn_csm_xy(wks,xvar,yvar,ResC)
|
674
718
|
end if
|
675
719
|
if (plotMode .eq. "hovmoeller") then ; create hoffmuelle diagram
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
720
|
+
if (isvar("hovDepth").or.(isvar("hov"))) then
|
721
|
+
; select the whole time series
|
722
|
+
; and plot it with
|
723
|
+
ResC@trYReverse = True
|
724
|
+
plot = gsn_csm_hov(wks, var(depth|:,time|:,lat|0,lon|0), ResC)
|
725
|
+
end if
|
726
|
+
if (isvar("hovRC")) then
|
727
|
+
startLon = hovRC(0)
|
728
|
+
northLat = hovRC(1)
|
729
|
+
endLon = hovLC(0)
|
730
|
+
southLat = hovLC(1)
|
731
|
+
hovCut = True
|
732
|
+
end if
|
733
|
+
if (isvar("hovCut")) then
|
734
|
+
;plot = gsn_csm_hov(wks, var(depth|0,time|:,lat|:,lon|0), ResC)
|
735
|
+
;plot = gsn_csm_lat_time(wks, var(depth|0,time|:,lat|:,lon|0), ResC)
|
736
|
+
;plot = gsn_csm_lat_time(wks, var(depth|0,lat|:,lon|165,time|:), ResC)
|
737
|
+
;plot = gsn_csm_hov(wks, var({depth|150},{lat|70:-80},{lon|330},time|:), ResC)
|
738
|
+
plot = gsn_csm_hov(wks, var(depth|levIndex,{lat|northLat:southLat},{lon|startLon},time|:), ResC)
|
739
|
+
end if
|
680
740
|
end if
|
681
741
|
if (plotMode.eq."section") then
|
682
742
|
|
@@ -687,7 +747,7 @@
|
|
687
747
|
end if
|
688
748
|
points = ispan(0,secPoints-1,1)*1.0
|
689
749
|
|
690
|
-
res = setDefaultSectionResource(points,secPoints,secLC,secRC)
|
750
|
+
res = setDefaultSectionResource(points,secPoints,secLC,secRC,withLines,withLineLabels)
|
691
751
|
setAutomaticPlotCaptions(res,plotMode,varName,File,iFile,timeStep,levIndex,iType,atmLev,k2c)
|
692
752
|
setLevels(selMode,res,minVar,maxVar,scaleLimit,numLevs,DEBUG)
|
693
753
|
setSectionVertLabel(res,iType,atmLev)
|
data/lib/icon_plot_lib.ncl
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
;---------------------------------------------------------------
|
2
2
|
; ICON PLOT LIB
|
3
3
|
; This library aimes to provide an abstract way to access and plot ICON data
|
4
|
-
; fields from NetCDF files. It should
|
5
|
-
; *
|
4
|
+
; fields from NetCDF files. It should obey some general requirements:
|
5
|
+
; * Dont-Repeat-Yourself-Principle: Every method has one responsibility, which no
|
6
6
|
; other method has. Or in other words: Don't just CopyAndPaste.
|
7
7
|
; * Use as much information from the input files as possible. If something is
|
8
|
-
; missing, create a better file or let the user input this
|
9
|
-
; information. Examples are coordinates of data
|
8
|
+
; missing, create a better file or let the user input this piece of
|
9
|
+
; information. Examples are coordinates of data variables and bounds of them.
|
10
10
|
; There are attributes for this.
|
11
11
|
; * naming conventions:
|
12
12
|
; # check* methods are procedure which can exit the whole program
|
13
|
-
; # get* methods are functions with return, what they
|
13
|
+
; # get* methods are functions with return, what they describe with their
|
14
14
|
; name. This is similar to NCL itself, e.g. getfilevardims()
|
15
15
|
; # set* methods are procedures
|
16
16
|
;---------------------------------------------------------------
|
17
17
|
; Authors : Ralf Mueller (ralf.mueller@zmaw.de)
|
18
18
|
; Stephan Lorenz (stephan.lorenz@zmaw.de)
|
19
|
-
; VERSION = "0.0.
|
19
|
+
; VERSION = "0.0.9"
|
20
20
|
;-------------------------------------------------------------------------------
|
21
21
|
; some global defaults
|
22
22
|
DEFAULTLON = "clon"
|
@@ -29,9 +29,10 @@
|
|
29
29
|
DEFAULTCOLOR = "BlueDarkRed18" ; ncolors = 256
|
30
30
|
DEFAULTCOLOR = "BlueWhiteOrangeRed" ; ncolors = 256
|
31
31
|
;-------------------------------------------------------------------------------
|
32
|
-
|
32
|
+
undef("setCDO")
|
33
|
+
procedure setCDO(path2Cdo)
|
33
34
|
begin
|
34
|
-
CDO=
|
35
|
+
CDO=path2Cdo
|
35
36
|
end
|
36
37
|
;-------------------------------------------------------------------------------
|
37
38
|
; signum function
|
@@ -44,16 +45,62 @@ begin
|
|
44
45
|
return(val/abs(val))
|
45
46
|
end if
|
46
47
|
end
|
48
|
+
;---------------------------------------------------------------
|
49
|
+
; return ncl version string
|
50
|
+
undef("getNclVersion")
|
51
|
+
function getNclVersion()
|
52
|
+
begin
|
53
|
+
version_string = systemfunc("ncl -V")
|
54
|
+
version_array = str_split(version_string, ".")
|
55
|
+
; use integers instead
|
56
|
+
return stringtointeger(version_array)
|
57
|
+
end
|
58
|
+
;---------------------------------------------------------------
|
59
|
+
; return true if ncl uses groups for netcdf4 input (release 6.1.1 with netcdf4 input)
|
60
|
+
undef("versionWithNC4GroupNotationSupport")
|
61
|
+
function versionWithNC4GroupNotationSupport()
|
62
|
+
begin
|
63
|
+
return (/6,1,1/)
|
64
|
+
end
|
65
|
+
undef("versionIsGE")
|
66
|
+
function versionIsGE(otherVersion)
|
67
|
+
begin
|
68
|
+
return True
|
69
|
+
diff = otherVersion .gt. getNclVersion()
|
70
|
+
print(""+diff)
|
71
|
+
do i=0,dimsizes(diff)
|
72
|
+
if (.not. diff(i)) then
|
73
|
+
return False
|
74
|
+
end if
|
75
|
+
end do
|
76
|
+
return True
|
77
|
+
end
|
78
|
+
;-------------------------------------------------------------------------------
|
79
|
+
; return a filehandle that can access variables names without leading '/' even
|
80
|
+
; if the input it nc4 and ncl has version 6.1.1 or above
|
81
|
+
undef("nc4Aware_addfile")
|
82
|
+
function nc4Aware_addfile(filename,debug)
|
83
|
+
begin
|
84
|
+
filehandle = addfile( filename, "r" )
|
85
|
+
filetype = get_file_version(filehandle)
|
86
|
+
if debug then
|
87
|
+
print("[nc4Aware_addfile]Read in file:'" + filename +"'")
|
88
|
+
print("[nc4Aware_addfile] Filetype:'" + filetype +"'")
|
89
|
+
print("[nc4Aware_addfile]NCL version:'" + str_join(getNclVersion(),".") +"'")
|
90
|
+
print("[nc4Aware_addfile]version > 611'" + versionIsGE((/6,1,1/)) )
|
91
|
+
end if
|
92
|
+
if ((get_file_version(filehandle) .eq. "NETCDF4") .and. versionIsGE((/6,1,1/))) then
|
93
|
+
print("[nc4Aware_addfile]switch to root group '/'")
|
94
|
+
;filehandle = filehandle=>/
|
95
|
+
end if
|
96
|
+
return filehandle
|
97
|
+
end
|
47
98
|
;-------------------------------------------------------------------------------
|
48
99
|
; Is the 'time' variable a dimesions in the input dimensions array?
|
49
100
|
undef("has_time")
|
50
101
|
function has_time(dims)
|
51
102
|
begin
|
52
|
-
|
53
|
-
return(True)
|
54
|
-
else
|
55
|
-
return(False)
|
56
|
-
end if
|
103
|
+
return any(dims.eq."time")
|
57
104
|
end
|
58
105
|
;-------------------------------------------------------------------------------
|
59
106
|
; Has the input variable the dimension 'time'?
|
@@ -74,7 +121,7 @@ function has_var(filehandle,varname)
|
|
74
121
|
begin
|
75
122
|
vNames = getfilevarnames(filehandle)
|
76
123
|
n = dimsizes (vNames)
|
77
|
-
do i=0,n-1 ; loop
|
124
|
+
do i=0,n-1 ; loop through each variable
|
78
125
|
if (vNames(i).eq.varname) return True end if
|
79
126
|
end do
|
80
127
|
return False
|
@@ -103,7 +150,7 @@ begin
|
|
103
150
|
end
|
104
151
|
;-------------------------------------------------------------------------------
|
105
152
|
; Read a horizontal field of the variable 'varname' from the given filehandle.
|
106
|
-
; If it is time
|
153
|
+
; If it is time dependant or has a vertical axis, use the given values for
|
107
154
|
; timstep and levelindex for selecting the field.
|
108
155
|
;
|
109
156
|
; Currently this limited to 3 dimensions, so that 4D tracer variables are ignored
|
@@ -368,15 +415,17 @@ end
|
|
368
415
|
;-------------------------------------------------------------------------------
|
369
416
|
; Return the coordinates of a given variable in degrees
|
370
417
|
undef("getLonLats")
|
371
|
-
procedure getLonLats(variable,filehandle,x,y)
|
418
|
+
procedure getLonLats(variable,filehandle,x,y,isicon)
|
372
419
|
begin
|
373
420
|
lonlat = str_split(variable@coordinates," ")
|
374
421
|
lon = lonlat(0)
|
375
422
|
lat = lonlat(1)
|
376
423
|
x = filehandle->$lon$
|
377
424
|
y = filehandle->$lat$
|
378
|
-
|
379
|
-
|
425
|
+
if (isicon) then
|
426
|
+
x = x * RAD2DEG
|
427
|
+
y = y * RAD2DEG
|
428
|
+
end if
|
380
429
|
end
|
381
430
|
;-------------------------------------------------------------------------------
|
382
431
|
; get variable from a certain file
|
@@ -401,7 +450,7 @@ end
|
|
401
450
|
; Examples:
|
402
451
|
; (/1,2,5,10,20,50,100,200,500/) or
|
403
452
|
; (/-1,-5e-1,-2e-1,-1e-1,-5e-2,-2e-2,-1e-2,0,1e-2,2e-2,5e-2,1e-1,2e-1,5e-1,1/)
|
404
|
-
; scaleLimit determines the
|
453
|
+
; scaleLimit determines the number of decades on the positive or negative axis of the output array
|
405
454
|
undef("createLevels")
|
406
455
|
function createLevels(minVar, maxVar, scaleLimit)
|
407
456
|
begin
|
@@ -486,6 +535,7 @@ begin
|
|
486
535
|
end
|
487
536
|
;---------------------------------------------------------------
|
488
537
|
; Print information about dimensions and attributes of a given varaiable
|
538
|
+
undef("printVar")
|
489
539
|
procedure printVar(varname, filehandle)
|
490
540
|
begin
|
491
541
|
dims = getfilevardims(filehandle,varname)
|
@@ -590,9 +640,9 @@ end
|
|
590
640
|
;---------------------------------------------------------------
|
591
641
|
; set filename for the automatically remapped file
|
592
642
|
undef("setRemapFilename")
|
593
|
-
function setRemapFilename(filename,itype,resolution,atmlev)
|
643
|
+
function setRemapFilename(filename,itype,resolution,atmlev,operator)
|
594
644
|
begin
|
595
|
-
return setNewFilename(filename,"
|
645
|
+
return setNewFilename(filename,operator+"_"+resolution,itype,atmlev)
|
596
646
|
end
|
597
647
|
undef("setZonmeanFilename")
|
598
648
|
function setZonmeanFilename(filename,itype,atmlev)
|
@@ -600,7 +650,7 @@ begin
|
|
600
650
|
return setNewFilename(filename,"zonmean",itype,atmlev)
|
601
651
|
end
|
602
652
|
;---------------------------------------------------------------
|
603
|
-
; Check, if two files have the same number of
|
653
|
+
; Check, if two files have the same number of time steps. Exit otherwise
|
604
654
|
undef("checkRemappedFile")
|
605
655
|
function checkRemappedFile(infilename,remapfilename,varname,itype,atmlev,atmplevs,atmhlevs)
|
606
656
|
begin
|
@@ -676,13 +726,13 @@ end
|
|
676
726
|
; Perform a remapping (wich CDO) to a regular grid with a given resolution and return the
|
677
727
|
; filename of the remapped file. If the file is already present, the name is returned only
|
678
728
|
undef("remapForVecPlot")
|
679
|
-
procedure remapForVecPlot(iFile,remapFilename,resolution,useMask,plotMode,debug,addvars)
|
729
|
+
procedure remapForVecPlot(iFile,remapFilename,resolution,useMask,plotMode,debug,addvars,operator)
|
680
730
|
begin
|
681
731
|
if (plotMode.eq."section") then vecVars=(/varName/) end if
|
682
732
|
print("#=====================================================================================")
|
683
733
|
print("Looking for remapped file: "+remapFilename)
|
684
734
|
print("Use CDO to perform remapping: Create intermediate file: "+remapFilename)
|
685
|
-
print("Remove this intermediate file, if it was NOT automatically created from your
|
735
|
+
print("Remove this intermediate file, if it was NOT automatically created from your input file "+iFile+"!")
|
686
736
|
variables = str_join(vecVars,",")
|
687
737
|
if ( addvars(0) .ne. "")
|
688
738
|
variables = str_concat((/variables,",",str_join(addvars,",")/))
|
@@ -694,7 +744,7 @@ begin
|
|
694
744
|
end if
|
695
745
|
if (plotMode.eq."overlay") variables = variables+","+varName end if
|
696
746
|
|
697
|
-
cmd = CDO+" -P 8 -
|
747
|
+
cmd = CDO+" -P 8 -"+operator+","+resolution+" -selname,"+variables+" "+iFile+" "+remapFilename
|
698
748
|
if debug then
|
699
749
|
print(cmd)
|
700
750
|
end if
|
@@ -712,7 +762,7 @@ begin
|
|
712
762
|
system(cmd)
|
713
763
|
end
|
714
764
|
;---------------------------------------------------------------
|
715
|
-
; Return the bounds of the coordinates of
|
765
|
+
; Return the bounds of the coordinates of a given variable
|
716
766
|
undef("getBoundsOfCoordinates")
|
717
767
|
function getBoundsOfCoordinates(variable,filehandle)
|
718
768
|
begin
|
@@ -729,7 +779,7 @@ begin
|
|
729
779
|
return (/boundslon, boundslat/)
|
730
780
|
end
|
731
781
|
;---------------------------------------------------------------
|
732
|
-
; Return the bounds of the coordinates of
|
782
|
+
; Return the bounds of the coordinates of a given variable
|
733
783
|
undef("getBoundsFromFile")
|
734
784
|
function getBoundsFromFile(lonname,latname,filename)
|
735
785
|
begin
|
@@ -839,23 +889,12 @@ begin
|
|
839
889
|
end if
|
840
890
|
end
|
841
891
|
;---------------------------------------------------------------
|
842
|
-
;
|
843
|
-
undef("
|
844
|
-
|
892
|
+
; set the lines and their labels
|
893
|
+
undef("setLineAndLineLabels")
|
894
|
+
procedure setLineAndLineLabels(resource,withLines,withLineLabels)
|
845
895
|
begin
|
846
|
-
resource = True
|
847
|
-
resource@gsnMaximize = False
|
848
|
-
resource@gsnFrame = False
|
849
|
-
resource@gsnDraw = True
|
850
|
-
resource@gsnSpreadColors = True
|
851
|
-
resource@cnFillOn = True
|
852
|
-
|
853
896
|
; lines/labels inside the plot ================================================
|
854
|
-
|
855
|
-
resource@cnLinesOn = True
|
856
|
-
else
|
857
|
-
resource@cnLinesOn = False
|
858
|
-
end if
|
897
|
+
resource@cnLinesOn = False
|
859
898
|
resource@cnLineLabelsOn = False
|
860
899
|
if (withLineLabels ) then
|
861
900
|
withLines = True
|
@@ -864,7 +903,23 @@ begin
|
|
864
903
|
resource@cnLineLabelFontThicknessF = 0.006
|
865
904
|
end if
|
866
905
|
if (withLines) resource@cnLinesOn = True end if
|
906
|
+
end
|
907
|
+
;---------------------------------------------------------------
|
908
|
+
; Create a default NCL resource
|
909
|
+
undef("setDefaultResource")
|
910
|
+
function setDefaultResource(verticallabelbar,withLines,withLineLabels,fillmode,maptype)
|
911
|
+
begin
|
912
|
+
resource = True
|
913
|
+
resource@gsnMaximize = False
|
914
|
+
resource@gsnFrame = False
|
915
|
+
resource@gsnDraw = True
|
916
|
+
resource@gsnSpreadColors = True
|
917
|
+
resource@cnFillOn = True
|
918
|
+
|
919
|
+
resource@mapType = maptype
|
867
920
|
|
921
|
+
; lines/labels inside the plot ================================================
|
922
|
+
setLineAndLineLabels(resource,withLines,withLineLabels)
|
868
923
|
; representation of missing values ===========================================
|
869
924
|
delete(resource@cnMissingValFillPattern); no longer filling missing value areas
|
870
925
|
delete(resource@cnMissingValFillColor); no longer filling missing value areas
|
@@ -909,7 +964,7 @@ begin
|
|
909
964
|
end
|
910
965
|
;---------------------------------------------------------------
|
911
966
|
undef("setDefaultSectionResource")
|
912
|
-
function setDefaultSectionResource(points,secpoints,seclc,secrc)
|
967
|
+
function setDefaultSectionResource(points,secpoints,seclc,secrc,withLines,withLineLabels)
|
913
968
|
begin
|
914
969
|
resource = True; plot mods desired
|
915
970
|
resource@gsnFrame = False; don't turn page yet
|
@@ -930,10 +985,6 @@ begin
|
|
930
985
|
resource@cnFillOn = True; turn on color
|
931
986
|
resource@lbLabelAutoStride = True; nice label bar label stride
|
932
987
|
resource@gsnSpreadColors = True; use full range of colormap
|
933
|
-
resource@cnLinesOn = False; turn off countour lines
|
934
|
-
; if (useContourLines)
|
935
|
-
resource@cnLinesOn = False
|
936
|
-
resource@cnLineLabelsOn = False
|
937
988
|
resource@lbOrientation = "vertical"; vertical label bar
|
938
989
|
resource@pmLabelBarOrthogonalPosF = -0.05; move label bar closer to plot
|
939
990
|
resource@lbTitlePosition = "Bottom"
|
@@ -953,6 +1004,9 @@ begin
|
|
953
1004
|
;resource@gsnYAxisIrregular2Log = True
|
954
1005
|
resource@cnFillMode = "RasterFill"
|
955
1006
|
resource@cnRasterSmoothingOn = False
|
1007
|
+
|
1008
|
+
; lines/labels inside the plot ================================================
|
1009
|
+
setLineAndLineLabels(resource,withLines,withLineLabels)
|
956
1010
|
return resource
|
957
1011
|
end
|
958
1012
|
;---------------------------------------------------------------
|
@@ -1026,7 +1080,8 @@ end
|
|
1026
1080
|
undef("setBaseString")
|
1027
1081
|
procedure setBaseString(workstation,plot,resource,basestring)
|
1028
1082
|
begin
|
1029
|
-
resource@txFontHeightF = 0.01 ; if this is changed, please adjust
|
1083
|
+
resource@txFontHeightF = 0.01 ; if this is changed, please adjust
|
1084
|
+
; the implementation of getLshiftForNDCString()
|
1030
1085
|
gsn_text_ndc(workstation,basestring,getLshiftForNDCString(basestring),.01,resource)
|
1031
1086
|
end
|
1032
1087
|
;---------------------------------------------------------------
|
@@ -1268,10 +1323,12 @@ end
|
|
1268
1323
|
undef("checkMinMaxVar")
|
1269
1324
|
procedure checkMinMaxVar(minvar,maxvar)
|
1270
1325
|
begin
|
1326
|
+
if ( (.not. ismissing(minvar)) .and. (.not. ismissing(maxvar)) ) then
|
1271
1327
|
if ( minvar .gt. maxvar ) then
|
1272
1328
|
print("minVar has to be larger than maxVar")
|
1273
1329
|
exit
|
1274
1330
|
end if
|
1331
|
+
end if
|
1275
1332
|
end
|
1276
1333
|
;---------------------------------------------------------------
|
1277
1334
|
; set the color of masked locations
|
@@ -1282,13 +1339,53 @@ begin
|
|
1282
1339
|
resource@cnMissingValPerimOn = True; turn on missing value outlines
|
1283
1340
|
resource@cnMissingValPerimThicknessF = 2.5; set the missing value outline thickness
|
1284
1341
|
end
|
1342
|
+
undef("setCoordsForResouce")
|
1343
|
+
procedure setCoordsForResouce(x,y,variable,resource)
|
1344
|
+
begin
|
1345
|
+
if (dimsizes(dimsizes(x)).ne.1) then
|
1346
|
+
variable@lon2d = x
|
1347
|
+
variable@lat2d = y
|
1348
|
+
end if
|
1349
|
+
resource@sfXArray = x
|
1350
|
+
resource@sfYArray = y
|
1351
|
+
end
|
1285
1352
|
;---------------------------------------------------------------
|
1286
1353
|
; set the coordinates for an ICON data field
|
1287
1354
|
undef("setCoordinates")
|
1288
|
-
|
1355
|
+
function setCoordinates(resource,filehandle,variable)
|
1289
1356
|
begin
|
1290
|
-
|
1291
|
-
|
1357
|
+
ret = True
|
1358
|
+
if (isatt(variable,"coordinates")) then
|
1359
|
+
lonlat = str_split(variable@coordinates," ")
|
1360
|
+
lon = lonlat(0)
|
1361
|
+
lat = lonlat(1)
|
1362
|
+
else
|
1363
|
+
lon = "lon"
|
1364
|
+
lat = "lat"
|
1365
|
+
ret = False
|
1366
|
+
end if
|
1367
|
+
x = filehandle->$lon$
|
1368
|
+
y = filehandle->$lat$
|
1369
|
+
if ("radian" .eq. x@units) x = x * RAD2DEG end if
|
1370
|
+
if ("radian" .eq. y@units) y = y * RAD2DEG end if
|
1371
|
+
|
1372
|
+
setCoordsForResouce(x,y,variable,resource)
|
1373
|
+
|
1374
|
+
if (ret) then
|
1375
|
+
return (/x,y/)
|
1376
|
+
else
|
1377
|
+
return (/1,1/)
|
1378
|
+
end if
|
1379
|
+
end
|
1380
|
+
undef("setCoordinatesFromExtraFile")
|
1381
|
+
function setCoordinatesFromExtraFile(lon_name,lat_name,filename,variable,resource)
|
1382
|
+
begin
|
1383
|
+
x = getCoordinateFromFile(lon_name,filename)
|
1384
|
+
y = getCoordinateFromFile(lat_name,filename)
|
1385
|
+
|
1386
|
+
setCoordsForResouce(x,y,variable,resource)
|
1387
|
+
|
1388
|
+
return (/x,y/)
|
1292
1389
|
end
|
1293
1390
|
;---------------------------------------------------------------
|
1294
1391
|
; set the coordinates bounds for an ICON data field
|
@@ -1361,7 +1458,7 @@ end
|
|
1361
1458
|
undef("getVarLevelType")
|
1362
1459
|
function getVarLevelType(filename,varname)
|
1363
1460
|
begin
|
1364
|
-
f = addfile(filename
|
1461
|
+
f = addfile(filename,"r")
|
1365
1462
|
vertdim = getVertDim(f,f->$varname$)
|
1366
1463
|
if (ismissing(vertdim)) then
|
1367
1464
|
delete(f)
|
@@ -1385,7 +1482,7 @@ begin
|
|
1385
1482
|
gridtype = "unstructured"
|
1386
1483
|
else
|
1387
1484
|
print("CDO:"+CDO)
|
1388
|
-
print("Call cdo griddes
|
1485
|
+
print("Call cdo griddes to determine the horizontal gridtype")
|
1389
1486
|
gridtype = systemfunc(CDO+" -griddes -selname,"+varname+" -seltimestep,1 "+filename+" | grep gridtype | cut -d ' ' -f 4")
|
1390
1487
|
end if
|
1391
1488
|
print("Found horizontal grid of type: "+gridtype)
|
@@ -1408,7 +1505,7 @@ begin
|
|
1408
1505
|
|
1409
1506
|
lats = fspan(startLat,endLat,npoints)
|
1410
1507
|
lons = fspan(startLon,endLon,npoints)
|
1411
|
-
;
|
1508
|
+
; don't let the lons be greater than 360, because these values will not be in
|
1412
1509
|
; the data. Otherwise an interpolation error will occur
|
1413
1510
|
lons = where(lons.gt.360, lons-360.0, lons)
|
1414
1511
|
|
@@ -1531,7 +1628,7 @@ begin
|
|
1531
1628
|
var_at_p@units = var@units
|
1532
1629
|
var_at_p@long_name = var@long_name
|
1533
1630
|
|
1534
|
-
extrapolate = True ; switch
|
1631
|
+
extrapolate = True ; switch to do extrapolation below the ground:
|
1535
1632
|
intmethod = 1 ; 1: method for temperature, -1: method for geopotential, 0: other vars
|
1536
1633
|
tlow = var(nlevels-1,:,:) ; temperature at lowest model level
|
1537
1634
|
; (use ground temperature if available)
|
@@ -1641,7 +1738,7 @@ begin
|
|
1641
1738
|
var_at_p@units = theta3d@units
|
1642
1739
|
var_at_p@long_name = theta3d@long_name
|
1643
1740
|
|
1644
|
-
extrapolate = True ; switch
|
1741
|
+
extrapolate = True ; switch to do extrapolation below the ground:
|
1645
1742
|
intmethod = 1 ; 1: method for temperature, -1: method for geopotential, 0: other vars
|
1646
1743
|
tlow = theta3dll(nlevels-1,:,:) ; temperature at lowest model level
|
1647
1744
|
; (use ground temperature if available)
|
@@ -1661,6 +1758,11 @@ undef("getFlags")
|
|
1661
1758
|
function getFlags(var,boundslon,boundslat,resource)
|
1662
1759
|
begin
|
1663
1760
|
flags = new(dimsizes(var),logical,"No_FillValue")
|
1761
|
+
|
1762
|
+
if (resource@mapType .EQ. "NHps" .OR. resource@mapType .EQ. "SHps") then
|
1763
|
+
flags = True
|
1764
|
+
return flags
|
1765
|
+
end if
|
1664
1766
|
do i = 0,dimsizes(var) - 1
|
1665
1767
|
flags(i) = where(all(boundslon(i,:) .gt. resource@mpMaxLonF) .or. \
|
1666
1768
|
all(boundslon(i,:) .lt. resource@mpMinLonF) .or. \
|
@@ -1764,7 +1866,7 @@ begin
|
|
1764
1866
|
if (.not. ismissing(vhig(0))) then
|
1765
1867
|
do j = 0, dimsizes(vhig) -1
|
1766
1868
|
pres@gsFillColor = colors(i+1)
|
1767
|
-
if ( flags(vhig(
|
1869
|
+
if ( flags(vhig(j))) then
|
1768
1870
|
gsn_polygon(wks,plot,boundslon(vhig(j),:),boundslat(vhig(j),:),pres)
|
1769
1871
|
end if
|
1770
1872
|
end do
|
@@ -1811,6 +1913,50 @@ begin
|
|
1811
1913
|
performGridPlot(variable,levels,colors,boundslon,boundslat,workstation,plot,flags,debug)
|
1812
1914
|
end
|
1813
1915
|
;---------------------------------------------------------------
|
1916
|
+
; Plot the ICON grid: New version, req. ncl 6.2
|
1917
|
+
undef("plotGrid_62")
|
1918
|
+
function plotGrid_62(wks,plot,var,boundslon,boundslat)
|
1919
|
+
begin
|
1920
|
+
pres = True
|
1921
|
+
pres@gsEdgesOn = True ; Turn on edges
|
1922
|
+
pres@gsFillIndex = 0 ; Solid fill, the default
|
1923
|
+
;---Create color array for triangles
|
1924
|
+
ntri = dimsizes(var) ;-- Number of triangles
|
1925
|
+
gscolors = new(ntri,integer)
|
1926
|
+
gscolors = -1 ;-- Initialize to transparent
|
1927
|
+
|
1928
|
+
getvalues plot@contour
|
1929
|
+
"cnLevels" : levels
|
1930
|
+
"cnFillColors" : colors
|
1931
|
+
end getvalues
|
1932
|
+
;---All triangles less than lowest level
|
1933
|
+
vind = ind(var .lt. levels(0))
|
1934
|
+
if(.not.all(ismissing(vind))) then
|
1935
|
+
gscolors(vind) = colors(0)
|
1936
|
+
end if
|
1937
|
+
|
1938
|
+
;---All triangles inbetween levels
|
1939
|
+
do i = 1, dimsizes(levels) - 1
|
1940
|
+
vind := ind(var .ge. levels(i-1) .and. var .lt. levels(i))
|
1941
|
+
if(.not.all(ismissing(vind))) then
|
1942
|
+
gscolors(vind) = colors(i)
|
1943
|
+
end if
|
1944
|
+
end do
|
1945
|
+
|
1946
|
+
;---All triangles higher than highest level
|
1947
|
+
delete(vind)
|
1948
|
+
vind = ind(var .ge. levels(dimsizes(levels)-1))
|
1949
|
+
if(.not.all(ismissing(vind))) then
|
1950
|
+
gscolors(vind) = colors(dimsizes(levels)-1)
|
1951
|
+
end if
|
1952
|
+
|
1953
|
+
pres@gsColors = gscolors
|
1954
|
+
pres@gsSegments = ispan(0,dimsizes(var) * 3,3)
|
1955
|
+
|
1956
|
+
return pres
|
1957
|
+
; }}}
|
1958
|
+
end
|
1959
|
+
;---------------------------------------------------------------
|
1814
1960
|
; read in mask variable
|
1815
1961
|
undef("readMaskVar")
|
1816
1962
|
function readMaskVar()
|
@@ -1822,10 +1968,11 @@ undef("plotVecOrStream")
|
|
1822
1968
|
function plotVecOrStream(useScalar,useStreamlines,uvar,vvar,scalarvar,resource,workstation,showMap)
|
1823
1969
|
begin
|
1824
1970
|
; streamline setup
|
1825
|
-
resource@stArrowStride =
|
1826
|
-
resource@stArrowLengthF = 0.
|
1827
|
-
resource@stMinDistanceF = 0.
|
1828
|
-
resource@stLineThicknessF =
|
1971
|
+
resource@stArrowStride = 4; arrows start every third
|
1972
|
+
resource@stArrowLengthF = 0.0015; default is dynamic
|
1973
|
+
resource@stMinDistanceF = 0.008; streamline dist
|
1974
|
+
resource@stLineThicknessF = 1.0; streamline thickness
|
1975
|
+
; resource@stCrossoverCheckCount = 100;
|
1829
1976
|
if (useScalar) then
|
1830
1977
|
if (useStreamlines) then
|
1831
1978
|
if (showMap)
|
@@ -1857,6 +2004,25 @@ begin
|
|
1857
2004
|
end if
|
1858
2005
|
return vc
|
1859
2006
|
end
|
2007
|
+
;---------------------------------------------------------------
|
2008
|
+
; limit the map to given coords
|
2009
|
+
undef("limitMap2Coords")
|
2010
|
+
procedure limitMap2Coords(resource)
|
2011
|
+
begin
|
2012
|
+
lons = resource@sfXArray
|
2013
|
+
lats = resource@sfYArray
|
2014
|
+
resource@mpMinLatF = floor(min(lats))
|
2015
|
+
resource@mpMaxLatF = ceil(max(lats))
|
2016
|
+
resource@mpMinLonF = floor(min(lons))
|
2017
|
+
resource@mpMaxLonF = ceil(max(lons))
|
2018
|
+
|
2019
|
+
|
2020
|
+
; bounds of plotting area for stereographic plots
|
2021
|
+
resource@mpLeftCornerLonF = floor(min(lons))
|
2022
|
+
resource@mpLeftCornerLatF = floor(min(lats))
|
2023
|
+
resource@mpRightCornerLonF = ceil(max(lons))
|
2024
|
+
resource@mpRightCornerLatF = ceil(max(lats))
|
2025
|
+
end
|
1860
2026
|
|
1861
2027
|
;
|
1862
2028
|
; vim:ft=ncl
|
data/test/test_iconPlot.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
$:.unshift File.join(File.dirname(__FILE__),"..","lib")
|
2
|
-
require "
|
2
|
+
require "minitest/autorun"
|
3
3
|
require "iconPlot"
|
4
4
|
|
5
|
-
class TestIconPlot < Test
|
5
|
+
class TestIconPlot < Minitest::Test
|
6
6
|
|
7
7
|
CALLER = "/home/ram/src/git/icon/scripts/postprocessing/tools/contrib/nclsh"
|
8
8
|
PLOTTER = "/home/ram/src/git/icon/scripts/postprocessing/tools/icon_plot.ncl"
|
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iconPlot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ralf Mueller
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cdo
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: extcsv
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: gnuplot
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
description: 'Plot with ncl via Ruby: requires NCL 6.* and CDO 1.5.*'
|
@@ -59,9 +59,9 @@ executables:
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
-
- lib/iconPlot.rb
|
63
|
-
- gemspec
|
64
62
|
- bin/nclsh
|
63
|
+
- gemspec
|
64
|
+
- lib/iconPlot.rb
|
65
65
|
- lib/icon_plot.ncl
|
66
66
|
- lib/icon_plot_lib.ncl
|
67
67
|
- test/test_iconPlot.rb
|
@@ -75,17 +75,17 @@ require_paths:
|
|
75
75
|
- lib
|
76
76
|
required_ruby_version: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
|
-
- -
|
78
|
+
- - ">="
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: '1.8'
|
81
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
82
|
requirements:
|
83
|
-
- -
|
83
|
+
- - ">="
|
84
84
|
- !ruby/object:Gem::Version
|
85
85
|
version: '0'
|
86
86
|
requirements: []
|
87
87
|
rubyforge_project:
|
88
|
-
rubygems_version: 2.
|
88
|
+
rubygems_version: 2.2.2
|
89
89
|
signing_key:
|
90
90
|
specification_version: 4
|
91
91
|
summary: Plot ICON output with ncl via Ruby
|