%======================================================================
% L O A D S A D C P . M
% doc: Sun Jun 27 23:42:04 2004
% dlm: Tue May 22 11:01:21 2012
% (c) 2004 ladcp@
% uE-Info: 109 4 NIL 0 0 72 0 2 8 NIL ofnI
%======================================================================
% CHANGES BY ANT:
% Jun 30, 2004: - added Figure 9 title
% Jul 9, 2004: - made lack of SADCP data in time window into real warning
% Jan 7, 2009: - tightened use of exist()
% Mar 4, 2010: - changed default of p.sadcp_dtok from 5min to zero
% May 22, 2012: - removed code that took GPS information from SADCP data,
% because these data are unlikely to be accurate enough
% for the ship-drift constraint; if they are, the user
% should verify and make a GPS file during pre-processing
function [di,p]=loadsadcp(f,di,p)
% function [di,p]=loadsadcp(f,di,p)
%
%
%
% need to make array di.svel=[depth,U,V,Vel_error];
% will use array di.sadcp_lon
% di.sadcp_lat
%
%
% find SADCP profiles within time of station +/- slack (in fractional days)
p = setdefv(p,'sadcp_dtok',0);
if existf(f,'sadcp')==1
if exist(f.sadcp,'file')
disp(['LOADSADCP: load SADCP data file ',f.sadcp])
load(f.sadcp);
% By Now you should have:
% tim_sadcp(t) - Julian Days
% lat_sadcp(t) - Degrees N
% lon_sadcp(t) - Degrees E
% u_sadcp(z,t) - m/s
% v_sadcp(z,t) - m/s
% z_sadcp(z,1) - Meter (Positive Depth)
ii=find(tim_sadcp>(julian(p.time_start)-p.sadcp_dtok) & tim_sadcp<(julian(p.time_end)+p.sadcp_dtok));
if length(ii)<1
warn = ' no SADCP data found in time window';
p.warnp(size(p.warnp,1)+1,1:length(warn))=warn;
disp(warn)
return;
end
% check if position matches
if abs(p.lon)+abs(p.lat)~=0 & (abs(mean(lon_sadcp(ii))-p.lon)>0.1/cos(p.lat*pi/360) |...
abs(mean(lat_sadcp(ii))-p.lat)>0.1)
disp(' position of SADCP data is more than 0.1 degree away from LADCP')
disp(' no SADCP data used')
figure(9)
clf
orient tall
subplot(211)
text(0,0.5,' SADCP data is more than 0.1 degree away from LADCP',...
'color','r','fontsize',16,'fontweight','bold')
axis off
subplot(212)
plot(lon_sadcp(ii),lat_sadcp(ii),'rp')
hold on
if existf(di,'slon')
plot(di.slon,di.slat,'.g')
end
if abs(p.lon)+abs(p.lat)~=0
plot(p.lon,p.lat,'pr')
plot(p.poss(3)+p.poss(4)/60,p.poss(1)+p.poss(2)/60,'bp','markersize',15)
plot(p.pose(3)+p.pose(4)/60,p.pose(1)+p.pose(2)/60,'kp','markersize',15)
end
title('ship nav (g.) start (bp) end (kp) SADCP (rp)')
xlabel('longitude')
ylabel('latitude')
streamer([p.name,' Figure 9']);
pause(0.001)
return;
end % if no SADCP data in LADCP region
% interpolate SADCP navigation to LADCP time series
di.sadcp_lon=interp1(tim_sadcp,lon_sadcp(:),di.time_jul);
di.sadcp_lat=interp1(tim_sadcp,lat_sadcp(:),di.time_jul);
% set position from SADCP nav
if abs(p.lon)+abs(p.lat)==0
error('as of version IX_9, using GPS info from SADCP data stream is no longer supported');
slat=di.sadcp_lat(1);
slon=di.sadcp_lon(1);
elat=di.sadcp_lat(end);
elon=di.sadcp_lon(end);
p.poss=[fix(slat), (slat-fix(slat))*60, fix(slon), (slon-fix(slon))*60];
p.pose=[fix(elat), (slat-fix(elat))*60, fix(elon), (slon-fix(elon))*60];
end
% if no other ship navigation exists, use SADCP navigation
if existf(di,'slon')==0
error('as of version IX_9, using GPS info from SADCP data stream is no longer supported');
di.slon=di.sadcp_lon;
di.slat=di.sadcp_lat;
else
if sum(isfinite(di.slon+di.slat))==0
error('as of version IX_9, using GPS info from SADCP data stream is no longer supported');
di.slon=di.sadcp_lon;
di.slat=di.sadcp_lat;
end
end
if length(find(isfinite(u_sadcp(:,ii))))<1,
disp(' no finite SADCP data found ')
return;
end
disp([' found ',int2str(length(ii)),' SADCP profiles '])
u=squeeze(u_sadcp(:,ii));
v=squeeze(v_sadcp(:,ii));
% compute velocity standard deviation
if numel(u) == length(u)
v_err = u*0+0.1;
else
v_err=(nstd(u')+nstd(v'))';
u=meannan(u')';
v=meannan(v')';
end
ij=find(v_err==0);
v_err(ij)=0.1;
nvel=sum(isfinite(u+v)')'+v_err*0;
v_err=v_err*max(nvel)./nvel;
z=z_sadcp;
% make output array
izok=find(isfinite(u+v) & z<(p.maxdepth));
if isfinite(p.zbottom),
izok=izok(find(z(izok)<(p.zbottom-30)));
end
di.svel=[z(izok),u(izok),v(izok),v_err(izok)];
else
disp([' can not find SADCP data file:',f.sadcp])
return
end
else
disp(' no SADCP data file given')
return
end
% plot some results
figure(9)
clf
subplot(211)
plot(squeeze(u_sadcp(:,ii)),-z_sadcp,'-r')
hold on
plot(squeeze(v_sadcp(:,ii)),-z_sadcp,'--g')
ax=axis;
axis(ax)
grid
streamer(p.name);
ylabel('depth [m]')
xlabel('velocity [m/s]')
title('SADCP U(-r) and V(--g) profiles')
subplot(212)
plot(di.slon,di.slat,'.g')
hold on
plot(lon_sadcp(ii),lat_sadcp(ii),'rp')
plot(p.poss(3)+p.poss(4)/60,p.poss(1)+p.poss(2)/60,'bp','markersize',15)
plot(p.pose(3)+p.pose(4)/60,p.pose(1)+p.pose(2)/60,'kp','markersize',15)
title('ship nav (g.) start (bp) end (kp) SADCP (rp)')
xlabel('longitude')
ylabel('latitude')
pause(0.001)
% ------------------------------------------------------------
function y = nstd(x,flag,dim)
%NSTD Standard deviation, ignoring NaN.
% Same as STD, but NaN's are ignored.
%
% Copyright (c) 1997 by Toby Driscoll.
% Adapted from STD.M, written by The MathWorks, Inc.
% added backward compatibility G.Krahmann, LODYC Paris
if nargin<2, flag = 0; end
if nargin<3,
dim = min(find(size(x)~=1));
if isempty(dim), dim = 1; end
end
% Avoid divide by zero.
if size(x,dim)==1, y = zeros(size(x)); return, end
tile = ones(1,max(ndims(x),dim));
tile(dim) = size(x,dim);
xc = x - repmat(meannan(x),tile); % Remove mean
mask = isnan(xc);
xc(mask) = 0;
s = sum(~mask,dim);
s(s==0) = NaN;
if flag,
y = sqrt(sum(conj(xc).*xc,dim)./s);
else
z = (s==1);
s(z) = Inf;
y = sqrt(sum(conj(xc).*xc,dim)./(s-1));
end