www.pudn.com > logtools.rar > logtotime.m, change:2004-08-13,size:7341b

function logout=logtotime(login,tzobj,dtout,x) % logout=logtotime(login,tzobj,dtout,x) % logout=logtotime(login,tzobj,dtout) % % LOGTOTIME converts a well log from depth to time given a time-depth % (tz) function. The input arguments can have a variety of forms as % detailed below: % % login ... this can be a Random Earth Object as used by LOGSEC or % a simple [n,2] matrix where the first column is depth % and the second is the log samples. Must be regularly sampled % tzobj ... this can be a time-depth object as used by LOGSEC, or a % simple [m,2] matrix where the first column is depth and the % second is time % dtout ... desired time sample rate of the output log. Internally, the % log will be converted to time at whatever sample rate is % needed to avoid aliasing and then resampled (with a % zero phase antialias filter if needed) to dtout. % (Note that the output samples will always lie on a grid which % includes t=0. While the time range of the samples may lie outside % t=0, if that range is extrapolated the grid will intercept t=0.) % NOTE:setting dtout to -1 will cause the algorithm to determine dtout % as the finest sample rate needed to avoid aliasing. % x ... the x coordinate of the well. If the log is off the ends of the % tz section, then constant extrapolation of the closest tz curve % occurs. Hence the default for x is appropriate with a single tz % curve. % ******************** default x=0 ****************** % % logout ... a log object of the same type as input. If both the log and % the tz functions were objects then the logout will have its datatype % set to 'tlog' and its username will be the id of the tzobj (defined % to be tzid=objget(tzobj,'objmodified') ). If login was a simple 2 % column matrix, then this will be also with the first column time % and the second samples. % % G.F. Margrave, March 1994 % % NOTE: It is illegal for you to use this software for a purpose other % than non-profit education or research UNLESS you are employed by a CREWES % Project sponsor. By using this software, you are agreeing to the terms % detailed in this software's Matlab source file. % BEGIN TERMS OF USE LICENSE % % This SOFTWARE is maintained by the CREWES Project at the Department % of Geology and Geophysics of the University of Calgary, Calgary, % Alberta, Canada. The copyright and ownership is jointly held by % its author (identified above) and the CREWES Project. The CREWES % project may be contacted via email at: crewesinfo@crewes.org % % The term 'SOFTWARE' refers to the Matlab source code, translations to % any other computer language, or object code % % Terms of use of this SOFTWARE % % 1) Use of this SOFTWARE by any for-profit commercial organization is % expressly forbidden unless said organization is a CREWES Project % Sponsor. % % 2) A CREWES Project sponsor may use this SOFTWARE under the terms of the % CREWES Project Sponsorship agreement. % % 3) A student or employee of a non-profit educational institution may % use this SOFTWARE subject to the following terms and conditions: % - this SOFTWARE is for teaching or research purposes only. % - this SOFTWARE may be distributed to other students or researchers % provided that these license terms are included. % - reselling the SOFTWARE, or including it or any portion of it, in any % software that will be resold is expressly forbidden. % - transfering the SOFTWARE in any form to a commercial firm or any % other for-profit organization is expressly forbidden. % % END TERMS OF USE LICENSE % tic if(nargin<4) x=0; end if( isearthobj(login) ) logobj=1; zsamps=objget(login,'samples'); zlog=objget(login,'depth'); else logobj=0; zsamps=login(:,2); zlog=login(:,1); end % % LOGSEC tz objects are container objects with datatype 'tzsc'. The container % has the following attributes: % 'tmatrix' ... stores a matrix of [nz,nx] of the times for the time depth curves % 'zmatrix' ... stores a matrix of [nz,nx] of the depths for the time depth curves % 'x' ... stores a vector of length nx of the x coordinates of the curves % if( isearthobj(tzobj) ) tmtx=objget(tzobj,'tmatrix'); zmtx=objget(tzobj,'zmatrix'); xtz=objget(tzobj,'x'); tzid=objget(tzobj,'objmodified'); else tmtx=tzobj(:,2); zmtx=tzobj(:,1); tzid=[]; end % determine the tz function to use [nlegs,ntz]=size(tmtx); if( ntz==1 ) tz1=tmtx; zt1=zmtx; tz2=[]; zt2=[]; else % check for exact equality ind=find(xtz==x); if(~isempty(ind)) tz1=tmtx(:,ind); zt1=zmtx(:,ind); tz2=[]; zt2=[]; else %make sure its ordered [xtz,ix]=sort(xtz); ind=surround(xtz,x); %end cases if(isempty(ind)) if(x<xtz(1)) tz1=tmtx(:,ix(1)); zt1=zmtx(:,ix(1)); tz2=[]; zt2=[]; else tz1=tmtx(:,ix(ntz)); zt1=zmtx(:,ix(ntz)); tz2=[]; zt2=[]; end else %keep two functions zt1=zmtx(:,ix(ind)); tz1=tmtx(:,ix(ind)); zt2=zmtx(:,ix(ind+1)); tz2=tmtx(:,ix(ind+1)); f2=-(x-xtz(ind))/(xtz(ind)-xtz(ind+1)); f1=-(x-xtz(ind+1))/(xtz(ind+1)-xtz(ind)); end end end %disp('tz function determined') %toc %tic % ok, determine the internal sample rate vins=2*diff(zt1)./diff(tz1); dz=zlog(2)-zlog(1); dt=2*dz/max(vins); if(isempty(zt2)) % %determine the time axis for the output log. We make sure that the time %samples fall evenly on a grid which includes t=0 % %map the end samples of the log % tends=interpextrap(zt1,tz1,[zlog(1) zlog(length(zlog))]); tmin=dt*ceil(tends(1)/dt); tmax=dt*floor(tends(2)/dt); tlog=tmin:dt:tmax; %determine the interpolation sites zint=interpextrap(tz1,zt1,tlog); else % determine the time coordinate for the log intermediate between the two % tz functions tends=interpextrap(zt1,tz1,[zlog(1) zlog(length(zlog))]); tends2=interpextrap(zt2,tz2,[zlog(1) zlog(length(zlog))]); tends=f1*tends+f2*tends2; tmin=dt*ceil(tends(1)/dt); tmax=dt*floor(tends(2)/dt); tlog=tmin:dt:tmax; %determine the interpolation sites on the first function zint=interpextrap(tz1,zt1,tlog); %determine the interpolation sites zint2=interpextrap(tz2,zt2,tlog); %average the results from the two functions zint=f1*zint+f2*zint2; end %disp('interpolation sites determined'); %toc %tic %ok sinc function interpolation of the depth trace to create the time trace %make sure zint lies within the bounds of zlog ikeep=between(zlog(1),zlog(length(zlog)),zint,2); zint=zint(ikeep); tlog=tlog(ikeep); tsamps=sincinan(zsamps,zlog,zint); %disp('sinc interpolation done') %toc %tic %resample to dtout % remove a cubic polynomial first to reduce end effects % if( dtout ~= -1) tmin=dtout*ceil(tlog(1)/dtout); tmax=dtout*floor(tlog(length(tlog))/dtout); ilive=find(~isnan(tsamps)); %tm=mean(tsamps(ilive)); order=min([length(ilive) 3]); p=polyfit(tlog(ilive),tsamps(ilive),order); [tsamps,tlog]=resamp(tsamps-polyval(p,tlog),tlog,dtout,[tmin tmax],0); tsamps=tsamps+polyval(p,tlog); %disp('resampling done ') %toc end %tic %repackage the log as an object of the same type that was received if(logobj) logout=randobj(objget(login,'name'),'tlog'); if(~isempty(tzid)) logout=objset(logout,'username',tzid); end logout=objset(logout,'samples',tsamps); logout=objset(logout,'time',tlog); else logout=[tlog(:) tsamps(:)]; end %disp('object made') %toc