iconPlot 0.0.6 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/{contrib → bin}/nclsh +0 -0
- data/gemspec +3 -2
- data/lib/iconPlot.rb +7 -12
- data/lib/icon_plot.ncl +162 -75
- data/lib/icon_plot_lib.ncl +254 -79
- data/test/test_iconPlot.rb +10 -8
- metadata +17 -24
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 81daefe787ba86d077804f2afbb20f24bb8625e0
|
4
|
+
data.tar.gz: e2538b75ce60c906d8c90afd08654bc4a9f7a9f1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b2a7478b62d8e95335816b006caeb81471f749cf1d014875647a9504a2efe03bca72c5a7db1036650407ff9c5e0a6d59a04865cef19b869de7163bf1213ae5aa
|
7
|
+
data.tar.gz: c7da25dd5cd29dcc0232e049bf86da2192ab56cab2ff232a5b1a2f247d1158d8d1ace670f39c7a664607fe5382b6628a934867a4f0cb3ce9705b23558a2b5ef0
|
data/{contrib → bin}/nclsh
RENAMED
File without changes
|
data/gemspec
CHANGED
@@ -3,9 +3,10 @@ $:.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.8'
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
|
-
s.files = ["lib/iconPlot.rb"] + ["gemspec"] + ["
|
8
|
+
s.files = ["lib/iconPlot.rb"] + ["gemspec"] + ["bin/nclsh"] + Dir.glob("lib/*ncl")
|
9
|
+
s.executables << 'nclsh'
|
9
10
|
s.test_file = "test/test_iconPlot.rb"
|
10
11
|
s.description = "Plot with ncl via Ruby: requires NCL 6.* and CDO 1.5.*"
|
11
12
|
s.summary = "Plot ICON output with ncl via Ruby"
|
data/lib/iconPlot.rb
CHANGED
@@ -6,19 +6,13 @@ require 'shellwords'
|
|
6
6
|
class IconPlot < Struct.new(:caller,:plotter,:libdir,:otype,:display,:cdo,:debug,:isIcon)
|
7
7
|
VERSION = '0.0.4'
|
8
8
|
|
9
|
-
def IconPlot.gemPath
|
10
|
-
gemSearcher = Gem::GemPathSearcher.new
|
11
|
-
gemspec = gemSearcher.find('iconPlot')
|
12
|
-
gemspec.gem_dir
|
13
|
-
end
|
14
9
|
def initialize(*args)
|
15
10
|
super(*args)
|
16
|
-
|
17
|
-
gempath = IconPlot.gemPath
|
11
|
+
|
18
12
|
defaults = {
|
19
|
-
:caller =>
|
20
|
-
:plotter =>
|
21
|
-
:libdir =>
|
13
|
+
:caller => Gem.bin_path('iconPlot','nclsh'),
|
14
|
+
:plotter => Gem.find_files("icon_plot.ncl")[0],
|
15
|
+
:libdir => File.dirname(Gem.find_files("icon_plot.ncl")[0]),
|
22
16
|
:otype => 'png',
|
23
17
|
:display => 'sxiv',
|
24
18
|
:cdo => ENV['CDO'].nil? ? 'cdo' : ENV['CDO'],
|
@@ -41,7 +35,7 @@ class IconPlot < Struct.new(:caller,:plotter,:libdir,:otype,:display,:cdo,:debug
|
|
41
35
|
raise ArgumentError
|
42
36
|
end
|
43
37
|
|
44
|
-
opts[:tStrg] =ofile
|
38
|
+
opts[:tStrg] =ofile if opts[:tStrg].nil?
|
45
39
|
|
46
40
|
cmd = [self.caller,self.plotter].join(' ')
|
47
41
|
cmd << " -altLibDir=#{self.libdir} #{varIdent} -iFile=#{ifile} -oFile=#{ofile} -oType=#{self.otype}"
|
@@ -52,7 +46,8 @@ class IconPlot < Struct.new(:caller,:plotter,:libdir,:otype,:display,:cdo,:debug
|
|
52
46
|
out = IO.popen(cmd).read
|
53
47
|
puts out if self.debug
|
54
48
|
|
55
|
-
return [FileUtils.pwd,"#{ofile}.#{self.otype}"].join(File::SEPARATOR)
|
49
|
+
#return [FileUtils.pwd,"#{ofile}.#{self.otype}"].join(File::SEPARATOR)
|
50
|
+
return "#{ofile}.#{self.otype}"
|
56
51
|
end
|
57
52
|
def scalarPlot(ifile,ofile,varname,opts={})
|
58
53
|
plot(ifile,ofile,varname,'scalar',opts)
|
data/lib/icon_plot.ncl
CHANGED
@@ -9,23 +9,53 @@
|
|
9
9
|
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
|
10
10
|
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
|
11
11
|
|
12
|
+
;------- lib location from the command line ------------------------------------------------------------------
|
13
|
+
libLoaded = False
|
14
|
+
if ( isvar("altLibDir") ) then
|
15
|
+
print("Load library: "+altLibDir+"/icon_plot_lib.ncl")
|
16
|
+
loadscript(altLibDir +"/icon_plot_lib.ncl")
|
17
|
+
libLoaded = True
|
18
|
+
end if
|
19
|
+
;------------------------------------------------------------------------------
|
12
20
|
;------- config ---------------------------------------------------------------
|
13
21
|
; default settings from user file
|
14
|
-
|
15
|
-
if (
|
16
|
-
print("
|
17
|
-
|
22
|
+
; --- Skip any user configuration through a file
|
23
|
+
if (isvar("noConfig")) then
|
24
|
+
if ( isvar("DEBUG") .and. DEBUG) print("Subpress user configuration") end if
|
25
|
+
else
|
26
|
+
; --- Use the configuration file from the commandline option
|
27
|
+
if ( isvar("configFile") ) then
|
28
|
+
if (isfilepresent(configFile)) then
|
29
|
+
print("Found configfile:"+configFile)
|
30
|
+
loadscript(configFile)
|
31
|
+
else
|
32
|
+
print("Could NOT find configfile:"+configFile)
|
33
|
+
exit()
|
34
|
+
end if
|
35
|
+
else
|
36
|
+
; --- Use the default config file
|
37
|
+
CONFIGFILE = getenv("HOME")+"/.icon_plot.rc"
|
38
|
+
if (isfilepresent(CONFIGFILE)) then
|
39
|
+
print("Found configfile:"+CONFIGFILE)
|
40
|
+
loadscript(CONFIGFILE)
|
41
|
+
end if
|
42
|
+
end if
|
18
43
|
end if
|
19
|
-
|
44
|
+
;--- end config ---------------------------------------------------------------
|
45
|
+
;--- default lib location ----------------------------------------------------
|
20
46
|
if ( .not. isvar("altLibDir") ) then
|
21
47
|
print("load default library from /pool/data/ICON/tools")
|
22
48
|
loadscript("/pool/data/ICON/tools/icon_plot_lib.ncl")
|
23
49
|
else
|
24
|
-
|
25
|
-
|
50
|
+
if ( .not. libLoaded ) then
|
51
|
+
;--- lib location from the config file ----------------------------------------
|
52
|
+
print("Load library: "+altLibDir+"/icon_plot_lib.ncl")
|
53
|
+
loadscript(altLibDir +"/icon_plot_lib.ncl")
|
54
|
+
end if
|
26
55
|
end if
|
27
|
-
|
56
|
+
;------------------------------------------------------------------------------
|
28
57
|
;==============================================================================
|
58
|
+
VERSION = "0.0.6"
|
29
59
|
;----- MAIN PROGRAM -----------------------------------------------------------
|
30
60
|
if (isvar("help")) then
|
31
61
|
dq = str_get_dq()
|
@@ -84,23 +114,28 @@
|
|
84
114
|
print("; use -180 to 180 for longitude !")
|
85
115
|
print("; secLC, secRC : start and and point of a vertical section (no default value)")
|
86
116
|
print("; section is plotted it secLC and secRC are present")
|
117
|
+
print("; secMode : perform transection along a great crice or on a straight line")
|
118
|
+
print("; possible values: circle, straight (default)")
|
119
|
+
print("; : ATTENTION: using 'circle' for sections with a small angle wrt the equator is NOT RECOMMENDED")
|
87
120
|
print("; showSecMap : display the location of the vertical section in an additional map (default:true)")
|
88
121
|
print("; centerLon : center longitute for satelite view (default:30.)")
|
89
122
|
print("; centerLat : center latitude for satelite view (default:20.)")
|
90
123
|
print("; satDist : satelite distance (default:20.0)")
|
91
124
|
print("; scaleFactor : optional scale factor")
|
125
|
+
print("; fillMode : how to color contour plots,i.e. sets cnFillMode: CellFill or RasterFill (default:RasterFill)")
|
92
126
|
print("; selMode : mode for level spacing of the plot:")
|
93
127
|
print("; halflog (uses half logarythmic levels,i.e. 1,2,5 per decade), ")
|
94
128
|
print("; manual (automatic linear spacing with usage of minVar and maxVar)")
|
95
129
|
print("; auto (default: let do ncl the spacing)")
|
96
130
|
print("; scaleLimit : Limits the number of decades for levels in selMode-halflog")
|
97
|
-
print("; minVar/maxVar : min/maximal Value to plot for selMode=manual or halflog")
|
131
|
+
print("; minVar/maxVar : min/maximal Value to plot for selMode = 'manual' or 'halflog'")
|
98
132
|
print("; numLevs : set a number of labels for manual selMode only. NumCol=numLevs+2")
|
99
133
|
print("; (Not set directly, but used for computing the contour level spacing. default=10)")
|
100
|
-
print(";
|
134
|
+
print("; plotLevs : set individual contour levels, selMode is set to 'manual' automatically")
|
101
135
|
print("; mapType : projection type (default: lonlat), other: ortho (not compatible with showGrid), NHps")
|
102
136
|
print("; and SHps (polar stereographic projections centered at the north and south pole respectively),")
|
103
137
|
print("; sat (satelite view, use option centerLat, centerLon and satDist)")
|
138
|
+
print("; hov : plot hovmoeller diagram, expects variable with two 'active' dimensions, i.e. var(:,:,0,0)")
|
104
139
|
print("; mapLine : (logical) draws continent lines on the plot (foreground/transparent)")
|
105
140
|
print("; maskName : variable to mask with. maskName is expected NOT to have time dimension")
|
106
141
|
print("; 'maskName=" + dq + "none" + dq + "' is same as default (no mask variable)")
|
@@ -114,7 +149,10 @@
|
|
114
149
|
print("; bStrg : base string - default is prgr name and time stamp only")
|
115
150
|
print("; maxView : (logical) maximize plot area on paper (not for buildbot -> convert to png)")
|
116
151
|
print("; colormap : string for predefined colormaps of the plot (e.g. 'colormap=" + dq + "BlAqGrYeOrReVi200" + dq + "')")
|
152
|
+
print("; withLines : draw lines between each contour color (default:True)")
|
153
|
+
print("; withLineLabels: label the countour lines with theri values (auto-enable withLines, default:False)")
|
117
154
|
print("; showGrid : display polygon lines with filled colors instead of contour plot")
|
155
|
+
print("; markCells : mark cell centers with dots")
|
118
156
|
print("; showNcd : display NDC Grid to find Normalized Device Coordinates on the plot")
|
119
157
|
print("; k2c : if True, perform Kelvin2Celsius shift (default:True)")
|
120
158
|
print(";")
|
@@ -122,11 +160,14 @@
|
|
122
160
|
print("; atmLev : chooses vertical plot levels for atmosphere input (h: height,p:pressure,m:modellevel,default:p)")
|
123
161
|
print(";---------------------------------------------------------------")
|
124
162
|
print("; altLibDir : Alternative directory for loading icon_plot_lib.ncl")
|
163
|
+
print("; noConfig : subpress reading of any config file, i.e. use commandline options only (default:False)")
|
164
|
+
print("; Use +noConfig or -noConfig=True")
|
125
165
|
print("; cdo : Path to an alternative cdo version")
|
126
166
|
print(";---------------------------------------------------------------")
|
127
167
|
print("; Authors : Ralf Mueller (ralf.mueller@zmaw.de)")
|
128
168
|
print("; Stephan Lorenz (stephan.lorenz@zmaw.de)")
|
129
|
-
print(";
|
169
|
+
print("; Einar Olason (einar.olason@zmaw.de)")
|
170
|
+
print("; VERSION : " + VERSION +" (2012-08-13)")
|
130
171
|
print(";---------------------------------------------------------------")
|
131
172
|
exit()
|
132
173
|
end if
|
@@ -157,29 +198,34 @@
|
|
157
198
|
end if
|
158
199
|
print("Outputfile '"+str_concat((/oFile,".",oType/))+"' will be created in "+systemfunc("dirname "+iFile))
|
159
200
|
|
160
|
-
if(.not. isvar("
|
161
|
-
|
201
|
+
if (.not. isvar("DEBUG")) DEBUG = False end if
|
202
|
+
if (.not. isvar("showGrid")) showGrid = False end if
|
203
|
+
if (.not. isvar("markCells")) markCells = False end if
|
204
|
+
if (.not. isvar("showNdc")) showNdc = False end if
|
205
|
+
if (.not. isvar("maxView")) maxView = False end if
|
206
|
+
if (.not. isvar("scaleLimit")) scaleLimit = 2 end if
|
207
|
+
if (.not. isvar("selMode")) selMode = "auto" end if
|
208
|
+
if (.not. isvar("plotMode")) plotMode = "scalar" end if
|
209
|
+
if (.not. isvar("timeStep")) then
|
210
|
+
timeStep = 0
|
162
211
|
else
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
exit
|
167
|
-
end if
|
212
|
+
t = floattointeger(timeStep)
|
213
|
+
delete(timeStep)
|
214
|
+
timeStep = t
|
168
215
|
end if
|
169
|
-
|
170
|
-
if (.not. isvar("
|
171
|
-
if (.not. isvar("
|
172
|
-
if (.not. isvar("
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
if (.not. isvar("
|
179
|
-
if (.not. isvar("
|
180
|
-
if (.not. isvar("
|
181
|
-
if (.not. isvar("
|
182
|
-
if (.not. isvar("isIcon")) isIcon = False end if
|
216
|
+
if (.not. isvar("levIndex")) levIndex = 0 end if
|
217
|
+
if (.not. isvar("scaleFactor")) scaleFactor = 1 end if
|
218
|
+
if (.not. isvar("fillMode")) fillMode = "RasterFill" end if
|
219
|
+
if (.not. isvar("colormap")) then
|
220
|
+
colormap = DEFAULTCOLOR
|
221
|
+
userColors = False
|
222
|
+
else
|
223
|
+
userColors = True
|
224
|
+
end if
|
225
|
+
if (.not. isvar("withLines")) withLines = True end if
|
226
|
+
if (.not. isvar("withLineLabels")) withLineLabels = False end if
|
227
|
+
if (.not. isvar("k2c")) k2c = True end if
|
228
|
+
if (.not. isvar("isIcon")) isIcon = False end if
|
183
229
|
|
184
230
|
if (.not.isvar("mapType")) mapType = "lonlat" end if
|
185
231
|
if ( mapType .eq. "NHps" .and. .not.isvar("mapLLC")) mapLLC = (/-45., 45./) end if
|
@@ -198,14 +244,15 @@
|
|
198
244
|
if (.not.isvar("vecColByLen")) vecColByLen = False end if
|
199
245
|
if (.not.isvar("vecMinDist")) vecMinDist = 0.017 end if
|
200
246
|
if (.not.isvar("streamLine")) streamLine = False end if
|
201
|
-
if (.not.isvar("secPoints")) secPoints =
|
202
|
-
|
203
|
-
if (.not.isvar("lonCo")) lonCo =
|
204
|
-
if (.not.isvar("latCo")) latCo =
|
205
|
-
|
206
|
-
if (.not.isvar("
|
207
|
-
|
208
|
-
|
247
|
+
if (.not.isvar("secPoints")) secPoints = 161 end if
|
248
|
+
; default + optional coordinates
|
249
|
+
if (.not.isvar("lonCo")) lonCo = DEFAULTLON end if
|
250
|
+
if (.not.isvar("latCo")) latCo = DEFAULTLAT end if
|
251
|
+
|
252
|
+
if (.not.isvar("secMode")) secMode = "straight" end if
|
253
|
+
if (.not.isvar("showSecMap")) showSecMap = True end if
|
254
|
+
; ATMOSPEHRE SETUP ----------------------------------------------------------
|
255
|
+
if (.not.isvar("atmLev")) atmLev = "p" end if
|
209
256
|
if (.not.isvar("atmPLevs")) then
|
210
257
|
atmPLevSetup = (/10000,100000,2500/); unit: Pa
|
211
258
|
atmPLevs = ispan(atmPLevSetup(0),atmPLevSetup(1),atmPLevSetup(2))*1.0
|
@@ -280,6 +327,28 @@
|
|
280
327
|
horizonalGridType = getHorizGridType(iFile,ivarname,isIcon)
|
281
328
|
;----------------------------------------------------------------------------
|
282
329
|
|
330
|
+
; DETERMINE selMode automatically -------------------------------------------
|
331
|
+
if (isvar("minVar") .and. isvar("maxVar")) then
|
332
|
+
if (selMode .eq. "auto") then
|
333
|
+
selMode = "manual"
|
334
|
+
end if
|
335
|
+
end if
|
336
|
+
if (isvar("plotLevs") ) then
|
337
|
+
if (selMode .eq. "auto") then
|
338
|
+
selMode = "manual"
|
339
|
+
end if
|
340
|
+
end if
|
341
|
+
if(.not. isvar("numLevs")) then
|
342
|
+
numLevs = NUMLEVS
|
343
|
+
else
|
344
|
+
if (numLevs .lt. 1) then
|
345
|
+
print("WARNING: numLevs must be >= 1")
|
346
|
+
print(ABORTMSG)
|
347
|
+
exit
|
348
|
+
end if
|
349
|
+
end if
|
350
|
+
;----------------------------------------------------------------------------
|
351
|
+
|
283
352
|
; DETERMINE THE PLOTMODE ----------------------------------------------------
|
284
353
|
if (isvar("vecVars")) then
|
285
354
|
; expectes is a string or an array of size 2: "u-veloc v-veloc" or (/"u-veloc","v-veloc"/)
|
@@ -310,16 +379,16 @@
|
|
310
379
|
exit
|
311
380
|
end if
|
312
381
|
if (isvar("secLC").and.isvar("secRC")) plotMode = "section" end if
|
313
|
-
if (isvar("
|
382
|
+
if (isvar("hov")) plotMode = "hovmoeller" end if
|
314
383
|
|
315
|
-
if (plotMode.eq."vector" .or. plotMode.eq."overlay" .or. plotMode.eq."section"
|
384
|
+
if (plotMode.eq."vector" .or. plotMode.eq."overlay" .or. plotMode.eq."section") then
|
316
385
|
if (horizonalGridType .ne. "unstructured") then ; regular grid expected, i.e. remappgin is NOT required
|
317
386
|
rFile = addfile(iFile+".nc","r")
|
318
387
|
else
|
319
388
|
; performe some remapping to a regular grid because ncl cannot draw vector
|
320
389
|
; from unstructured grids
|
321
390
|
; TODO addVars=(/ "PS","PHIS"/)
|
322
|
-
remapFilename = setRemapFilename(iFile,iType,atmLev)
|
391
|
+
remapFilename = setRemapFilename(iFile,iType,resolution,atmLev)
|
323
392
|
print("remapFilename:"+remapFilename)
|
324
393
|
if (.not. checkRemappedFile(iFile,remapFilename,ivarname,iType,atmLev,atmPLevs,atmHLevs) ) then
|
325
394
|
addVars=(/""/)
|
@@ -328,10 +397,10 @@
|
|
328
397
|
end if
|
329
398
|
rFile = addfile( remapFilename+".nc", "r" )
|
330
399
|
end if
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
400
|
+
;if (plotMode .eq. "hoffmueller") then ; perform zonmean
|
401
|
+
; zonmeanFilename = setZonmeanFilename(remapFilename,ivarname,atmLev)
|
402
|
+
; zonmean4HoffmuellerPlot(remapFilename,ivarname,zonmeanFilename)
|
403
|
+
;end if
|
335
404
|
end if
|
336
405
|
File = addfile( iFile+".nc", "r" )
|
337
406
|
|
@@ -369,7 +438,7 @@
|
|
369
438
|
print("Graphics format is " +oType)
|
370
439
|
print("plotMode = "+plotMode)
|
371
440
|
|
372
|
-
if (plotMode.eq."scalar" .or. plotMode.eq."section") then
|
441
|
+
if (plotMode.eq."scalar" .or. plotMode.eq."section" .or. plotMode.eq."hovmoeller") then
|
373
442
|
print("varName = "+varName)
|
374
443
|
else
|
375
444
|
print("vecVars = "+vecVars)
|
@@ -416,12 +485,6 @@
|
|
416
485
|
|
417
486
|
scaleVar(var,scaleFactor)
|
418
487
|
|
419
|
-
; set selMode automatically
|
420
|
-
if (isvar("minVar") .and. isvar("maxVar")) then
|
421
|
-
if (selMode .eq. "auto") then
|
422
|
-
selMode = "manual"
|
423
|
-
end if
|
424
|
-
end if
|
425
488
|
; set minVar_maxVar for plotting
|
426
489
|
if(.not. isvar("minVar")) minVar = min(var) end if
|
427
490
|
if(.not. isvar("maxVar")) maxVar = max(var) end if
|
@@ -435,6 +498,11 @@
|
|
435
498
|
;var = mask ( var, slm, 0.5)
|
436
499
|
end if
|
437
500
|
end if
|
501
|
+
if (plotMode.eq."hovmoeller") then
|
502
|
+
var = selRegularVar(varName,File,-1)
|
503
|
+
if(.not. isvar("minVar")) minVar = min(var) end if
|
504
|
+
if(.not. isvar("maxVar")) maxVar = max(var) end if
|
505
|
+
end if
|
438
506
|
if (plotMode.eq."vector" .or. plotMode.eq."overlay") then; vector mode =======
|
439
507
|
uvarname = vecVars(0)
|
440
508
|
vvarname = vecVars(1)
|
@@ -488,11 +556,6 @@
|
|
488
556
|
var = mask(var,maskVar,1)
|
489
557
|
end if
|
490
558
|
end if ; Reading data variables =============================================
|
491
|
-
if (plotMode .eq. "hoffmueller") then ; create hoffmuelle diagram
|
492
|
-
; select the whole time series
|
493
|
-
; and plot it with
|
494
|
-
; plot = gsn_csm_lat_time(wks, shov(0,{-80:80},:), res)
|
495
|
-
end if
|
496
559
|
if (iType .eq. "atm" .and. ivarname .eq. "T" .and. k2c) var = var - 273.15 end if ;atmosphere used to write out Kelvin
|
497
560
|
|
498
561
|
;---------------------------------------------------------------
|
@@ -507,20 +570,18 @@
|
|
507
570
|
drawNDCGrid(wks)
|
508
571
|
end if
|
509
572
|
|
510
|
-
ResC = True
|
573
|
+
ResC = setDefaultResource(True,withLines,withLineLabels,fillMode)
|
511
574
|
|
512
|
-
|
575
|
+
if (.not. userColors) setDefaultColors(ResC,minVar,maxVar,DEBUG) end if
|
513
576
|
|
514
577
|
if (maxView) ResC@gsnMaximize = True end if
|
515
578
|
|
516
579
|
if (useMask) setMaskColor(wks,ResC) end if
|
517
580
|
|
518
581
|
|
519
|
-
|
520
582
|
if (getHorizGridType(iFile,ivarname,isIcon) .eq. "unstructured") then
|
521
583
|
if (plotMode.eq."scalar" .or. plotMode.eq."overlay")
|
522
584
|
setCoordinates(ResC,x,y)
|
523
|
-
;setBounds(ResC,File,x,y,DEBUG)
|
524
585
|
end if
|
525
586
|
end if
|
526
587
|
|
@@ -535,7 +596,7 @@
|
|
535
596
|
print("Cannot plot vertical section of a 2D variable: "+varName)
|
536
597
|
exit
|
537
598
|
end if
|
538
|
-
trans = setSection(secLC,secRC,secPoints,var)
|
599
|
+
trans = setSection(secLC,secRC,secPoints,var,secMode)
|
539
600
|
vertdim = getVertDim(File,var)
|
540
601
|
trans!0 = vertdim
|
541
602
|
trans&$vertdim$ = var&$vertdim$
|
@@ -564,7 +625,11 @@
|
|
564
625
|
else
|
565
626
|
setDefaultVectorPlot(ResC,5.0,vecRefLength,"CurlyVector",vecMinDist)
|
566
627
|
|
567
|
-
vc = plotVecOrStream(vecColByLen,streamLine
|
628
|
+
vc = plotVecOrStream(vecColByLen,streamLine,\
|
629
|
+
uvar,vvar, \
|
630
|
+
sqrt(uvar*uvar + vvar*vvar), \
|
631
|
+
ResC,wks,True)
|
632
|
+
draw(vc)
|
568
633
|
end if
|
569
634
|
end if
|
570
635
|
if (plotMode.eq."overlay") then
|
@@ -577,7 +642,7 @@
|
|
577
642
|
|
578
643
|
ResC@gsnDraw = False
|
579
644
|
ResC@gsnFrame = False
|
580
|
-
vc = plotVecOrStream(vecColByLen,streamLine,uvar,vvar,
|
645
|
+
vc = plotVecOrStream(vecColByLen,streamLine,uvar,vvar,var,ResC2,wks,False)
|
581
646
|
|
582
647
|
plot = gsn_csm_contour_map(wks,var,ResC)
|
583
648
|
if (showGrid) then
|
@@ -600,10 +665,19 @@
|
|
600
665
|
end if
|
601
666
|
plotGrid(wks,plot,var,x,bounds,File,ResC,DEBUG)
|
602
667
|
end if
|
668
|
+
if ( markCells ) then
|
669
|
+
plotCellMarkers(x,y,wks,plot,True)
|
670
|
+
end if
|
603
671
|
end if
|
604
672
|
if (plotMode.eq."scatter") then
|
605
673
|
plot = gsn_csm_xy(wks,xvar,yvar,ResC)
|
606
674
|
end if
|
675
|
+
if (plotMode .eq. "hovmoeller") then ; create hoffmuelle diagram
|
676
|
+
; select the whole time series
|
677
|
+
; and plot it with
|
678
|
+
ResC@trYReverse = True
|
679
|
+
plot = gsn_csm_hov(wks, var(depth|:,time|:,lat|0,lon|0), ResC)
|
680
|
+
end if
|
607
681
|
if (plotMode.eq."section") then
|
608
682
|
|
609
683
|
if (showSecMap) then
|
@@ -627,20 +701,33 @@
|
|
627
701
|
|
628
702
|
if (showSecMap) then
|
629
703
|
; map with section polygon
|
630
|
-
mres
|
631
|
-
mres@gsnFrame
|
632
|
-
mres@gsnDraw
|
633
|
-
mres@vpWidthF
|
634
|
-
mres@vpHeightF
|
635
|
-
mres@vpXF
|
636
|
-
mres@vpYF
|
637
|
-
|
704
|
+
mres = True
|
705
|
+
mres@gsnFrame = False; don't turn page yet
|
706
|
+
mres@gsnDraw = False; don't draw yet
|
707
|
+
mres@vpWidthF = 0.8; set width of plot
|
708
|
+
mres@vpHeightF = 0.3; set height of plot
|
709
|
+
mres@vpXF = 0.1
|
710
|
+
mres@vpYF = 0.4
|
711
|
+
|
712
|
+
newcolor = NhlNewColor(wks,0.85,0.85,0.85); add gray to colormap
|
713
|
+
mres@mpOutlineOn = True; (turn off continental outlines)
|
714
|
+
mres@mpFillOn = False; (turn on map fill)
|
715
|
+
mres@mpFillColors = (/"background","transparent","LightGray","transparent"/); (fill land in gray and ocean in transparent)
|
716
|
+
mres@mpGrid = False
|
717
|
+
|
718
|
+
; plot(1) = gsn_map(wks,"CylindricalEquidistant",mres)
|
719
|
+
plot(1) = gsn_csm_map(wks,mres)
|
638
720
|
pres = True; polyline mods desired
|
639
721
|
pres@gsnFrame = False; don't turn page yet
|
640
722
|
pres@gsnDraw = False; don't draw yet
|
641
723
|
pres@gsLineColor = "black"; color of lines
|
642
724
|
pres@gsLineThicknessF = 2.0; line thickness
|
643
|
-
|
725
|
+
pathRes = getSectionPathForMap(secLC,secRC,secPoints,secMode)
|
726
|
+
if (DEBUG) then
|
727
|
+
print("PATHRES lon - lat")
|
728
|
+
print(pathRes@lon + " " + pathRes@lat)
|
729
|
+
end if
|
730
|
+
pathLine = gsn_add_polyline(wks,plot(1),pathRes@lon, pathRes@lat,pres)
|
644
731
|
|
645
732
|
draw(plot(1))
|
646
733
|
end if
|
data/lib/icon_plot_lib.ncl
CHANGED
@@ -16,14 +16,18 @@
|
|
16
16
|
;---------------------------------------------------------------
|
17
17
|
; Authors : Ralf Mueller (ralf.mueller@zmaw.de)
|
18
18
|
; Stephan Lorenz (stephan.lorenz@zmaw.de)
|
19
|
+
; VERSION = "0.0.6"
|
19
20
|
;-------------------------------------------------------------------------------
|
20
21
|
; some global defaults
|
21
|
-
DEFAULTLON
|
22
|
-
DEFAULTLAT
|
23
|
-
RAD2DEG
|
24
|
-
ABORTMSG
|
25
|
-
NUMLEVS
|
26
|
-
CDO
|
22
|
+
DEFAULTLON = "clon"
|
23
|
+
DEFAULTLAT = "clat"
|
24
|
+
RAD2DEG = 45./atan(1.)
|
25
|
+
ABORTMSG = "Abort Script."
|
26
|
+
NUMLEVS = 10
|
27
|
+
CDO = "cdo"
|
28
|
+
; DEFAULTCOLOR = "BlWhRe" ; ncolors = 103
|
29
|
+
DEFAULTCOLOR = "BlueDarkRed18" ; ncolors = 256
|
30
|
+
DEFAULTCOLOR = "BlueWhiteOrangeRed" ; ncolors = 256
|
27
31
|
;-------------------------------------------------------------------------------
|
28
32
|
procedure setCDO(path)
|
29
33
|
begin
|
@@ -233,17 +237,19 @@ end
|
|
233
237
|
undef("selRegularVar")
|
234
238
|
function selRegularVar(varname,filehandle,timestep)
|
235
239
|
begin
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
240
|
+
dims = getfilevardims(filehandle,varname)
|
241
|
+
noOfDims = dimsizes(dims)
|
242
|
+
noOfDims = noOfDims(0)
|
243
|
+
print(""+noOfDims)
|
244
|
+
usableVar = False
|
245
|
+
if ( has_time(dims) ) then
|
246
|
+
if (timestep.eq.-1) then
|
241
247
|
if (noOfDims .eq. 4) then ; dims: (time,lev,x,y)
|
242
|
-
var = filehandle->$varname$
|
248
|
+
var = filehandle->$varname$
|
243
249
|
usableVar = True
|
244
250
|
end if
|
245
251
|
if (noOfDims .eq. 3) then ; dims: (time,x,y)
|
246
|
-
var = filehandle->$varname$(
|
252
|
+
var = filehandle->$varname$(:,:,:)
|
247
253
|
usableVar = True
|
248
254
|
end if
|
249
255
|
if (noOfDims .eq. 2) then ; dims: (x,y)
|
@@ -255,24 +261,42 @@ begin
|
|
255
261
|
usableVar = False
|
256
262
|
end if
|
257
263
|
else
|
258
|
-
if (noOfDims .eq.
|
259
|
-
var = filehandle->$varname$(
|
264
|
+
if (noOfDims .eq. 4) then ; dims: (time,lev,x,y)
|
265
|
+
var = filehandle->$varname$(timestep,:,:,:)
|
266
|
+
usableVar = True
|
267
|
+
end if
|
268
|
+
if (noOfDims .eq. 3) then ; dims: (time,x,y)
|
269
|
+
var = filehandle->$varname$(timestep,:,:)
|
260
270
|
usableVar = True
|
261
271
|
end if
|
262
272
|
if (noOfDims .eq. 2) then ; dims: (x,y)
|
263
273
|
var = filehandle->$varname$(:,:)
|
264
274
|
usableVar = True
|
265
275
|
end if
|
266
|
-
if (noOfDims .eq. 1) then ; dims: (
|
276
|
+
if (noOfDims .eq. 1) then ; dims: (time)
|
267
277
|
var = filehandle->$varname$(:)
|
268
|
-
usableVar =
|
278
|
+
usableVar = False
|
269
279
|
end if
|
270
280
|
end if
|
271
|
-
|
272
|
-
|
273
|
-
|
281
|
+
else
|
282
|
+
if (noOfDims .eq. 3) then ; dims: (lev,x,y)
|
283
|
+
var = filehandle->$varname$(:,:,:)
|
284
|
+
usableVar = True
|
274
285
|
end if
|
275
|
-
|
286
|
+
if (noOfDims .eq. 2) then ; dims: (x,y)
|
287
|
+
var = filehandle->$varname$(:,:)
|
288
|
+
usableVar = True
|
289
|
+
end if
|
290
|
+
if (noOfDims .eq. 1) then ; dims: (x)
|
291
|
+
var = filehandle->$varname$(:)
|
292
|
+
usableVar = True
|
293
|
+
end if
|
294
|
+
end if
|
295
|
+
if (.not. usableVar) then
|
296
|
+
print("Warning! Could not read " + varname + " from lonlat input file")
|
297
|
+
exit
|
298
|
+
end if
|
299
|
+
return var
|
276
300
|
end
|
277
301
|
;-------------------------------------------------------------------------------
|
278
302
|
; abstract Field selection
|
@@ -566,9 +590,9 @@ end
|
|
566
590
|
;---------------------------------------------------------------
|
567
591
|
; set filename for the automatically remapped file
|
568
592
|
undef("setRemapFilename")
|
569
|
-
function setRemapFilename(filename,itype,atmlev)
|
593
|
+
function setRemapFilename(filename,itype,resolution,atmlev)
|
570
594
|
begin
|
571
|
-
return setNewFilename(filename,"
|
595
|
+
return setNewFilename(filename,"remapnn_"+resolution,itype,atmlev)
|
572
596
|
end
|
573
597
|
undef("setZonmeanFilename")
|
574
598
|
function setZonmeanFilename(filename,itype,atmlev)
|
@@ -778,17 +802,24 @@ undef("setLevels")
|
|
778
802
|
procedure setLevels(selmode,resource,minvar,maxvar,scalelimit,numlevs,debug)
|
779
803
|
begin
|
780
804
|
if (selmode .eq. "manual") then
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
;;
|
789
|
-
;;
|
790
|
-
|
791
|
-
|
805
|
+
if ( .not. isvar("plotLevs") ) then
|
806
|
+
resource@cnLevelSelectionMode = "ManualLevels"
|
807
|
+
resource@cnMinLevelValF = minvar
|
808
|
+
resource@cnMaxLevelValF = maxvar
|
809
|
+
; diffLog10 = log10(abs(maxVar-minVar))
|
810
|
+
;; if (diffLog10 .lt. 0) then
|
811
|
+
; resource@cnLevelSpacingF = 10^(floor(diffLog10))/numLevs
|
812
|
+
;; else
|
813
|
+
;; resource@cnLevelSpacingF = 10^(floor(diffLog10))/numLevs
|
814
|
+
;; end if
|
815
|
+
diffspacing = abs(maxvar-minvar)/(int2flt(numlevs))
|
816
|
+
resource@cnLevelSpacingF = diffspacing
|
817
|
+
else
|
818
|
+
resource@cnLevelSelectionMode = "ExplicitLevels"
|
819
|
+
plotLevels = plotLevs
|
820
|
+
if (debug) print("plotlevels = "+plotLevels) end if
|
821
|
+
resource@cnLevels = plotLevels
|
822
|
+
end if
|
792
823
|
end if
|
793
824
|
|
794
825
|
if (selmode .eq. "halflog") then
|
@@ -810,17 +841,39 @@ end
|
|
810
841
|
;---------------------------------------------------------------
|
811
842
|
; Create a default NCL resource
|
812
843
|
undef("setDefaultResource")
|
813
|
-
|
814
|
-
begin
|
815
|
-
resource
|
816
|
-
|
817
|
-
|
818
|
-
resource@
|
819
|
-
resource@gsnSpreadColors
|
844
|
+
function setDefaultResource(verticallabelbar,withLines,withLineLabels,fillmode)
|
845
|
+
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
|
+
; lines/labels inside the plot ================================================
|
854
|
+
if (withLines) then
|
855
|
+
resource@cnLinesOn = True
|
856
|
+
else
|
857
|
+
resource@cnLinesOn = False
|
858
|
+
end if
|
859
|
+
resource@cnLineLabelsOn = False
|
860
|
+
if (withLineLabels ) then
|
861
|
+
withLines = True
|
862
|
+
resource@cnLineLabelsOn = True
|
863
|
+
resource@cnLineLabelFontHeightF = 0.008
|
864
|
+
resource@cnLineLabelFontThicknessF = 0.006
|
865
|
+
end if
|
866
|
+
if (withLines) resource@cnLinesOn = True end if
|
820
867
|
|
821
|
-
|
822
|
-
resource@
|
823
|
-
resource@
|
868
|
+
; representation of missing values ===========================================
|
869
|
+
delete(resource@cnMissingValFillPattern); no longer filling missing value areas
|
870
|
+
delete(resource@cnMissingValFillColor); no longer filling missing value areas
|
871
|
+
resource@cnMissingValPerimOn = True
|
872
|
+
resource@cnMissingValFillPattern = -1; set the missing value fill pattern to 5
|
873
|
+
resource@cnMissingValFillScaleF = 0.9; increase the density of the fill pattern (default = 1.0)
|
874
|
+
resource@cnMissingValPerimColor = "black"; change the missing value perimeter to black
|
875
|
+
resource@cnMissingValPerimDashPattern = 1; set the dash pattern of the missing value perimeter to 1
|
876
|
+
resource@cnMissingValPerimThicknessF = 1.0; increase the thickness of the missing value perimeter 3X
|
824
877
|
|
825
878
|
FontHeight0 = 0.012
|
826
879
|
FontHeight1 = 0.015
|
@@ -835,8 +888,7 @@ begin
|
|
835
888
|
resource@gsnStringFontHeightF = FontHeight0
|
836
889
|
|
837
890
|
resource@mpFillOn = True
|
838
|
-
|
839
|
-
|
891
|
+
; label settings ==============================================================
|
840
892
|
resource@lbLabelBarOn = True
|
841
893
|
if (verticallabelbar .eq. True) then
|
842
894
|
resource@lbOrientation = "vertical"
|
@@ -848,11 +900,12 @@ begin
|
|
848
900
|
resource@lbLabelAutoStride = True
|
849
901
|
resource@lbLabelFontHeightF = FontHeight1 ; color bar labels
|
850
902
|
|
851
|
-
resource@cnFillMode =
|
852
|
-
;resource@cnFillMode = "CellFill"
|
903
|
+
resource@cnFillMode = fillmode
|
853
904
|
resource@cnRasterSmoothingOn = True
|
854
905
|
resource@mpGreatCircleLinesOn = True
|
855
906
|
resource@stMinArrowSpacingF = 0.001
|
907
|
+
|
908
|
+
return resource
|
856
909
|
end
|
857
910
|
;---------------------------------------------------------------
|
858
911
|
undef("setDefaultSectionResource")
|
@@ -862,20 +915,32 @@ begin
|
|
862
915
|
resource@gsnFrame = False; don't turn page yet
|
863
916
|
resource@gsnDraw = False; don't draw yet
|
864
917
|
resource@tmXBMode = "Explicit"; explicitly label x-axis
|
918
|
+
latDiff = stringtodouble(secrc(1)) - stringtodouble(seclc(1))
|
919
|
+
tic = latDiff/(stringtodouble(secpoints)-1)
|
920
|
+
p = (points * tic) + stringtodouble(seclc(1))
|
921
|
+
; resource@tmXBValues = points
|
865
922
|
resource@tmXBValues = (/points(0),points(secpoints-1)/); points to label values
|
923
|
+
labels = new(dimsizes(p),string)
|
924
|
+
labels = p
|
925
|
+
;print(""+labels)
|
926
|
+
;resource@tmXBLabels = labels
|
866
927
|
resource@tmXBLabels = (/ seclc(1) +"N, "+ seclc(0)+"E" , secrc(1)+"N, "+secrc(0)+"E" /)
|
867
928
|
|
929
|
+
resource@tmXBLabelFontHeightF = 0.01
|
868
930
|
resource@cnFillOn = True; turn on color
|
869
931
|
resource@lbLabelAutoStride = True; nice label bar label stride
|
870
932
|
resource@gsnSpreadColors = True; use full range of colormap
|
871
933
|
resource@cnLinesOn = False; turn off countour lines
|
934
|
+
; if (useContourLines)
|
935
|
+
resource@cnLinesOn = False
|
936
|
+
resource@cnLineLabelsOn = False
|
872
937
|
resource@lbOrientation = "vertical"; vertical label bar
|
873
938
|
resource@pmLabelBarOrthogonalPosF = -0.05; move label bar closer to plot
|
874
939
|
resource@lbTitlePosition = "Bottom"
|
875
940
|
; resource@gsnYAxisIrregular2Log = True
|
876
941
|
|
877
|
-
delete(resource@cnMissingValFillPattern); no longer filling missing value areas
|
878
|
-
delete(resource@cnMissingValFillColor); no longer filling missing value areas
|
942
|
+
; delete(resource@cnMissingValFillPattern); no longer filling missing value areas
|
943
|
+
; delete(resource@cnMissingValFillColor); no longer filling missing value areas
|
879
944
|
resource@cnMissingValFillColor = "gray30"
|
880
945
|
resource@cnMissingValPerimOn = True
|
881
946
|
|
@@ -886,8 +951,11 @@ begin
|
|
886
951
|
resource@cnMissingValPerimDashPattern = 1; set the dash pattern of the missing value perimeter to 1
|
887
952
|
resource@cnMissingValPerimThicknessF = 3.0; increase the thickness of the missing value perimeter 3X
|
888
953
|
;resource@gsnYAxisIrregular2Log = True
|
954
|
+
resource@cnFillMode = "RasterFill"
|
955
|
+
resource@cnRasterSmoothingOn = False
|
889
956
|
return resource
|
890
957
|
end
|
958
|
+
;---------------------------------------------------------------
|
891
959
|
undef("setDefaultOverlayResource")
|
892
960
|
procedure setDefaultOverlayResource(resource)
|
893
961
|
begin
|
@@ -905,6 +973,30 @@ begin
|
|
905
973
|
resource@lbLabelBarOn = False; switch of the vector label bar, because the speed is show as vector lenghts
|
906
974
|
end
|
907
975
|
;---------------------------------------------------------------
|
976
|
+
undef("setDefaultColors")
|
977
|
+
procedure setDefaultColors(resource,minval,maxval,debug)
|
978
|
+
begin
|
979
|
+
; white is color 135
|
980
|
+
if ((minval*maxval) .LT. 0.0) then ; data goes fro positiv to negative or vs.
|
981
|
+
if (abs(maxval) .GT. abs(minval)) then
|
982
|
+
resource@gsnSpreadColorStart = 135 - toint(126*(abs(minval)/abs(maxval)))
|
983
|
+
resource@gsnSpreadColorEnd = 255
|
984
|
+
else
|
985
|
+
resource@gsnSpreadColorStart = 2
|
986
|
+
resource@gsnSpreadColorEnd = 135 + toint(126*(abs(maxval)/abs(minval)))
|
987
|
+
end if
|
988
|
+
resource@gsnContourZeroLineThicknessF = 2.0
|
989
|
+
if (debug) then
|
990
|
+
print("===================== COMPUTE the COLORS to make zero WHITE:")
|
991
|
+
print("minval: "+minval)
|
992
|
+
print("maxval: "+maxval)
|
993
|
+
print("100*(toint(abs(minval)/abs(maxval))): "+toint(100*(abs(minval)/abs(maxval))))
|
994
|
+
print("resource@gsnSpreadColorStart:" + resource@gsnSpreadColorStart)
|
995
|
+
print("resource@gsnSpreadColorEnd :" + resource@gsnSpreadColorEnd)
|
996
|
+
end if
|
997
|
+
end if
|
998
|
+
end
|
999
|
+
;---------------------------------------------------------------
|
908
1000
|
undef("shift4SecMap")
|
909
1001
|
procedure shift4SecMap(resource)
|
910
1002
|
begin
|
@@ -1031,6 +1123,7 @@ begin
|
|
1031
1123
|
else
|
1032
1124
|
resource@lbTitleString = ""
|
1033
1125
|
end if
|
1126
|
+
resource@tiMainFontHeightF = 0.02
|
1034
1127
|
if (itype .eq. "atm" .and. varname .eq. "T" .and. k2c) resource@lbTitleString = "C" end if
|
1035
1128
|
|
1036
1129
|
resource@lbTitlePosition = "Bottom"
|
@@ -1038,6 +1131,8 @@ begin
|
|
1038
1131
|
resource@lbTitleFontHeightF = 0.02
|
1039
1132
|
resource@lbLabelFontHeightF = 0.015
|
1040
1133
|
resource@lbLeftMarginF = 0.01
|
1134
|
+
resource@cnLabelMasking = True
|
1135
|
+
resource@cnLabelMasking = True
|
1041
1136
|
end
|
1042
1137
|
;---------------------------------------------------------------
|
1043
1138
|
; vertical axes label for section plot
|
@@ -1183,10 +1278,9 @@ end
|
|
1183
1278
|
undef("setMaskColor")
|
1184
1279
|
procedure setMaskColor(wks,resource)
|
1185
1280
|
begin
|
1186
|
-
|
1187
|
-
|
1188
|
-
resource@
|
1189
|
-
resource@cnMissingValFillColor = 20 ; last color is used for missing values
|
1281
|
+
resource@cnMissingValFillColor = "gray90"
|
1282
|
+
resource@cnMissingValPerimOn = True; turn on missing value outlines
|
1283
|
+
resource@cnMissingValPerimThicknessF = 2.5; set the missing value outline thickness
|
1190
1284
|
end
|
1191
1285
|
;---------------------------------------------------------------
|
1192
1286
|
; set the coordinates for an ICON data field
|
@@ -1298,31 +1392,92 @@ begin
|
|
1298
1392
|
return gridtype
|
1299
1393
|
end
|
1300
1394
|
;---------------------------------------------------------------
|
1395
|
+
; compute the straight line between two corners
|
1396
|
+
undef("getStraightPath")
|
1397
|
+
function getStraightPath(startCorner,endCorner,npoints)
|
1398
|
+
begin
|
1399
|
+
startLat = tofloat(startCorner(1))
|
1400
|
+
endLat = tofloat(endCorner(1))
|
1401
|
+
startLon = tofloat(startCorner(0))
|
1402
|
+
endLon = tofloat(endCorner(0))
|
1403
|
+
|
1404
|
+
if (startLon .lt. 0.0) then
|
1405
|
+
startLon = startLon + 360.0
|
1406
|
+
endLon = endLon + 360.0
|
1407
|
+
end if
|
1408
|
+
|
1409
|
+
lats = fspan(startLat,endLat,npoints)
|
1410
|
+
lons = fspan(startLon,endLon,npoints)
|
1411
|
+
; dont let the lons be greater than 360, because theses values will not be in
|
1412
|
+
; the data. Otherwise an interpolation error will occur
|
1413
|
+
lons = where(lons.gt.360, lons-360.0, lons)
|
1414
|
+
|
1415
|
+
distRes = True
|
1416
|
+
distRes@lat = lats
|
1417
|
+
distRes@lon = lons
|
1418
|
+
|
1419
|
+
return distRes
|
1420
|
+
end
|
1421
|
+
;---------------------------------------------------------------
|
1422
|
+
; compute the distance between two points of great circle
|
1423
|
+
undef("getCirclePath")
|
1424
|
+
function getCirclePath(startCorner,endCorner,npoints)
|
1425
|
+
begin
|
1426
|
+
startLat = startCorner(1)
|
1427
|
+
endLat = endCorner(1)
|
1428
|
+
|
1429
|
+
startLon = startCorner(0)
|
1430
|
+
endLon = endCorner(0)
|
1431
|
+
|
1432
|
+
distRes = True
|
1433
|
+
dist = gc_latlon(startLat,startLon,endLat,endLon,npoints,2)
|
1434
|
+
distRes@lat = dist@gclat
|
1435
|
+
distRes@lon = dist@gclon
|
1436
|
+
|
1437
|
+
return distRes
|
1438
|
+
end
|
1439
|
+
;---------------------------------------------------------------
|
1440
|
+
; compute the path of the cross-section
|
1441
|
+
undef("getSectionPath")
|
1442
|
+
function getSectionPath(seclc,secrc,secpoints,secmode)
|
1443
|
+
begin
|
1444
|
+
if (secmode .eq. "straight") then
|
1445
|
+
pathRes = getStraightPath(seclc,secrc,secpoints)
|
1446
|
+
else
|
1447
|
+
pathRes = getCirclePath(seclc,secrc,secpoints)
|
1448
|
+
end if
|
1449
|
+
return pathRes
|
1450
|
+
end
|
1451
|
+
;---------------------------------------------------------------
|
1452
|
+
; compute the path of the cross-section but suitable for plotting in a separate Map
|
1453
|
+
undef("getSectionPathForMap")
|
1454
|
+
function getSectionPathForMap(seclc,secrc,secpoints,secmode)
|
1455
|
+
begin
|
1456
|
+
pathRes = getSectionPath(seclc,secrc,secpoints,secmode)
|
1457
|
+
pathRes@lon = where(pathRes@lon.lt.pathRes@lon(0),pathRes@lon + 360.0,pathRes@lon)
|
1458
|
+
return pathRes
|
1459
|
+
end
|
1460
|
+
;---------------------------------------------------------------
|
1301
1461
|
; setting for vertical cross sections based on remapped icon data
|
1302
1462
|
undef("setSection")
|
1303
|
-
function setSection(
|
1463
|
+
function setSection(seclc,secrc,secpoints,var,secmode)
|
1304
1464
|
begin
|
1305
|
-
|
1306
|
-
rightlat = secRC(1)
|
1465
|
+
pathRes = getSectionPath(seclc,secrc,secpoints,secmode)
|
1307
1466
|
|
1308
|
-
|
1309
|
-
rightlon = secRC(0)
|
1310
|
-
|
1311
|
-
dist = gc_latlon(leftlat,leftlon,rightlat,rightlon,npoints,2)
|
1312
|
-
trans = linint2_points(var&lon,var&lat,var,True,dist@gclon,dist@gclat,2)
|
1467
|
+
trans = linint2_points(var&lon,var&lat,var,True,pathRes@lon,pathRes@lat,2)
|
1313
1468
|
|
1314
1469
|
return trans
|
1315
1470
|
end
|
1316
1471
|
;---------------------------------------------------------------
|
1317
1472
|
; setting for vertical cross sections based on remapped icon data
|
1318
1473
|
undef("setSectionFromHybridPress")
|
1319
|
-
function setSectionFromHybridPress(
|
1474
|
+
function setSectionFromHybridPress(seclc,secrc,npoints,var,filehandle,timestep)
|
1320
1475
|
begin
|
1321
|
-
leftlat =
|
1322
|
-
rightlat =
|
1476
|
+
leftlat = seclc(1)
|
1477
|
+
rightlat = secrc(1)
|
1323
1478
|
|
1324
|
-
leftlon =
|
1325
|
-
rightlon =
|
1479
|
+
leftlon = seclc(0)
|
1480
|
+
rightlon = secrc(0)
|
1326
1481
|
|
1327
1482
|
;config
|
1328
1483
|
pressName = "PS"
|
@@ -1557,8 +1712,8 @@ begin
|
|
1557
1712
|
end
|
1558
1713
|
;---------------------------------------------------------------
|
1559
1714
|
; Create a resource for the grid plot
|
1560
|
-
undef("
|
1561
|
-
|
1715
|
+
undef("performGridPlot")
|
1716
|
+
procedure performGridPlot(var,levels,colors,boundslon,boundslat,wks,plot,flags,debug)
|
1562
1717
|
begin
|
1563
1718
|
pres = True
|
1564
1719
|
pres@gsEdgesOn = True ; Turn on edges
|
@@ -1571,7 +1726,9 @@ begin
|
|
1571
1726
|
if (.not. ismissing(vlow(0))) then
|
1572
1727
|
do j = 0, dimsizes(vlow)-1
|
1573
1728
|
pres@gsFillColor = colors(i) ; first color
|
1729
|
+
if ( flags(vlow(i))) then
|
1574
1730
|
gsn_polygon(wks,plot,boundslon(vlow(j),:),boundslat(vlow(j),:),pres)
|
1731
|
+
end if
|
1575
1732
|
end do
|
1576
1733
|
end if
|
1577
1734
|
if (debug) then
|
@@ -1587,7 +1744,9 @@ begin
|
|
1587
1744
|
if (.not. ismissing(vind(0))) then
|
1588
1745
|
do j = 0, dimsizes(vind)-1
|
1589
1746
|
pres@gsFillColor = colors(i+1)
|
1590
|
-
|
1747
|
+
;if ( flags(vind(i))) then
|
1748
|
+
gsn_polygon( wks,plot, boundslon(vind(j),:),boundslat(vind(j),:),pres)
|
1749
|
+
;end if
|
1591
1750
|
end do
|
1592
1751
|
end if
|
1593
1752
|
if (debug) then
|
@@ -1603,18 +1762,30 @@ begin
|
|
1603
1762
|
|
1604
1763
|
; if no index vhig is found with values larger levels(max-1), vhig is missing value:
|
1605
1764
|
if (.not. ismissing(vhig(0))) then
|
1606
|
-
|
1607
|
-
|
1608
|
-
|
1609
|
-
|
1765
|
+
do j = 0, dimsizes(vhig) -1
|
1766
|
+
pres@gsFillColor = colors(i+1)
|
1767
|
+
if ( flags(vhig(i))) then
|
1768
|
+
gsn_polygon(wks,plot,boundslon(vhig(j),:),boundslat(vhig(j),:),pres)
|
1769
|
+
end if
|
1770
|
+
end do
|
1610
1771
|
end if
|
1611
1772
|
if (debug) then
|
1612
1773
|
print ("i=" + i + ", Values larger than "+levels(i) +": " \
|
1613
1774
|
+ dimsizes(vhig) + " triangles considered, color= " + colors(i+1))
|
1614
1775
|
end if
|
1615
1776
|
delete(vhig)
|
1616
|
-
|
1617
|
-
|
1777
|
+
end
|
1778
|
+
;---------------------------------------------------------------
|
1779
|
+
; mark the cell location
|
1780
|
+
undef("plotCellMarkers")
|
1781
|
+
procedure plotCellMarkers(cell_lons,cell_lats,wks,plot,debug)
|
1782
|
+
begin
|
1783
|
+
pres = True
|
1784
|
+
pres@gsMarkerIndex = 1
|
1785
|
+
pres@gsMarkerSizeF = 0.003
|
1786
|
+
do i = 0,dimsizes(cell_lons)-1
|
1787
|
+
gsn_polymarker(wks,plot,cell_lons(i),cell_lats(i),pres)
|
1788
|
+
end do
|
1618
1789
|
end
|
1619
1790
|
;---------------------------------------------------------------
|
1620
1791
|
; Plot the ICON grid of a variable to the plot.
|
@@ -1637,8 +1808,7 @@ begin
|
|
1637
1808
|
levels = getLevelsFromPlot(plot)
|
1638
1809
|
|
1639
1810
|
if (debug) printGridPlotInfo(colors,levels,flags) end if
|
1640
|
-
|
1641
|
-
pres = setupGridResource(variable,levels,colors,boundslon,boundslat,workstation,plot,debug)
|
1811
|
+
performGridPlot(variable,levels,colors,boundslon,boundslat,workstation,plot,flags,debug)
|
1642
1812
|
end
|
1643
1813
|
;---------------------------------------------------------------
|
1644
1814
|
; read in mask variable
|
@@ -1651,6 +1821,11 @@ end
|
|
1651
1821
|
undef("plotVecOrStream")
|
1652
1822
|
function plotVecOrStream(useScalar,useStreamlines,uvar,vvar,scalarvar,resource,workstation,showMap)
|
1653
1823
|
begin
|
1824
|
+
; streamline setup
|
1825
|
+
resource@stArrowStride = 3; arrows start every third
|
1826
|
+
resource@stArrowLengthF = 0.002; default is dynamic
|
1827
|
+
resource@stMinDistanceF = 0.025; streamline dist
|
1828
|
+
resource@stLineThicknessF = 2.0; streamline thickness
|
1654
1829
|
if (useScalar) then
|
1655
1830
|
if (useStreamlines) then
|
1656
1831
|
if (showMap)
|
@@ -1684,4 +1859,4 @@ begin
|
|
1684
1859
|
end
|
1685
1860
|
|
1686
1861
|
;
|
1687
|
-
; vim:
|
1862
|
+
; vim:ft=ncl
|
data/test/test_iconPlot.rb
CHANGED
@@ -20,15 +20,17 @@ class TestIconPlot < Test::Unit::TestCase
|
|
20
20
|
if 'thingol' == `hostname`.chomp
|
21
21
|
def test_simple
|
22
22
|
ip = IconPlot.new(CALLER,PLOTTER,PLOTLIB,OFMT,PLOT_CMD,CDO,true)
|
23
|
+
ip.debug = true
|
23
24
|
ofile = 'test_icon_plot'
|
24
|
-
ip.show(ip.scalarPlot(OCE_PLOT_TEST_FILE, ofile,"T",:levIndex => 0))
|
25
|
-
ip.show(ip.scalarPlot(OCE_PLOT_TEST_FILE, ofile,"T",:levIndex => 2))
|
26
|
-
ip.show(ip.vectorPlot(OCE_PLOT_TEST_FILE, ofile,"u-veloc v-veloc",:levIndex => 2))
|
27
|
-
ip.show(ip.scalarPlot(OCE_PLOT_TEST_FILE, ofile,"T",:vecVars => "u-veloc,v-veloc",:levIndex => 2,:mapType => "ortho"))
|
28
|
-
ip.show(ip.scalarPlot(OCE_PLOT_TEST_FILE, ofile,"T",:vecVars => "u-veloc,v-veloc",:levIndex => 2,:secLC => "-20,-60", :secRC => "-20,60"))
|
29
|
-
ip.show(ip.scalarPlot(OCELSM_PLOT_TEST_FILE,ofile,"T",:vecVars => "u-veloc,v-veloc",:levIndex => 2,:secLC => "-20,-60", :secRC => "-20,60",:maskName => 'wet_c'))
|
30
|
-
ip.show(ip.scalarPlot(OCELSM_PLOT_TEST_FILE,ofile,"T",:vecVars => "u-veloc,v-veloc",:levIndex => 2,:maskName => 'wet_c'))
|
31
|
-
ip.show(ip.scalarPlot(OCELSM_PLOT_TEST_FILE,ofile,"T",:levIndex => 2,:maskName => 'wet_c'))
|
25
|
+
ip.show(ip.scalarPlot(OCE_PLOT_TEST_FILE, ofile+'_00',"T",:levIndex => 0))
|
26
|
+
ip.show(ip.scalarPlot(OCE_PLOT_TEST_FILE, ofile+'_01',"T",:levIndex => 2))
|
27
|
+
ip.show(ip.vectorPlot(OCE_PLOT_TEST_FILE, ofile+'_02',"u-veloc v-veloc",:levIndex => 2))
|
28
|
+
ip.show(ip.scalarPlot(OCE_PLOT_TEST_FILE, ofile+'_03',"T",:vecVars => "u-veloc,v-veloc",:levIndex => 2,:mapType => "ortho"))
|
29
|
+
ip.show(ip.scalarPlot(OCE_PLOT_TEST_FILE, ofile+'_04',"T",:vecVars => "u-veloc,v-veloc",:levIndex => 2,:secLC => "-20,-60", :secRC => "-20,60"))
|
30
|
+
ip.show(ip.scalarPlot(OCELSM_PLOT_TEST_FILE,ofile+'_05',"T",:vecVars => "u-veloc,v-veloc",:levIndex => 2,:secLC => "-20,-60", :secRC => "-20,60",:maskName => 'wet_c'))
|
31
|
+
ip.show(ip.scalarPlot(OCELSM_PLOT_TEST_FILE,ofile+'_05',"T",:vecVars => "u-veloc,v-veloc",:levIndex => 2,:secLC => "-50,-60", :secRC => "0,60",:maskName => 'wet_c',:secMode => 'circle'))
|
32
|
+
ip.show(ip.scalarPlot(OCELSM_PLOT_TEST_FILE,ofile+'_06',"T",:vecVars => "u-veloc,v-veloc",:levIndex => 2,:maskName => 'wet_c'))
|
33
|
+
ip.show(ip.scalarPlot(OCELSM_PLOT_TEST_FILE,ofile+'_07',"T",:levIndex => 2,:maskName => 'wet_c'))
|
32
34
|
ip.isIcon = false
|
33
35
|
ip.show(ip.scalarPlot("remapnn_r90x45_oce.nc","reg_"+ofile,"T",:levIndex => 2,:mapType => "ortho"))
|
34
36
|
ip.show(ip.scalarPlot("remapnn_r90x45_oce.nc","reg_"+ofile,"T",:vecVars => "u-veloc,v-veloc",:levIndex => 2,:mapType => "ortho"))
|
metadata
CHANGED
@@ -1,100 +1,93 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iconPlot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.8
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ralf Mueller
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-03-26 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: cdo
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: extcsv
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: gnuplot
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
|
-
description:
|
55
|
+
description: 'Plot with ncl via Ruby: requires NCL 6.* and CDO 1.5.*'
|
63
56
|
email: stark.dreamdetective@gmail.com
|
64
|
-
executables:
|
57
|
+
executables:
|
58
|
+
- nclsh
|
65
59
|
extensions: []
|
66
60
|
extra_rdoc_files: []
|
67
61
|
files:
|
68
62
|
- lib/iconPlot.rb
|
69
63
|
- gemspec
|
70
|
-
-
|
64
|
+
- bin/nclsh
|
71
65
|
- lib/icon_plot.ncl
|
72
66
|
- lib/icon_plot_lib.ncl
|
73
67
|
- test/test_iconPlot.rb
|
74
68
|
homepage: https://github.com/Try2Code/iconPlot
|
75
69
|
licenses:
|
76
70
|
- GPLv2
|
71
|
+
metadata: {}
|
77
72
|
post_install_message:
|
78
73
|
rdoc_options: []
|
79
74
|
require_paths:
|
80
75
|
- lib
|
81
76
|
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
77
|
requirements:
|
84
|
-
- -
|
78
|
+
- - '>='
|
85
79
|
- !ruby/object:Gem::Version
|
86
80
|
version: '1.8'
|
87
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
-
none: false
|
89
82
|
requirements:
|
90
|
-
- -
|
83
|
+
- - '>='
|
91
84
|
- !ruby/object:Gem::Version
|
92
85
|
version: '0'
|
93
86
|
requirements: []
|
94
87
|
rubyforge_project:
|
95
|
-
rubygems_version:
|
88
|
+
rubygems_version: 2.0.0
|
96
89
|
signing_key:
|
97
|
-
specification_version:
|
90
|
+
specification_version: 4
|
98
91
|
summary: Plot ICON output with ncl via Ruby
|
99
92
|
test_files:
|
100
93
|
- test/test_iconPlot.rb
|