; ; In this example, constant data specify irregular tick mark function. ; These data are the dry adiabatic lapse rate for constant Delet T ; and standard atmosphere. ; stnd_pres = (/ 1000, 939.411, 881.493, 826.175, 773.384, 723.05, 675.103 \ , 629.473, 586.092, 544.892, 505.805, 468.766, 433.707, 400.564, 369.273, \ 339.769, 311.991, 285.875, 261.362, 238.389, 216.897, 196.828, 178.122, \ 160.724, 144.575, 129.622, 115.808, 103.08, 91.3853, 80.6712, 70.8867, 61.9816,\ 53.9064, 46.6129, 40.0537, 34.1825, 28.9539, 24.3237, 20.2486, 16.6867 /) ; ; Sort x and move coresponding values of y into ; the same locations. ; procedure sortit( x[*]:float, ; x coordinate field that gets sorted y[*]:float ; corresponding y coordinate ) local ind, ; temporary value that holds index of value to be swapped k, ; index variable p, ; index variable tmp ; temporary value used to swap individual values begin ind = 0 do k = 0, dimsizes(x) - 2 ind = k if(.not. ismissing(x(ind))) then do p = k + 1, dimsizes(x) - 1 if((.not. ismissing(x(p))).and.(x(ind) .ge. x(p))) then ind = p end if end do if(ind .ne. k) then tmp = x(ind) x(ind) = x(k) x(k) = tmp tmp = y(ind) y(ind) = y(k) y(k) = tmp end if end if end do end ; ; Take two sets of sorted (x,y) arrays and merge them into a single ; ordered set of x, y pairs. ; procedure merge( x[*]:numeric, ; data to be merged with x1 y[*]:numeric, ; corresponding y coordinate for x x1[*]:numeric, ; data to be merged with x y1[*]:numeric, ; corresponding y coordinate for y1 xout[*]:numeric, ; output array containing merge of x and x1 yout[*]:numeric, ; output array of corresponding coordinates size_man:integer, ; size of x and y size_sig:integer ; size of x1 and y1 ) local m, ; index variable l, ; index variable done, ; set to one when done merging j ; index variable begin m = 0 l = 0 done = 0 j = 0 do while(done .eq. 0) ; ; Example of "lazy" conditional expression evaluation. First, the array ; index is checked to see if it is in range; if True, then the portion ; of the conditional expression that derefences the array is used. ; if(((l.ge.size_man).or.(.not.ismissing(y(l)))).and.((m.ge.size_sig).or.(.not.ismissing(y1(m))))) if((m .lt. size_sig) .and. (l .lt. size_man)) then if(y(l) .lt. y1(m)) then xout(j) = x(l) yout(j) = y(l) l = l + 1 else if(y(l) .gt. y1(m)) then xout(j) = x1(m) yout(j) = y1(m) m = m+1 else xout(j) = x(l) yout(j) = y(l) l = l + 1 j = j + 1 xout(j) = x1(m) yout(j) = y1(m) m = m + 1 end if end if else if(m .lt. size_sig) then xout(j) = x1(m) yout(j) = y1(m) m = m + 1 else xout(j) = x(l) yout(j) = y(l) l = l + 1 end if end if j = j + 1 else if(l.lt.size_man) if(ismissing(y(l))) l = l +1 end if end if if(m.lt.size_sig) if(ismissing(y1(m))) m = m +1 end if end if end if if((l.eq.size_man).and.(m.eq.size_sig)) done = 1 end if end do end ; ; Open data file containing upper-air radiosonde data. ; a = addfile("data/94082512_upa.cdf","r") ; ; Create an X workstation. ; x = create "x" xWorkstationLayerClass noparent end create ; ; Search for Denver report. ; do i = 0,dimsizes(a->id(:,0)) if(a->id(i,:) .eq. "DEN" ) then break end if end do ; ; Read in samples for temperature and pressure at mandatory pressure values ; for the Denver upper-air report and sort it by pressure. ; P_man = a->P_man(i,:) T_man = a->T_man(i,:) sortit(P_man,T_man) ; ; Read in samples for temperature and pressure at significant levels for ; the Denver upper-air report and sort it by pressure. ; P_sigt = a->P_sigt(i,:) T_sigt = a->T_sigt(i,:) sortit(P_sigt,T_sigt) ; ; Read in samples for dewpoint and pressure at mandatory pressure values ; for the Denver upper-air report and sort it by pressure. ; P_man2 = a->P_man(i,:) TD_man = a->TD_man(i,:) sortit(P_man2,TD_man) ; ; Read in samples for dewpoint and pressure at significant levels for ; the Denver upper-air report and sort it by pressure. ; P_sigt2 = a->P_sigt(i,:) TD_sigt = a->TD_sigt(i,:) sortit(P_sigt2,TD_sigt) size_man = dimsizes(P_man) size_sig = dimsizes(P_sigt) ; ; Create variables to contain data after merging by the merge procedure. ; tmp_t = new(size_man + size_sig , float) tmp_p = new(size_man + size_sig , float) tmp_p2 = new(size_man + size_sig , float) tmp_td = new(size_man + size_sig , float) ; ; Call the merge function to merge the two sorted lists of pressure temperature ; pressure pairs into a single list. ; merge(T_man,P_man,T_sigt,P_sigt,tmp_t,tmp_p,size_man,size_sig) ; ; Do same for dewpoint. ; merge(TD_man,P_man2,TD_sigt,P_sigt2,tmp_td,tmp_p2,size_man,size_sig) ; ; Create data object with merged dewpoint profile. ; mydatatd = create "mydatatd" coordArraysLayerClass noparent "caXArray" : tmp_td "caYArray" : tmp_p2 "caXMissingV" : tmp_td@_FillValue "caYMissingV" : tmp_p2@_FillValue end create ; ; Create data object with just mandatory dewpoint samples. ; mydata1td = create "mydata1td" coordArraysLayerClass noparent "caYArray" : P_man2 "caXArray" : TD_man "caXMissingV" : P_man2@_FillValue "caYMissingV" : TD_man@_FillValue end create ; ; Create data object with just significant dewpoint samples. ; mydata2td = create "mydata2td" coordArraysLayerClass noparent "caYArray" : P_sigt2 "caXArray" : TD_sigt "caXMissingV" : P_sigt2 "caYMissingV" : TD_sigt end create ; ; Create a data-dependent object for the merged dewpoint set and assign ; the data-dependent line color resource. ; xy_deptd = create "xy_deptd" xyDataDepLayerClass noparent "dsDataItem" : mydatatd "xyColor" : 80 end create ; ; Create a data-dependent object for the mandatory dataset and configure ; it to draw the data with markers only, essentially overlaying this ; on top of the above line. ; xy_dep1td = create "xy_dep1td" xyDataDepLayerClass noparent "dsDataItem" : mydata1td "xyMarker" : 3 "xyMarkerMode": "MARKERSONLY" "xyMarkerColor": 50 "xyMarkerSizeF": .015 end create ; ; Do the same thing with significant-level data, but change the ; color and marker index. ; xy_dep2td = create "xy_dep2td" xyDataDepLayerClass noparent "dsDataItem" : mydata2td "xyMarker" : 6 "xyMarkerMode": "MARKERSONLY" "xyMarkerColor": 20 "xyMarkerSizeF": .015 end create ; ; Create data objects out of temperature profiles in the same way that ; the dewpoint objects were created. ; mydata = create "mydata" coordArraysLayerClass noparent "caXArray" : tmp_t "caYArray" : tmp_p "caXMissingV" : tmp_t@_FillValue "caYMissingV" : tmp_p@_FillValue end create mydata1 = create "mydata1" coordArraysLayerClass noparent "caYArray" : P_man "caXArray" : T_man "caXMissingV" : T_man@_FillValue "caYMissingV" : P_man@_FillValue end create mydata2 = create "mydata2" coordArraysLayerClass noparent "caYArray" : P_sigt "caXArray" : T_sigt "caXMissingV" : T_sigt@_FillValue "caYMissingV" : P_sigt@_FillValue end create ; ; Configure main merged array to draw a line and the individual mandatory ; and significant sample to draw markers only ; xy_dep = create "xy_dep" xyDataDepLayerClass noparent "dsDataItem" : mydata "xyColor" : 20 end create xy_dep1 = create "xy_dep1" xyDataDepLayerClass noparent "dsDataItem" : mydata1 "xyMarker" : 3 "xyMarkerMode": "MARKERSONLY" "xyMarkerColor": 50 "xyMarkerSizeF": .015 end create xy_dep2 = create "xy_dep2" xyDataDepLayerClass noparent "dsDataItem" : mydata2 "xyMarker" : 6 "xyMarkerMode": "MARKERSONLY" "xyMarkerColor": 20 "xyMarkerSizeF": .015 end create ; ; Main XyPlot object with all six data-dependent objects assigned ; to it. The data transformation is configured to be an irregular transformation ; in the y axis by assigning the stnd_pres variable to the xyIrregularPoints ; resource. ; xy_plot = create "xy_plot" xyPlotLayerClass x "vpXF" : .15 "vpYF" : .85 "vpWidthF" : .7 "vpHeightF" : .7 "xyCurveData" : (/xy_dep,xy_dep1,xy_dep2,xy_deptd,xy_dep1td,xy_dep2td/) "tiMainOn" : "True" "tiXAxisOn" : "True" "tiYAxisOn" : "True" "xyYReverse" : "True" "xyYIrregularPoints" : stnd_pres "xyYStyle" : "IRREGULAR" "xyYMinF" : 17.00 "xyYMaxF" : 1000.0 "xyXMinF" : -80.0 "xyXMaxF" : 30.0 "tiXAxisString" : "Temperature" "tiYAxisString" : "Pressure" "tiMainString" : "Stuve Plot" "tiXAxisFont" : "courier" "tiYAxisFont" : "courier" "tiMainFont" : "courier" end create ; ; Draw the whole thing. ; draw(xy_plot) update(x)