⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 makelasheader.m

📁 基于matlab的反演程序,用于地球物理勘探中射线追踪及偏移成像程序.
💻 M
📖 第 1 页 / 共 2 页
字号:
function lash=makelasheader(arg1,wellname,units,kb,topnames,...
    ztops,zstart,zend,zstep,logtypes)

% lash=makelasheader(uwid,wellname,units,kb,topnames,...
%				ztops,zstart,zend,zstep,logtypes,nulval)
%
% MAKELASHEADER generates a simple LAS (Log ASCII Standard) header
% and returns it in a string matrix. It is intended to be used
% in conjuction with READGMA to allow a program to read in a 
% wellog in GMA format and write it out as LAS. Hopefully, this
% will encourage the abandonment of the GMA format. NULL value is defaulted
% to -999.25.
%
%	uwid = unique well id. Returned by READGMA as "logname"
%		should be a string
%	wellname = string giving the informal well name. 
%	units = flag indicating the units of the log 'F', 'M',
%			'FT', 'S' are recognized
%	kb = elevation of the kelly bushing in meters
%	topnames = string matrix of topnames
%	ztops = vector of tops elevations. Length should be the same
%		as the number of rows in topnames
%	zstart= start depth of logs
%	zend= end depth of logs
%	zstep= depth step of logs
%	logtypes = string matrix of las log mnemonics indicating the
%		logtypes. For example 'DT' or 'AU' for sonic, 'CALI' for
%		caliper. Each Mnemonic must be exactly 4 chars and there must
%		be one per row of logtypes. Do not include a mnemonic for the depth
%		(or time) column. This is added automatically
%
%   alternativly, you can also create a single structure file that contains
%   all the info you would like to place into your desired header
%
% There are no defaults for anything. Do it right or DIE!!
%
% G.F. Margrave
%
% 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
nullval=-999.25;
cm='Unspecified Company';
fld='Unspecified Field';
lc='Unspecified Location';
srv='Unspecified Company';
ctr='Unspecified Country';
uwid=arg1;
srvdate=date;
if(nargin==1)
    if(isstruct(uwid))
    else
        errorinfo={'Not enough input arguments to create LAS header',...
                'See makelasheader help for more details'};
        errordlg(errorinfo);
        lash=[];
        return
    end
    try
        % pulling out info from the structure, it will assumed that the
        % user has set it up correctly, if not.. CATCH!!
        nms=fieldnames(arg1);
        for ii=1:size(nms,1)
            chnm=nms{ii};
            chfld=getfield(arg1,chnm);
            if(isnumeric(chfld))
                chfld=num2str(chfld);
            end
            arg1=setfield(arg1,chnm,chfld);
        end
        % the following has to be done to eliminate the EVAL statements
        % that can not be compiled
        cm=getfield(arg1,'cm');
        fld=getfield(arg1,'fld');
        srv=getfield(arg1,'srv');
        ctr=getfield(arg1,'ctr');
        zstep=getfield(arg1,'zstep');
        kb=getfield(arg1,'kb');
        uwid=getfield(arg1,'uwid');
        zstart=getfield(arg1,'zstart');
        zend=getfield(arg1,'zend');
        nullval=getfield(arg1,'nullval');
        units=getfield(arg1,'units');
        topnames=getfield(arg1,'topnames');
        ztops=getfield(arg1,'ztops');
        wellname=getfield(arg1,'wellname');
        lc=getfield(arg1,'lc');
        srvdate=getfield(arg1,'srvdate');
        logtypes=getfield(arg1,'logtypes');
    catch
        errorinfo={'LAS Structure not in proper format.',...
                'See makelasheader help for more details'};
        errordlg(errorinfo);
        lash=[];
        return
    end
elseif(nargin<=11)
    errorinfo={'Not enough input arguments to create LAS header',...
            'See makelasheader help for more details'};
    errordlg(errorinfo);
    lash=[];
    return
end

ntops=size(ztops,1);
nrecs=ntops+40;
ncols=80;
lash=32*ones(nrecs,ncols);
iline=1;

rec=sprintf('~Version');
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf(' VERS.                2.0 :   CWLS Log ASCII Standard -VERSION 2.0');

lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf(' WRAP.                 NO :   One line per depth step');
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('');    % Spacing between last line and a '~' which starts a new section
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('~Well Information Block');
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('#MNEM.UNIT       Data                        Description of Mnemonic');
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('#----.----      -------------------------- : ------------------------------');
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

metric='M';
if(iscell(units))
    units=units{1};
    units=units(1,1);
end
if(strcmp(units,'F')|strcmp(units,'FT'))
    metric='F'
end
if(strcmp(units,'S'))
    metric='S';
end

