--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/loadctdprof.m Tue Oct 20 16:23:49 2009 -0400
@@ -0,0 +1,170 @@
+%======================================================================
+% L O A D C T D P R O F . M
+% doc: Thu Jun 17 23:17:25 2004
+% dlm: Fri Mar 5 15:48:54 2010
+% (c) 2004 ladcp@
+% uE-Info: 77 13 NIL 0 0 72 0 2 8 NIL ofnI
+%======================================================================
+
+% CHANGES BY ANT:
+% Jul 17, 2008: - removed dependence on p.nav_start, because that's
+% not set in [loadnav.m] any more
+% Jul 27, 2008: - nanmean() -> meannan()
+% Jan 7, 2009: - tightened use of exist()
+
+function [d,p]=loadctdprof(f,d,p,ipos,isub)
+% function [d,p]=loadctdprof(f,d,p,ipos,isub)
+% LADCP-2 software version 7.0
+%
+% ========== THIS PART IS SPECIFIC TO LDEO CTD PROFILE DATA ============
+%
+% you might want to change it to accomodate your own data format
+%
+%
+% load and merges LDEO ctdfile
+% ipos(1) : pressure
+% ipos(2) : temperature (in situ)
+% ipos(3) : salinity
+%
+% computes sound speed
+% computes static stability
+%
+% Martin Visbeck, 6/10/99
+% revised March 2002
+% revised December 2002
+
+% CLIVAR P02 (VANC32) CTD profiles do not contain lat/lon;
+% threfore, they are taken from p.nav_start
+
+if nargin<5, isub=1; end
+if nargin<4, ipos=[1,2,3]; end
+
+% read ctd data file
+disp(['LOADCTDPROF: load CTD profile ',f.ctdprof])
+if ~exist(f.ctdprof,'file')
+ warn=([' LOADCTDPROF can not find ',f.ctdprof]);
+ p.warnp(size(p.warnp,1)+1,1:length(warn))=warn;
+ disp(warn)
+ return
+end
+[dctd,posctd]=readctd(f.ctdprof,isub,ipos);
+
+if length(posctd) == 2
+ d.ctdprof_lon=posctd(2);
+ d.ctdprof_lat=posctd(1);
+elseif p.navdata
+ d.ctdprof_lon = meannan(d.slon);
+ d.ctdprof_lat = meannan(d.slat);
+else
+ error('do not know how to determine CTD position');
+end
+d.ctdprof_z=p2z(dctd(:,1),d.ctdprof_lat);
+d.ctdprof_p=dctd(:,1);
+d.ctdprof_t=dctd(:,2);
+d.ctdprof_s=dctd(:,3);
+
+% get N^2
+if exist('sw_bfrq','file')
+ d.ctdprof_N2=sw_bfrq(d.ctdprof_s,d.ctdprof_t,d.ctdprof_p,d.ctdprof_lat);
+ d.ctdprof_N2(end+1)=d.ctdprof_N2(end);
+ d.ctdprof_ss=sw_svel(d.ctdprof_s,d.ctdprof_t,d.ctdprof_p);
+else
+ disp(' download SW routines to get soundspeed and N^2 ')
+end
+
+% get maximum ctdepth
+disp([' CTD max depth : ',int2str(max(d.ctdprof_z))])
+if ~isfinite(p.zpar(2));
+ p.zpar(2)=fix(max(d.ctdprof_z));
+end
+
+
+%====================================================================
+
+function depth=p2z(p,lat)
+% !!!!!! USES Z=0 AT P=0 (I.E. NOT 1ATM AT SEA SURFACE)
+% pressure to depth conversion using
+% saunders&fofonoff's method (deep sea res.,
+% 1976,23,109-111)
+% formula refitted for alpha(p,t,s) = eos80
+% units:
+% depth z meter
+% pressure p dbars (original in bars, but below
+% division by 10 is included)
+% latitude lat deg
+% checkvalue:
+% depth = 9712.654 m
+% for
+% p = 1000. bars
+% lat = 30. deg
+% real lat,p
+ if nargin < 2, lat=54; end
+ p=p/10.;
+ x=sin(lat/57.29578);
+ x=x*x;
+ gr=9.780318*(1.0+(5.2788e-3+2.36e-5*x)*x)+1.092e-5*p;
+ depth=(((-1.82e-11*p+2.279e-7).*p-2.2512e-3).*p+97.2659).*p;
+ depth=depth./gr;
+%
+%
+%====================================================================
+
+function [d,pos]=readctd(file,isub,index)
+% read CTD data
+id=fopen(file,'r');
+A=fread(id);
+fclose(id);
+A=setstr2(A);
+
+pos = [];
+
+%%%ii=find(A(:,1)=='@');
+%%%A=A((ii+1):end,:);
+
+[lt,lv]=size(A);
+
+d=[];
+
+if nargin<2, isub=1; end
+
+for i=1:isub:lt
+ d=[d;sscanf(A(i,:),'%g')'];
+end
+
+if nargin>2
+ d=d(:,index);
+end
+
+
+% -----------------------------------------------------
+function AR=setstr2(A,cr)
+% function AR=setstr2(A,cr)
+% reshape charater string vector A
+% in record structure
+% cr = 10 (default)
+
+% remove line feeds
+ii=find(A==13);
+A(ii)=[];
+
+
+if nargin<2, cr=10;, end
+
+ii=[0;find(A==cr)];
+
+n=length(ii)-1;
+m=max([diff(ii)]);
+
+% fill array with blanks
+AR=ones(n,m)*32;
+
+for i=1:n
+ j=(ii(i)+1):(ii(i+1)-1);
+ if length(j)>0
+ j1=j-j(1)+1;
+ AR(i,j1)=A(j)';
+ end
+end
+
+AR=setstr(AR);
+