! jnl file that uses Argo data to make geostrophic velocity section plots ! requires input arguments for the time range, dynamic height levels and lat/lon range ! to run the program in ferret, you will need to type the following line with the various values filled in: ! go fer_geo_vel_section section_direction ylo yhi time_start time_end depth_min depth_max xlo xhi depth_axis con_lev ! If you choose not to give values for the various variables, default ones will be substituted for you. ! If you only want to choose some values, you can, but you cannot skip any values. This means you can ! fill in the first 2 and no others, or if you want to specify the lat/lon ranges, you must fill in values ! for the first 4 variables as well as the lat/lon ranges. ! section direction can be "N" for N-S or "E" for E-W ! xlo corresponds to the lowest latitude limit ! xhi corresponds to the highest latitude limit ! ylo corresponds to the lowest longitude limit ! yhi corresponds to the highest longitude limit ! depth values are entered in the range of 0 - 2000dbar with the default being 0 - 1000dbar ! time values are entered corresponding to monthly values starting with Jan, 2004 ! con_lev sets the contour and fill levels of the plot. This is done in the following format: (lo,hi,delta). ! More than one can be chosen: (lo,mid,delta1),(mid,hi,delta2). See the Ferret Users Manual for more information. cancel/all data cancel/all var cancel/all sym set mem/size=200 set window/clear go set_pixel_size 1024 768 define viewport/xlim=.0,.95/ylim=0,1 top PPL DFLTFNT DR ppl conpre @P1@DR ppl axlsze 0.15,.15 ppl axset 1,1,1,1 ppl pen 0,7 ppl pen 1,7 ppl labset .15,.15,.15 ! load in first file use RG_ArgoClim_Temp_2014.nc let t1=ARGO_TEMPERATURE_MEAN[d=1]+ARGO_TEMPERATURE_ANOMALY[d=1] ! now set up grid for entire time range define axis/x=20.5E:19.5E:1/unit=degree xlong define axis/y=64.5S:79.5N:1/unit=degree ylat define axis/t="16-Jan-2004":"16-Dec-2023":1/units=months tclim let dyn_p=z[d=1,g=`t1, return=grid`] define grid/x=xlong/y=ylat/z=dyn_p/t=tclim RG_grid ! now load in second temp file use RG_ArgoClim_Temp_2024.nc let t2=ARGO_TEMPERATURE_MEAN[d=2]+ARGO_TEMPERATURE_ANOMALY[d=2] ! now try to put all data onto same grid let t_b1 = t1[gt=RG_grid@asn] let t_b2 = t2[gt=RG_grid@nrst] ! load in first salinity file use RG_ArgoClim_Psal_2014.nc let s1=ARGO_SALINITY_MEAN[d=3]+ARGO_SALINITY_ANOMALY[d=3] ! now load in second psal file use RG_ArgoClim_Psal_2024.nc let s2=ARGO_SALINITY_MEAN[d=4]+ARGO_SALINITY_ANOMALY[d=4] ! now try to put all data onto same grid let s_b1 = s1[gt=RG_grid@asn] let s_b2 = s2[gt=RG_grid@nrst] ! mask out the current data let mskt1 = if t_b1 then 1 else 0 ! define new full time scale data let temp = if mskt1 eq 1 then t_b1 else t_b2 let psal = if mskt1 eq 1 then s_b1 else s_b2 let pres=z[d=1,g=`t1, return=grid`] let depth_min=`$6%0%` let depth_max=`$7%500%` let time_start=`$4%25%` let time_end=`$5%26%` ! setting the default values let xlo=`$8%165%` let xhi=`$9%170%` let ylo=`$2%-50%` let yhi=`$3%10%` let depth_axis=`$10%0%` set mode interpolate ! checking on depth max. If using meters, depth max is no longer 2000 let max_dep=if `depth_max` eq 2000 then 1 else 0 ! begin mapping process if `depth_axis` then ! you want meters instead of db as the depth axis unit ! first need to change to depth from pressure let xo=sin(y[g=`s1, return=grid`]*3.1415926/180) let xxo=xo*xo let bot_line=9.780318*(1.0+(5.2788*10^-3+2.36*10^-5*xxo)*xxo) + 1.092*10^-6*pres let top_line=(((-1.82*10^-15*pres+2.279*10^-10)*pres-2.2512*10^-5)*pres+9.72659)*pres let dep=top_line/bot_line ! then regrid onto original pressure grid spacing let dyn_s=zaxreplace(psal,dep,z[gz=`pres, return=grid`]) ! second need to change to depth from pressure let xo=sin(y[g=`t1, return=grid`]*3.1415926/180) let xxo=xo*xo let bot_line=9.780318*(1.0+(5.2788*10^-3+2.36*10^-5*xxo)*xxo) + 1.092*10^-6*pres let top_line=(((-1.82*10^-15*pres+2.279*10^-10)*pres-2.2512*10^-5)*pres+9.72659)*pres let dep=top_line/bot_line ! then regrid onto original pressure grid spacing let dyn_t=zaxreplace(temp,dep,z[gz=`pres, return=grid`]) let dyn_p=pres if `max_dep` then let depth_max=1900 elseif ! you want db instead of m as the depth axis unit ! calculate dynamic height let dyn_s=psal let dyn_t=temp let dyn_p=z[d=1,g=`t1, return=grid`] endif ! setting depth region set region/z=`depth_min`:`depth_max` let dens=rho_un(dyn_s,dyn_t,dyn_p) let potemp=THETA_FO(dyn_s,dyn_t,dyn_p,0) let podens=rho_un(dyn_s,potemp,0.)-1000 go dynamic_height ! begin mapping process ! don't want to plot geostrophic velocity within 5 degrees of equator let msk=if y[g=`dyn_t,return=grid`] lt 5 and y[g=`dyn_t,return=grid`] gt (-5) then 0 else 1 ! geostrophic velocity can only be plotted if the depths are different. ! depth is the same let a=if `depth_min` eq `depth_max` then 1 else 0 if `a` then say "depth is the same - cannot graph velocity" let b=if `time_start` eq `time_end` then 1 else 0 let c=if (`xlo`) ne (`xhi`) then 1 else 0 let d=if (`ylo`) ne (`yhi`) then 1 else 0 let e=if `time_start` ne `time_end` then 1 else 0 let boundb=if (`xlo`) gt (`xhi`) then 1 else 0 ! must start with bathymetry in order to plot velocity over ! now can start plotting velocity vectors over if `b` then let vel_u=if msk[d=1] eq 1 then geo_uz let vel_v=if msk[d=1] eq 1 then geo_vz if ($1%TRUE|N>TRUE|E>FALSE|>TRUE%) then !checking whether it is a N-S or E-W section & assigning N-S as default if `c` then ! plotting let geo_vel=vel_u[y=`ylo`:`yhi`,x=`xlo`:`xhi`@ave,l=`time_start`,z=`depth_min`:`depth_max`] let anom_max=geo_vel[y=@max,z=@max] let anom_min=geo_vel[z=@min,y=@min] else ! no averaging over x ! plotting let geo_vel= vel_u[y=`ylo`:`yhi`,x=`xlo`,l=`time_start`,z=`depth_min`:`depth_max`] let anom_max=geo_vel[y=@max,z=@max] let anom_min=geo_vel[z=@min,y=@min] endif ! c loop else ! E-W section ! Ensuring longitudes are properly plotted if `boundb` then let xhi=`xhi`+360 endif if `d` then ! plotting let geo_vel=vel_v[y=`ylo`:`yhi`@ave,x=`xlo`:`xhi`,l=`time_start`,z=`depth_min`:`depth_max`] let anom_max=geo_vel[x=@max,z=@max] let anom_min=geo_vel[z=@min,x=@min] else ! no averaging over y ! plotting let geo_vel= vel_v[x=`xlo`:`xhi`,y=`ylo`,l=`time_start`,z=`depth_min`:`depth_max`] let anom_max=geo_vel[x=@max,z=@max] let anom_min=geo_vel[z=@min,x=@min] endif ! d loop endif !n-s endif !b ! time is different if `e` then let vel_u=if msk[d=1] eq 1 then geo_uz let vel_v=if msk[d=1] eq 1 then geo_vz if ($1%TRUE|N>TRUE|E>FALSE|>TRUE%) then !checking whether it is a N-S or E-W section & assigning N-S as default if `c` then ! plotting let geo_vel= vel_u[y=`ylo`:`yhi`,x=`xlo`:`xhi`@ave,l=`time_start`:`time_end`@ave,z=`depth_min`:`depth_max`] let anom_max=geo_vel[y=@max,z=@max] let anom_min=geo_vel[z=@min,y=@min] else ! no averaging over x ! plotting let geo_vel=vel_u[y=`ylo`:`yhi`,x=`xlo`,l=`time_start`:`time_end`@ave,z=`depth_min`:`depth_max`] let anom_max=geo_vel[y=@max,z=@max] let anom_min=geo_vel[z=@min,y=@min] endif ! c loop else ! E-W section ! Ensuring longitudes are properly plotted if `boundb` then let xhi=`xhi`+360 endif if `d` then ! plotting let geo_vel= vel_v[x=`xlo`:`xhi`,y=`ylo`:`yhi`@ave,l=`time_start`:`time_end`@ave,z=`depth_min`:`depth_max`] let anom_max=geo_vel[x=@max,z=@max] let anom_min=geo_vel[z=@min,x=@min] else ! no averaging over y ! plotting say 'here' let geo_vel=vel_v[x=`xlo`:`xhi`,y=`ylo`,l=`time_start`:`time_end`@ave,z=`depth_min`:`depth_max`] let anom_max=geo_vel[x=@max,z=@max] let anom_min=geo_vel[z=@min,x=@min] endif ! d loop endif !n-s endif !e ! creating an equal, centered key let abs_max=ABS(`anom_max`) let abs_min=ABS(`anom_min`) ! case where anom_max is bigger than anom_min let maxz=if `abs_max` gt `abs_min` and `abs_max` lt 1 then 1 else 0 if `maxz` then let lev_max = (int(10*abs_max)+1)/10 let lev_min = (int(-10*abs_max)-1)/10 endif let maxnz=if `abs_max` gt `abs_min` and `abs_max` gt 1 then 1 else 0 if `maxnz` then let lev_max=int(anom_max)+1 let lev_min=int((-1*anom_max))-1 endif let anom_diff=lev_max-lev_min let anom_delta=anom_diff/8 ! case where anom_min is bigger than anom_max let minz=if `abs_min` gt `abs_max` and `abs_min` lt 1 then 1 else 0 if `minz` then let lev_max = (int(10*abs_min)+1)/10 let lev_min = (int(10*anom_min)-1)/10 endif let minnz=if `abs_min` gt `abs_max` and `abs_min` gt 1 then 1 else 0 if `minnz` then let lev_max=int(abs_min)+1 let lev_min=int(anom_min)-1 endif let anom_diff=lev_max-lev_min let anom_delta=anom_diff/8 let con_lev= $11&"(`lev_min`,`lev_max`,`anom_delta`)"|*>"*"& ! plotting fill/set/nolab/pal=centered/lev="`con_lev`" geo_vel ppl shakey 1,,.08,,5,,,,,, if `depth_axis` then ppl ylab Depth (meters) elseif ppl ylab Pressure (dbar) endif ppl fill ! adding contours con/set_up/over/nolab/lev="`con_lev`" geo_vel ppl conset .08,,,,,,,5.7,1.,1 ppl contour/overlay ! adding in etopo6 to give bathymetry use etopo6_grid.nc if ($1%TRUE|N>TRUE|E>FALSE|>TRUE%) then ! N-S section ! making a mask to put in bathymetry only where there is land if `c` then let mskb if btdata*(-1) lt dyn_p then 1 shad/nolab/nokey/over/pal=black mskb[x=`xlo`,y=`ylo`:`yhi`,z=`depth_min`:`depth_max`] repeat/x=`xlo`:`xhi` shad/nolab/over/nokey/pal=black mskb[y=`ylo`:`yhi`,z=`depth_min`:`depth_max`] else let mskb if btdata*(-1) lt dyn_p then 1 shad/nolab/nokey/over/pal=black mskb[x=`xlo`,y=`ylo`:`yhi`,z=`depth_min`:`depth_max`] endif else ! E-W section ! making a mask to put in bathymetry only where there is land if `d` then let mskb if btdata*(-1) lt dyn_p then 1 shad/nolab/nokey/over/pal=black mskb[x=`xlo`:`xhi`,y=`ylo`,z=`depth_min`:`depth_max`] repeat/y=`ylo`:`yhi` shad/nolab/nokey/over/pal=black mskb[x=`xlo`:`xhi`,z=`depth_min`:`depth_max`] else let mskb if btdata*(-1) lt dyn_p then 1 shad/nolab/nokey/over/pal=black mskb[y=`ylo`,x=`xlo`:`xhi`,z=`depth_min`:`depth_max`] endif endif ! ns loop say Plot is finished say To adjust parameters, use the command line to pass arguments say For this file, the form to pass arguments is say go fer_geo_vel_section section_direction ylo yhi time_start time_end depth_min depth_max xlo xhi depth_axis con_lev