icolon=find(rec==':');
rec=sprintf(['STRT.' metric '           %f'],str2num(zstart));
%% eval(['rec=sprintf(''STRT.' metric '           %f'','  zstart ');']);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': First Index Value'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf(['STOP.' metric '           %f'],str2num(zend));
%% eval(['rec=sprintf(''STOP.' metric '           %f'','  zend ');']);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': Last Index Value'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf(['STEP.' metric '           %f'],str2num(zstep));
%% eval(['rec=sprintf(''STEP.' metric '           %f'','  zstep ');']);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': STEP'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf(['NULL.' metric '           %f'],str2num(nullval));
%% eval(['rec=sprintf(''NULL.             %f'',' nullval ');']);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': NULL VALUE'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('');    
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('COMP.      %s',cm);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': COMPANY'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('WELL.      %s',wellname);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': WELL'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('FLD .      %s',fld);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': FIELD'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('LOC .      %s',lc);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': LOCATION'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('SRVC.      %s',srv);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': SERVICE COMPANY'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('DATE.      %s',srvdate);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': Service DATE'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('');    
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('UWI .      %s',uwid');
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': Unique Well ID'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('');    % Spacing between last line and a '~' which starts a new section
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;
%
% parameter block
%
rec=sprintf('~Parameter Information Block');
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('#----.----      -------------------------- : -----------------------------');
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('DREF.                  KB                  : Depth Reference');
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf(['EREF' metric '           %f'],str2num(kb));
%% eval(['rec=sprintf(''EREF.' metric '           %f'','  kb ');']);
rec=[rec ' '*ones(1,icolon-length(rec)-1) ': Elevation of Depth Reference'];
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('');    % Spacing between last line and a '~' which starts a new section
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

%
% tops
%
rec=sprintf('~Tops');
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec=sprintf('#TOPS NAME   .        DEPTH:');
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

for k=1:ntops
    if(iscell(topnames))
        rec=[topnames{k} '   .   '];
    else
        rec=[strunpad(topnames(k,:)) '   .   '];
    end
    checktop=ztops(k,:);
    if(ischar(checktop))
        rec1=deblank(checktop);
    else
        rec1=sprintf('%f',ztops(k,:));
    end
    rec=[rec rec1 ' :'];
    lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
    iline=iline+1;
end

rec=sprintf('');    % Spacing between last line and a '~' which starts a new section
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

%
% curve info
%
rec='~Curve Information Block';
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec='#MNEM.UNIT        API CODE                   Curve Description';
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

rec='#----.----      LG--CV-CL--M               : -----------------';
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

if(iscell(logtypes))
    [c,nlogs]=size(logtypes);
else
    [nlogs,c]=size(logtypes);
end

%write out the depth
switch metric
    case 'M'
        rec=' DEPT.M          0   1  0  0               : 1 DEPTH';
    case 'F'
        rec=' DEPT.FT         0   1  0  0               : 1 DEPTH';
    case 'S'
        rec=' ETIM.S          0   1  0  0               : 1 TIME';
end
lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
iline=iline+1;

for k=1:nlogs
    if(iscell(logtypes))
        mnem=logtypes{k};
    else
        mnem=logtypes(k,:);
    end
    flag=las2logtype(mnem);
    if(flag==0)
        switch metric
            case 'M'
                rec=sprintf(...
                    ' AU  .US/M      60 520 32  1               : %d SONIC',k+1);
            case 'F'
                rec=sprintf(...
                    ' AU  .US/F      60 520 32  1               : %d SONIC',k+1);
            case 'S'
                rec=sprintf(...
                    ' AU  .US/S      60 520 32  1               : %d SONIC',k+1);
        end
    elseif( flag==1 )
        if( metric )
            rec=sprintf(...
                ' RHOB.K/M3                                 : %d bulk density'...
                ,k+1);
        else
            rec=sprintf(...
                ' RHOB.L/F3                                 : %d bulk density'...
                ,k+1);
        end
    elseif( flag==2)
        if( metric )
            rec=sprintf(...
                ' RHGF.K/M3                                 : %d form density'...
                ,k+1);
        else
            rec=sprintf(...
                ' RHGF.L/F3                                 : %d form density'...
                ,k+1);
        end
    elseif( flag==3)
        if( metric )
            rec=sprintf(...
                ' RHGA.K/M3                                 : %d app. density'...
                ,k+1);
        else
            rec=sprintf(...
                ' RHGA.L/F3                                 : %d app. density'...
                ,k+1);
        end
    elseif( flag==4)
        rec=sprintf(...
            ' GR  .GAPI                                 : %d gamm ray'...
            ,k+1);
    elseif( flag==5)
        rec=sprintf(...
            ' SP  .MV                                   : %d spon. pot.'...
            ,k+1);
    elseif( flag==7)
        if( metric )
            rec=sprintf(...
                ' CALI.MM                                   : %d caliper'...
                ,k+1);
        else
            rec=sprintf(...
                ' CALI.IN                                   : %d caliper'...
                ,k+1);
        end
        switch metric
            case 'M'
                rec=sprintf(...
                    ' SSON.US/M                                 : %d S Wave SONIC',k+1);
            case 'F'
                rec=sprintf(...
                    ' SSON.US/F                                 : %d S Wave SONIC',k+1);
            case 'S'
                rec=sprintf(...
                    ' SSON.US/S                                 : %d S Wave SONIC',k+1);
        end
    elseif(flag==27)
        % this one may not be standard at this point
        switch metric
            case 'M'
                rec=sprintf(...
                    ' VS  .M/S                                  : %d VS',k+1);
            case 'F'
                rec=sprintf(...
                    ' AU  .F/S                                  : %d VS',k+1);
        end
    elseif(flag==28)
        % this one may not be standard at this point
        switch metric
            case 'M'
                rec=sprintf(...
                    ' VS  .M/S                                  : %d VP',k+1);
            case 'F'
                rec=sprintf(...
                    ' AU  .F/S                                  : %d VP',k+1);
        end
    else
        rec=sprintf(...
            [' ' mnem '.????                                 : %d unknown']...
            ,k+1);
    end
    lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];
    iline=iline+1;
    
end

%
% the last line
%
if( metric >= 0)
    rec='~Asc Depth';
else
    rec='~Asc Time';
end

for k=1:nlogs
    if(iscell(logtypes))
        mnem=logtypes{k};
    else
        mnem=logtypes(k,:);
    end
    rec=sprintf([rec '  %s  '],mnem);
end

lash(iline,:)=[rec lash(iline,length(rec)+1:ncols)];

lash=lash(1:iline,:);
lash=char(lash);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -