load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl" load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl" begin ; *************************************************** ; read parameter_list ; *************************************************** if (isfilepresent("~/.ncl_preferences")) then parameter = asciiread("~/.ncl_preferences",129,"string") delete(parameter@_FillValue) else if (isfilepresent("~/palm/current_version/trunk/SCRIPTS/NCL/.ncl_preferences")) then parameter = asciiread("~/palm/current_version/trunk/SCRIPTS/NCL/.ncl_preferences",129,"string") delete(parameter@_FillValue) else print(" ") print("'.ncl_preferences' does not exist in '~/palm/current_version/trunk/SCRIPTS/NCL/'") print(" ") exit end if end if if ( .not. isvar("file_1") ) then if (parameter(7) .EQ. "File in") then print(" ") print("Please provide 1st input file 'file_1=' either in prompt or parameter_list") print(" ") exit else file_in = parameter(7) end if else file_in = file_1 end if if (.not. isfilepresent(file_in)) then print(" ") print("Your 1st input file: '"+file_in+"' does not exist") print(" ") exit end if if ( .not. isvar("format_out") ) then format_out = "x11" if (parameter(9) .NE. "x11") then format_out = parameter(9) if (format_out .NE. "x11" .AND. format_out .NE. "pdf" .AND. format_out .NE. "eps" .AND. format_out .NE. "ps" .AND. format_out .NE. "epsi" .AND. format_out .NE. "ncgm")then print(" ") print("Your 'format_out = "+format_out+"' is invalid and set to'x11'") print(" ") end if end if else if (format_out .NE. "x11" .AND. format_out .NE. "pdf" .AND. format_out .NE. "eps" .AND. format_out .NE. "ps" .AND. format_out .NE. "epsi" .AND. format_out .NE. "ncgm")then print(" ") print("Your 'format_out = "+format_out+"' is invalid and set to'x11'") print(" ") end if end if if ( .not. isvar("file_out") ) then file_out = "test" if (parameter(11) .NE. "test_ts") then file_out = parameter(11) end if end if if ( .not. isvar("no_columns") ) then no_columns = 1 if (parameter(17) .NE. "1") then no_columns = stringtointeger(parameter(17)) end if end if if ( .not. isvar("no_lines") ) then no_lines = 2 if (parameter(19) .NE. "2") then no_lines = stringtointeger(parameter(19)) end if end if if (.not. isvar("logy"))then logy = 0 if (stringtointeger(parameter(77)) .NE. 0) then logy = stringtointeger(parameter(77)) if (stringtointeger(parameter(77)) .NE. 1) then print(" ") print("Your 'logy'= "+logy+" is invalid and set to 0") print(" ") logy = 0 end if end if else if (logy .NE. 0 .AND. logy .NE. 1)then print(" ") print("Your 'logy'= "+logy+" is invalid and set to 0") print(" ") logy = 0 end if end if if ( .not. isvar("sort") ) then sort = "layer" if (parameter(51) .NE. "layer") then sort = parameter(51) if (sort .NE. "time") then print(" ") print("Your 'sort'= "+sort+" is invalid and set to 'layer'") print(" ") sort = "layer" end if end if else if (sort .NE. "time" .OR. sort .NE. "layer")then print(" ") print("Your 'sort'= "+sort+" is invalid and set to 'layer'") print(" ") sort = "layer" end if end if if ( .not. isvar("black") ) then black = 0 if (parameter(31) .NE. "0") then black = stringtointeger(parameter(31)) if (stringtointeger(parameter(31)) .NE. 1) then print(" ") print("Your 'black'= "+black+" is invalid and set to 0") print(" ") black = 0 end if end if else if (black .NE. 0 .AND. black .NE. 1)then print(" ") print("Your 'black'= "+black+" is invalid and set to 0") print(" ") black = 0 end if end if if ( .not. isvar("dash") ) then dash = 0 if (parameter(29) .NE. "0") then dash = stringtointeger(parameter(29)) if (stringtointeger(parameter(29)) .NE. 1) then print(" ") print("Your 'dash'= "+dash+" is invalid and set to 0") print(" ") dash = 0 end if end if else if (dash .NE. 0 .AND. dash .NE. 1)then print(" ") print("Your 'dash'= "+dash+" is invalid and set to 0") print(" ") dash = 0 end if end if if ( .not. isvar("norm") ) then norm = 1.0 if (parameter(79) .NE. "1") then norm = stringtofloat(parameter(79)) if (stringtofloat(parameter(79)) .EQ. 0) then print(" ") print("You cannot normalise with 0, 'norm' is set to 1") print(" ") norm = 1.0 end if end if else if (norm .EQ. 0) then print(" ") print("You cannot normalise with 0, 'norm' is set to 1") print(" ") norm = 1.0 end if end if f=addfile(file_in,"r") vNam = getfilevarnames(f) print(" ") print("Variable in input file: " + vNam) print(" ") dim = dimsizes(vNam) vDim = getfiledimsizes(f) t_all = f->time nt = dimsizes(t_all) delta_t=t_all(nt-1)/nt do i=0,dim-1 if (vNam(i) .EQ. "zu_sp")then zu=f->zu_sp z=zu dimz=dimsizes(zu) else if (vNam(i) .EQ. "zw_sp")then zw=f->zw_sp z=zw dimz=dimsizes(zw) end if end if end do ; **************************************************** ; start of time step and different types of mistakes that could be done ; **************************************************** if ( .not. isvar("start_time_step") ) then start_time_step=t_all(0)/3600 if (parameter(13) .NE. "t(0)") then if (stringtodouble(parameter(13)) .GT. t_all(nt-1)/3600)then print(" ") print("'start_time_step' = "+ parameter(13) +"h is greater than last time step = " + t_all(nt-1)+"s = "+t_all(nt-1)/3600+"h") print(" ") print("Please select another 'start_time_step'") print(" ") exit end if if (stringtofloat(parameter(13)) .LT. t_all(0)/3600)then print(" ") print("'start_time_step' = "+ parameter(13) +"h is lower than first time step = " + t_all(0)+"s = "+t_all(0)/3600+"h") exit end if start_time_step=stringtodouble(parameter(13)) end if else if (start_time_step .GT. t_all(nt-1)/3600)then print(" ") print("'start_time_step' = "+ start_time_step +"h is greater than last time step = " + t_all(nt-1)+"s = "+t_all(nt-1)/3600+"h") print(" ") print("Please select another 'start_time_step'") print(" ") exit end if if (start_time_step .LT. t_all(0)/3600)then print(" ") print("'start_time_step' = "+ start_time_step +"h is lower than first time step = " + t_all(0)+"s = "+t_all(0)/3600+"h") exit end if end if start_time_step = start_time_step*3600 do i=0,nt-1 if (start_time_step .GE. t_all(i)-delta_t/2 .AND. start_time_step .LT. t_all(i)+delta_t/2)then st=i break end if end do ; **************************************************** ; end of time step and different types of mistakes that could be done ; **************************************************** if ( .not. isvar("end_time_step") ) then end_time_step = t_all(nt-1)/3600 if (parameter(15) .NE. "t(end)") then if (stringtodouble(parameter(15)) .GT. t_all(nt-1)/3600)then print(" ") print("'end_time_step' = "+ parameter(15) +"h is greater than last time step = " + t_all(nt-1)+"s = "+t_all(nt-1)/3600+"h") print(" ") print("Please select another 'end_time_step'") print(" ") exit end if if (stringtodouble(parameter(15)) .LT. start_time_step/3600)then print(" ") print("'end_time_step' = "+ parameter(15) +"h is lower than 'start_time_step' = "+start_time_step/3600+"h") print(" ") print("Please select another 'start_time_step' or 'end_time_step'") print(" ") exit end if end_time_step = stringtodouble(parameter(15)) end if else if (end_time_step .GT. t_all(nt-1)/3600)then print(" ") print("'end_time_step' = "+ end_time_step +"h is greater than last time step = " + t_all(nt-1)+"s = "+t_all(nt-1)/3600+"h") print(" ") print("Please select another 'end_time_step'") print(" ") exit end if if (end_time_step .LT. start_time_step/3600)then print(" ") print("'end_time_step' = "+ end_time_step +"h is lower than 'start_time_step' = "+start_time_step+"h") print(" ") print("Please select another 'start_time_step' or 'end_time_step'") print(" ") exit end if end if end_time_step = end_time_step*3600 do i=0,nt-1 if (end_time_step .GE. t_all(i)-delta_t/2 .AND. end_time_step .LT. t_all(i)+delta_t/2)then et=i break end if end do delete(start_time_step) start_time_step=round(st,3) delete(end_time_step) end_time_step=round(et,3) print(" ") print("Output of time steps from "+t_all(start_time_step)/3600+" h = "+t_all(start_time_step)+" s => index = "+start_time_step) print(" till "+t_all(end_time_step)/3600+" h = "+t_all(end_time_step)+" s => index = "+end_time_step) print(" ") dimt = end_time_step-start_time_step+1 ; *************************************************** ; set up recourses ; *************************************************** res = True res@gsnDraw = False res@gsnFrame = False res@gsnPaperOrientation = "portrait" res@gsnPaperWidth = 8.27 res@gsnPaperHeight = 11.69 res@gsnPaperMargin = 0.79 res@txFont = "helvetica" res@tiMainFont = "helvetica" res@tiXAxisFont = "helvetica" res@tiYAxisFont = "helvetica" res@tmXBLabelFont = "helvetica" res@tmYLLabelFont = "helvetica" res@lgLabelFont = "helvetica" res@tmLabelAutoStride = True res@pmLegendDisplayMode = "Always" res@pmLegendSide = "Top" res@pmLegendParallelPosF = 1.15 res@pmLegendOrthogonalPosF = -1.0 res@pmLegendWidthF = 0.12 if (sort .EQ. "time")then res@pmLegendHeightF = 0.04*(end_time_step-start_time_step+1) else res@pmLegendHeightF = 0.04*dimz end if res@lgLabelFontHeightF = .02 res@lgTitleFontHeightF = .02 res@txFontHeightF = 0.02 res@tiXAxisFontHeightF = 0.02 res@tiYAxisFontHeightF = 0.02 if (logy .EQ. 1) then res@trXLog = True res@trYLog = True else res@trXLog = False res@trYLog = False end if legend_label=new(dimt,double) legend_label_zu=new(dimz,double) legend_label_zw=new(dimz,double) legend_label_z=new(dimz,double) do p=start_time_step,end_time_step if (t_all(p)/3600 .LT. 1) then legend_label(p-start_time_step)=decimalPlaces(t_all(p)/3600,2,True) else legend_label(p-start_time_step)=decimalPlaces(t_all(p)/3600,0,True) end if end do if (sort .EQ. "time") plot = new(dim*dimz,graphic) np=dimt res@lgTitleString = "Time [h]" else plot = new(dim*dimt,graphic) np=dimz res@lgTitleString = "Height [m]" do p=0,dimz-1 legend_label_zu(p)=round(zu(p),3) legend_label_zw(p)=round(zw(p),3) end do end if if ( black .eq. 0 ) then res@xyLineColors = ispan(2,237,235/np) end if if ( dash .eq. 0 ) then res@xyMonoDashPattern = True end if wks=gsn_open_wks(format_out,file_out) gsn_define_colormap(wks,"rainbow+white") n=0 do varn =dim-1,0,1 check = True if ( isStrSubset( vNam(varn), "time") .OR. isStrSubset( vNam(varn), "zu_sp") .OR. isStrSubset( vNam(varn), "zw_sp") .OR. isStrSubset( vNam(varn), "k_x") .OR. isStrSubset( vNam(varn), "k_y")) then check = False end if if (.not. isvar("var")) then if (parameter(21) .NE. "variables") then var=parameter(21) check = isStrSubset( var,","+vNam(varn)+"," ) end if else check = isStrSubset( var,","+vNam(varn)+"," ) end if if(check) then temp = f->$vNam(varn)$(start_time_step:end_time_step,0:dimz-1,:) temp=temp/norm ;SMOOTHING: #temp=smth9(temp/norm, 0.50, -0.25, False)# a=getvardims(temp) b=dimsizes(a) do i=0,b-1 if (isStrSubset( a(i),"zu_sp" ))then legend_label_z=legend_label_zu else if (isStrSubset( a(i),"zw_sp" ))then legend_label_z=legend_label_zw end if end if end do if (isStrSubset(vNam(varn),"x"))then x_axis = f->k_x res@tiXAxisString = "k_x" else x_axis = f->k_y res@tiXAxisString = "k_y" end if if (sort .EQ. "time") do p=dimz-1,0,1 do q=0,dimt-1 do r=0,dimsizes(x_axis)-1 if (temp(q,p,r) .EQ. 0)then st=p+start_time_step print(" ") print("'"+vNam(varn)+"("+st+","+q+","+r+")' is equal 0; Logarithmic scale for y-axis cannot be used") print(" ") res@trYLog = False end if end do end do res@trXMinF = min(x_axis) res@trXMaxF = max(x_axis) res@gsnLeftString = vNam(varn) res@gsnRightString = "Height = "+z(p)+"m" if (norm .NE. 1)then res@tiYAxisString = vNam(varn)+" / "+norm else res@tiYAxisString = vNam(varn) end if res@xyExplicitLegendLabels = legend_label plot(n) = gsn_csm_xy(wks,x_axis,temp(:,p,:),res) n=n+1 end do else if (sort .EQ. "layer") do p=dimt-1,0,1 do q=0,dimz-1 do r=0,dimsizes(x_axis)-1 if (temp(p,q,r) .EQ. 0)then st=p+start_time_step print(" ") print("'"+vNam(varn)+"("+st+","+q+","+r+")' is equal 0; Logarithmic scale for y-axis cannot be used") print(" ") res@trYLog = False end if end do end do res@trXMinF = min(x_axis) res@trXMaxF = max(x_axis) res@gsnLeftString = vNam(varn) res@gsnRightString = "Time = "+legend_label(p)+"h" if (norm .NE. 1)then res@tiYAxisString = vNam(varn)+" / "+norm else res@tiYAxisString = vNam(varn) end if res@xyExplicitLegendLabels = legend_label_z plot(n) = gsn_csm_xy(wks,x_axis,temp(p,:,:),res) n=n+1 end do else print(" ") print("Please choose 'sort' either equal 'time' or 'height'") print(" ") exit end if end if delete(temp) delete(x_axis) end if end do if (n .EQ. 0) then print(" ") print("The variables 'var=°"+var+"°' do not exist on your input file") print(" ") exit end if ; *************************************************** ; merge plots onto one page ; *************************************************** resP = True resP@txFont = "helvetica" resP@txString = f@title resP@txFuncCode = "~" resP@txFontHeightF = 0.014 if (format_out .EQ. "eps" .OR. format_out .EQ. "epsi") then gsn_panel(wks,plot,(/n,1/),resP) else do i = 0,n-1, no_lines*no_columns if( (i+no_lines*no_columns) .gt. (n-1)) then gsn_panel(wks,plot(i:n-1),(/no_lines,no_columns/),resP) else gsn_panel(wks,plot(i:i+no_lines*no_columns-1),(/no_lines,no_columns/),resP) end if end do end if print(" ") print("Output to: " + file_out +"."+ format_out) print(" ") end