func pldifmap(tr_a, tr_b, flev=, fint=, dlev=, dint=, subtitle=, nofill=, diff_name=,percent=,xylimits=) { if (is_void(percent)) percent =0; name = tr_a.name; dat = long(*tr_a.date); yrs = int((dat/10000)); yrf=yrs(1); yrl=yrs(0); if (dat(0)%10000 == 101) yrl=yrl-1; yr_a = [yrf,yrl]; dat = long(*tr_b.date); yrs = int((dat/10000)); yrf=yrs(1); yrl=yrs(0); if (dat(0)%10000 == 101) yrl=yrl-1; yr_b = [yrf,yrl]; tr_d = ndif(tr_a,tr_b); // compute % dif if (percent) { tr_d = nop(tr_d,tr_b,"/"); tr_d = nop(tr_d,100.,"*",units="%"); } if (is_void(diff_name)) { tr_d.long_name = tr_a.long_name + " difference"; } else { tr_d.long_name = diff_name } /* check input variables */ if (is_void(subtitle)) subtitle = " "; print, name, subtitle; /* set contour list for difference */ dmin = nmin(tr_d); dmax = nmax(tr_d); if(dmin == dmax) {print, "fields identical"; return;} dlev = setcont(dmin,dmax,dlev,dint,dcenter); /* set contour list for fields */ fmin = min(nmin(tr_a),nmin(tr_b)); fmax = max(nmax(tr_a),nmax(tr_b)); if(fmin == fmax) {print, "uniform field, value=", fmin; return;} flev = setcont(fmin,fmax,flev,fint,fcenter); /* plot orginal fields and difference on 3 panels */ /* set palettes and color indexes */ window,1; fma; pln3_init; dcol = plnpal(dlev); fcol = plnpal(flev,extend=1,white=0); plt,tr_a.case + ": " + tr_a.title,.01,0.015,height=10,justify="LA"; plt,tr_b.case + ": " + tr_b.title,.01,0.005,height=10,justify="LA"; svp,1; gridxy,base60=3; limits; if (!is_void(xylimits)) limits,xylimits(1),xylimits(2),xylimits(3),xylimits(4); lab = tr_a.long_name + " (" + tr_a.units + ")\n" + subtitle; plt,lab,vport(avg:1:2),vport(4)+.02,height=18,justify="CA"; pln,tr_a,levs=flev,colors=fcol,nlab=[1,2],width=[2,1],nocornlab=1, noname=1,nofill=nofill,neg="dash",opaque=opaque,outline=ccmlnd; if(is_void(ccmlnd)) plm,lywo,lxwo,lmask,boundary=1,width=4; lab = tr_a.case + ", yrs [" + pr1(yr_a(1)) + ", " + pr1(yr_a(0)) + "]"; plt,lab,vport(1)-.04,vport(avg:3:4),height=18,justify="CA",orient=1; svp,2; gridxy,base60=3; limits; if (!is_void(xylimits)) limits,xylimits(1),xylimits(2),xylimits(3),xylimits(4); pln,tr_b,levs=flev,colors=fcol,nlab=[1,2],width=[2,1],nocornlab=1, noname=1,nofill=nofill,neg="dash",opaque=opaque,outline=ccmlnd; if(is_void(ccmlnd)) plm,lywo,lxwo,lmask,boundary=1,width=4; lab = tr_b.case + ", yrs [" + pr1(yr_b(1)) + ", " + pr1(yr_b(0)) + "]"; plt,lab,vport(1)-.04,vport(avg:3:4),height=18,justify="CA",orient=1; svp,3; gridxy,base60=3; limits; if (!is_void(xylimits)) limits,xylimits(1),xylimits(2),xylimits(3),xylimits(4); pln,tr_d,levs=dlev,colors=dcol,nlab=[1,2],width=[2,1],nocornlab=1, noname=1,nofill=nofill,neg="dash",opaque=opaque,outline=ccmlnd; if(is_void(ccmlnd)) plm,lywo,lxwo,lmask,boundary=1,width=4; lab = tr_a.case + " - " + tr_b.case; plt,lab,vport(1)-.04,vport(avg:3:4),height=18,justify="CA",orient=1; if (psout) fma; /* plot difference map */ window,2; fma; pln_init_map; limits; if (!is_void(xylimits)) limits,xylimits(1),xylimits(2),xylimits(3),xylimits(4); dcol = plnpal(dlev); plt,tr_a.case + ": " + tr_a.title,.01,0.015,height=10,justify="LA"; plt,tr_b.case + ": " + tr_b.title,.01,0.005,height=10,justify="LA"; svp,1; gridxy,base60=3; lab = tr_d.long_name + " (" + tr_d.units + ")\n" + subtitle; plt,lab,vport(avg:1:2),vport(4)+.05,height=24,justify="CA"; lab = tr_a.case + ", yrs [" + pr1(yr_a(1)) + ", " + pr1(yr_a(0)) + "] - " + tr_b.case + ", yrs [" + pr1(yr_b(1)) + ", " + pr1(yr_b(0)) + "]"; plt,lab, vport(1),vport(4)+.015,height=18; pln,tr_d,levs=dlev,colors=dcol,nlab=[1,2],width=[2,1],nocornlab=1, noname=1,nofill=nofill,neg="dash",opaque=opaque,outline=ccmlnd; if(is_void(ccmlnd)) plm,lywo,lxwo,lmask,boundary=1,width=4; if (psout) fma; /* plot the zonal means */ window,3; za = (*tr_a.data)(avg,,1,avg); za_g = sum(za * (*tr_a.yw)); zb = (*tr_b.data)(avg,,1,avg); zb_g = sum(zb * (*tr_b.yw)); zd = (*tr_d.data)(avg,,1,avg); zd_g = sum(zd * (*tr_d.yw)); y = *tr_a.y; fma; read_style, "boxed.gs", landscape, systems, legends, clegends; systems=systems(-:1:2); systems(1:).ticks.horiz.nMajor=10; systems(1:).ticks.horiz.nMinor=100; systems(1:).ticks.vert.nMajor=10; systems(1:).ticks.vert.nMinor=100; systems(1).viewport = [.1,.72,.53,.90]; systems(2).viewport = [.1,.72,.09,.46]; set_style, 0, systems, legends, clegends; plt,tr_a.case + ": " + tr_a.title,.01,0.015,height=10,justify="LA"; plt,tr_b.case + ": " + tr_b.title,.01,0.005,height=10,justify="LA"; svp,1; gridxy,2,2,base60=1; limits,-90.,90.; lab = tr_a.long_name + " (" + tr_a.units + ")\n" + subtitle; plt,lab,vport(avg:1:2),vport(4)+.04,height=18,justify="CA"; plt,tr_a.case + " (" + pr1(za_g) + ")", vport(1),vport(4)+.015,height=18,justify="LA",color="red"; plt,tr_b.case + " (" + pr1(zb_g) + ")", vport(2),vport(4)+.015,height=18,justify="RA",color="blue"; plg,za,y,marks=0,width=3,color="red"; plg,zb,y,marks=0,width=3,color="blue"; svp,2; gridxy,2,2,base60=1; limits,-90.,90.; plt,"difference" + " (" + pr1(zd_g) + ")",vport(1),vport(4)+.015,height=18,justify="LA"; lab = tr_a.case + " - " + tr_b.case; plt,lab,vport(2),vport(4)+.015,height=18,justify="RA"; plg,zd,y,marks=0,width=3; plt,"latitude",vport(avg:1:2),vport(3)-.03,height=18,justify="CT"; if (psout) fma; } func pldzon (f1l,f2l,fdl,f1r,f2r,fdr, ltitle=, rtitle=, flev=, fint=, dlev= , dint=, zlinear=) { fma; pln6_init_nocbar; for (i=1;i<=6;i++) { svp,i; gridxy,base60=1; if (is_void(yzlimits)) { limits,-90,90; if (is_void(zlinear) || (zlinear == 0)) { range,"e","e"; } else { range,1000,50; } } else { limits,yzlimits(1),yzlimits(2),yzlimits(3),yzlimits(4); } } if (is_void(ltitle)) ltitle="DJF"; if (is_void(rtitle)) rtitle="JJA"; lab1 = f1l.case + ", yrs " + yrlab1; lab2 = f2l.case + ", yrs " + yrlab2; labd = fdl.case; /* set contour list for differences */ dmin = min(nmin(fdl),nmin(fdr)); dmax = max(nmax(fdl),nmax(fdr)); if(dmin == dmax) { print, "fields identical"; dlev = []; } else { dlev = setcont(dmin,dmax,dlev,dint,dcenter); } /* set contour list for fields */ fmin = min(nmin(f1l),nmin(f1r),nmin(f2l),nmin(f2r)); fmax = max(nmax(f1l),nmax(f1r),nmax(f2l),nmax(f2r)); if(fmin == fmax) {print, "uniform field, value=", fmin; return;} flev = setcont(fmin,fmax,flev,fint,fcenter); /* set palette */ colf = plnpal(flev,white=0); if (!is_void(dlev)) cold = plnpal(dlev,extend=1); plt,f1l.case + ": " + f1l.title,.01,.999,height=10,justify="LT"; plt,f2l.case + ": " + f2l.title,.01,.989,height=10,justify="LT"; plt,f1l.name + ": " + f1l.long_name + " (" + f1l.units + ")", .415,.94,height=24,justify="CA"; svp,1; port=viewport(); plt,ltitle, port(avg:1:2), port(4)+.01, height=18, justify="CA"; pln,f1l,nocbar=1,zlinear=zlinear,levs=flev,neg="dash",nlab=[1,2],width=[2,1],nocornlab=1, noname=1,colors=colf,nofill=nofill,opaque=opaque; plt,lab1, port(1)-.05, port(avg:3:4), height=18, justify="CA",orient=1; svp,2; port=viewport(); pln,f2l,nocbar=1,zlinear=zlinear,levs=flev,neg="dash",nlab=[1,2],width=[2,1],nocornlab=1, noname=1,colors=colf,nofill=nofill,opaque=opaque; plt,lab2, port(1)-.05, port(avg:3:4), height=18, justify="CA",orient=1; svp,3; port=viewport(); if (!is_void(dlev)) { pln,fdl,nocbar=1,zlinear=zlinear,levs=dlev,neg="dash",nlab=[1,2],width=[2,1],nocornlab=1, noname=1,colors=cold,nofill=nofill,opaque=opaque; } else { plt, "fields identical", port(avg:1:2), port(avg:3:4), height=18, justify="CA"; } plt,labd, port(1)-.05, port(avg:3:4), height=18, justify="CA",orient=1; svp,4; port=viewport(); plt,rtitle, port(avg:1:2), port(4)+.01, height=18, justify="CA"; pln,f1r,nocbar=1,zlinear=zlinear,levs=flev,neg="dash",nlab=[1,2],width=[2,1],nocornlab=1, noname=1,colors=colf,nofill=nofill,opaque=opaque; svp,5; port=viewport(); pln,f2r,nocbar=1,zlinear=zlinear,levs=flev,neg="dash",nlab=[1,2],width=[2,1],nocornlab=1, noname=1,colors=colf,nofill=nofill,opaque=opaque; svp,6; port=viewport(); if (!is_void(dlev)) { pln,fdr,nocbar=1,zlinear=zlinear,levs=dlev,neg="dash",nlab=[1,2],width=[2,1],nocornlab=1, noname=1,colors=cold,nofill=nofill,opaque=opaque; } else { plt, "fields identical", port(avg:1:2), port(avg:3:4), height=18, justify="CA"; } } func plzon1 (fld, stitle=, flev=, fint=, zlinear=, caselabel=) { fma; pln_init_map; gridxy,base60=1; if (is_void(yzlimits)) { limits,-90,90; if (is_void(zlinear) || (zlinear == 0)) { range,"e","e"; } else { range,1000,50; } } else { limits,yzlimits(1),yzlimits(2),yzlimits(3),yzlimits(4); } if (is_void(stitle)) stitle="annual mean"; /* set contour list for differences */ fmin = nmin(fld); fmax = nmax(fld); if(fmin == fmax) { print, "fields identical"; flev = []; } else { flev = setcont(fmin,fmax,flev,fint,fcenter); } /* set palette */ if (!is_void(flev)) colf = plnpal(flev); if (is_void(caselabel)) caselabel = fld.case; svp,1; port=viewport(); if (!is_void(flev)) { pln,fld,zlinear=zlinear,levs=flev,neg="dash",width=[3,1],nlab=2,nocornlab=1, colors=colf,nofill=nofill,opaque=opaque; } else { plt, "fields identical \n"+ fld.name+"=0", port(avg:1:2), port(avg:3:4), height=18, justify="CA"; } plt,caselabel,vport(avg:1:2),vport(4)+.05,justify="CA",height=18; if (!is_void(stitle)) plt,stitle,vport(1),vport(4)+.02,justify="LA",height=14; if (!is_void(v1)) plt,v1(0).case + ": " + v1(0).title,.01,0.015,height=10,justify="LA"; if (!is_void(v2)) plt,v2(0).case + ": " + v2(0).title,.01,0.005,height=10,justify="LA"; } func plzon4 (f1l,f2l,f1r,f2r, ltitle1=, ltitle2=, rtitle1=, rtitle2=, flev=, fint=, zlinear=, caselabel=, mxmn=) { fma; pln4_init; for (i=1;i<=4;i++) { svp,i; gridxy,base60=1; if (is_void(yzlimits)) { limits,-90,90; if (is_void(zlinear) || (zlinear == 0)) { range,"e","e"; } else { range,1000,50; } } else { limits,yzlimits(1),yzlimits(2),yzlimits(3),yzlimits(4); } } if (is_void(ltitle1)) ltitle1="DJF"; if (is_void(ltitle2)) ltitle2="MAM"; if (is_void(rtitle1)) rtitle1="JJA"; if (is_void(rtitle2)) rtitle2="SON"; if (is_void(caselabel)) caselabel = f1l.case; /* set contour list for fields */ fmin = min(nmin(f1l),nmin(f1r),nmin(f2l),nmin(f2r)); fmax = max(nmax(f1l),nmax(f1r),nmax(f2l),nmax(f2r)); if(fmin == fmax) { print, "uniform field, value=", fmin; flev = []; } else { flev = setcont(fmin,fmax,flev,fint,fcenter); } /* set palette */ if (!is_void(flev)) colf = plnpal(flev); plt,caselabel,.47,.71,height=18,justify="CA"; lab = f1l.long_name + " (" + f1l.units + ")"; plt,lab,.47,.740,height=24,justify="CA"; if (is_void(flev)) { plt, "uniform fields, value=" +pr1(fmin), .5, .35, height=18, justify="CA"; return; } svp,1; port=viewport(); pln,f1l,nocbar=1,zlinear=zlinear,levs=flev,neg="dash",nlab=[1,2],width=[2,1],nocornlab=1, noname=1,colors=colf,nofill=nofill,opaque=opaque,mxmn=mxmn; plt,ltitle1, port(1)-.05, port(avg:3:4), height=18, justify="CA",orient=1; svp,2; port=viewport(); pln,f2l,nocbar=1,zlinear=zlinear,levs=flev,neg="dash",nlab=[1,2],width=[2,1],nocornlab=1, noname=1,colors=colf,nofill=nofill,opaque=opaque,mxmn=mxmn; plt,ltitle2, port(1)-.05, port(avg:3:4), height=18, justify="CA",orient=1; svp,3; port=viewport(); pln,f1r,nocbar=0,zlinear=zlinear,levs=flev,neg="dash",nlab=[1,2],width=[2,1],nocornlab=1, noname=1,colors=colf,nofill=nofill,opaque=opaque,mxmn=mxmn; plt,rtitle1, port(1)-.05, port(avg:3:4), height=18, justify="CA",orient=1; svp,4; port=viewport(); pln,f2r,nocbar=0,zlinear=zlinear,levs=flev,neg="dash",nlab=[1,2],width=[2,1],nocornlab=1, noname=1,colors=colf,nofill=nofill,opaque=opaque,mxmn=mxmn; plt,rtitle2, port(1)-.05, port(avg:3:4), height=18, justify="CA",orient=1; if (!is_void(v1)) plt,v1(0).case + ": " + v1(0).title,.01,0.015,height=10,justify="LA"; if (!is_void(v2)) plt,v2(0).case + ": " + v2(0).title,.01,0.005,height=10,justify="LA"; } func setcont(fmin,fmax,flev,fint,&fcenter) { if (is_void(flev)) { if (is_void(fint)) { // fint = (fmax - fmin) / 10; nlevs = 10; okints = [0.1, 0.2, 0.5,1,2,5,10,20]; // acceptable contour intervals zinc = (fmax-fmin)/nlevs; pow = int(log10(zinc)); cints = okints*(10.^pow); nlevsout = (fmax-fmin)/cints; nlevbest = abs(nlevsout-nlevs)(mnx); fint = cints(nlevbest); } cmin = int(fmin/fint)*fint; if (fmin > 0) cmin = cmin+fint; cmax = int(fmax/fint)*fint; nlev = int((cmax - cmin) / fint + .499999) + 1; if (nlev <= 1 || nlev >= 70) { print, "inappropriate contour interval"; print,fmin,fmax,fint,cmin,cmax,nlev; nlev = 10; cmin = fmin; cmax = fmax; } flev = span(cmin,cmax,nlev); list = where(abs(flev/fint) < 0.000001); if(numberof(list)==1)flev(list) = 0.; } fcenter = []; // if (allof(flev(1:2) < 0) && allof(flev(-1:0) > 0)) fcenter=0.; if ((flev(1) < 0) && (flev(0) > 0)) fcenter=0.; return flev; }