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

📄 write_las_file.m

📁 地震、测井方面matlab代码,解释的比较详细
💻 M
字号:
function write_las_file(wlog,filename,iprint)
% Function creates a disk file in LAS (Log ASCII Standard)format, 
% Version 2.0, as specified by the Canadian Well Logging Society
% Written by: E. R.: Feb. 20, 2000 
% Last updated: January 6, 2005: use "wlog.name" as default file name
%
%       write_las_file(wlog,filename,iprint)
% INPUT
% wlog  structure containing the log curves and ancillary information
%              Required fields  
%	wlog.curves   	Matrix of curve values
%		 Each log curve is in a c"wlog.curves" has n columns, then there
%                are n-1 log curves. The LAS format does not allow exponents in 
%                the curve values. Hence care should should be taken to ascertain
%                that the log values can be represented accurately enough with a
%                total no more than 2-3 decimal digits.      
%       wlog.curve_info Cell array (3 x number of curves) with curve mnemonics, 
%               curve units of measurement, and curve descriptions
%       wlog.null	Null value (set to NaN)
%       wlog.first	Start of log (first depth in file)
%       wlog.last	Stop of log (last depth in file)
%       wlog.step	Depth increment (0 if unequal)
%       wlog.wellname	Well name
%       wlog.field       Name of the field (this could be WILDCAT)
%       wlog.location    Location of well
%       wlog.company     Oil/gas company which drilled the well
%
%              The following components, while desirable, are either optional 
%              or are replaced by defaults. They include
%                    Well information      
%       wlog.country	Country in which well is located
%       wlog.wellid	Well Identifier
%       wlog.service     Service company which logged the well
%       wlog.province    Province
%       wlog.county      County
%       wlog.state       State
%       wlog.date        Date (default: current data)
%       wlog.api         API number
%       wlog.uwi         Unique well ID
%
%              Parameters which have numerical values other than the null value are
%              written to the Parameter Section of the LAS header.
%              In the log structure a parameter is represented by a field with 
%              the parameter name and a row in the cell array "wlog.parameter_info".
%              Such a row consists of three strings: the first is the parameter 
%              mnemonic, the second the units of measurement, and the third the 
%              parameter description.
%    wlog.ekb=84	Kelly bushing elevation     
%    wlog.egl=0		Ground level elevation
%    wlog.parameter_info={'ekb','ft','Kelly bushing elevation';
%                         'egl','ft','Ground level elevation'}
%
%
% filename     name of the file; if empty or omitted a file selector box will be opened
%              for interactive file selection
%
% iprint       print control parameter (iprint = 0, no printout,
%                                       iprint = 1; LAS header is printed, default)
%
% EXAMPLE
%             write_las_file(wlog)

if ~isstruct(wlog)
  error(' First input argument must be structure')
end

if nargin  <= 2;
   iprint=0;
end  

line_feed=char(10);

% 	Replace NaNs (if they exist) by new null value
if isfield(wlog,'null')
   idx=find(isnan(wlog.curves));
   wlog.curves(idx)=-999.25;
end
wlog.null=-999.25;

%      	If a 3-decimal representation of wlog.step is not sufficient, 
%       replace wlog.step by 0
temp=wlog.step*1000;
if temp-fix(temp) > 1.0e-6, wlog.step=0; end

lasheader=make_las20_header(wlog,line_feed,iprint);

if exist('iprint','var') ~= 1; iprint=1; end
if iprint == 1; lasheader, end

%	Open file for writing
if nargin > 1
   fid=fopen(filename,'wt');
   if fid == -1
      selected_file=get_filename4w('.las',filename);
      fid=fopen(selected_file,'wt');
   end
else
   selected_file=get_filename4w('.las',wlog.name);
   fid=fopen(selected_file,'wt');
end

[nlines,nchar]=size(lasheader);

fprintf(fid,'%s',lasheader);

% 	ASCII data
mnems=char(wlog.curve_info{:,1});
[n,m]=size(mnems);
nchar=12;	% Number of characters per column
if m < nchar    % Append nchar-m blanks to mnemonics
  stemp=blanks(nchar-m);
  stemp=stemp(ones(n,1),:);
  mnems=[mnems,stemp];
else
  mnems=mnems(:,1:nchar);
end

lash1=['~A ', reshape(mnems',1,nchar*n),line_feed];
fprintf(fid,'%s',lash1);
if iprint == 1; fprintf('%s',lash1); end 

[n,m]=size(wlog.curves);

% Create format for ASCII data (minimum four digits)
 
ac=abs(wlog.curves);
for ii=1:m
  nd1=ceil(log10(max(abs(wlog.curves(:,ii))+eps)))+2;
  nd2=3;
  if nd1+nd2 < nchar-1
    nd1=nchar;
  else
    nd2=2;
    nd1=nd1+4;
  end
  if ii == 1 
    if wlog.step == 0 | fix(wlog.step*nd2) ~= wlog.step*nd2, nd2=3; end  
    format=['%',num2str(nd1-1),'.',num2str(nd2),'f'];
  else
    format=[format,'%',num2str(nd1),'.',num2str(nd2),'f'];
  end
end
  
format=[format,'\n'];
fprintf(fid,format,wlog.curves');
if iprint == 1, fprintf('%d of %d lines of curve data written\n',n,n); end
fclose(fid);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function lash=make_las20_header(wlog,line_feed,iprint)
% Function creates simple header for LAS file
% Date Feb. 19, 2000;  written by E. R.
% INPUT
%  wlog           Log structure
%                     Required fields  
%  wlog.curves    Matrix of curve values
%		 Each log is in a column and the first column is usually the depth.
%                Thus, if logmat has n columns, then there are n-1 log curves.
%                The LAS format does not allow exponents in the curve values.
%                Hence care should should be taken to ascertain that the log values 
%                can be represented accurately enough with a total no more than 
%                2-3 decimal digits.      
%  wlog.mnem	Cell array with curve mnemonics
%  wlog.units	Cell  array with curve units of measurement
%  wlog.description Cell array with curve description
%  wlog.null	Null value (set to NaN)
%  wlog.first	Start of log (first depth in file)
%  wlog.last	Stop of log (last depth in file)
%  wlog.step	Depth increment (0 if unequal)
%  wlog.wellname	Well name
%  wlog.field       Name of the field (this could be WILDCAT)
%  wlog.location    Location of well
%  wlog.company     Oil/gas company which drilled the well
%
%              The following components, while desirable, are either optional 
%              or are replaced by defaults. They include
%                    Well information      
%   wlog.country	Country in which well is located
%   wlog.wellid	Well Identifier
%   wlog.service     Service company which logged the well
%   wlog.province    Province
%   wlog.county      County
%   wlog.state       State
%   wlog.date        Date
%   wlog.api         API number
%   wlog.uwi         Unique well ID
%
%              Parameters which have numerical values other than the null value are
%              written to the Parameter Section of the LAS header.
%              In the log structure a parameters is represented by field with 
%              the parameter name and a row in the cell array wlog.parameter_info.
%              Such a row consists of three strings: the first is the parameter 
%              mnemonic, the second the units of measurement and the third the 
%              parameter description.
%    wwlog.ekb=84	Kelly bushing elevation     
%    wwlog.egl=0		Ground level elevation
%    wwlog.parameter_info={'ekb','ft','Kelly bushing elevation';
%                         'egl','ft','Ground level elevation'}
%
% line_feed   line-feed character
% iprint   Control diagnostic output (optional)
%          iprint = 0  ==> no output; DEFAULT
%          iprint ~= 0 ==> diagnostic output
% OUTPUT   
% lash     LAS header
%
%            lash=make_las20_header(wlog,line_feed,iprint)

if nargin == 2, iprint=0; end

%  	Version information section
lash=['~VERSION INFORMATION SECTION',line_feed, ...
          'VERS.           2.0  :CWLS Log ASCII Standard - 2.0',line_feed, ...
          'WRAP.           NO   :One line per depth',line_feed, ...
          '#               Created in SeisLab',line_feed];
if iprint == 1, fprintf('... start well information section\n'), end

%	Well information section
stemp=wlog.curve_info{1,2};
start=['STRT.',stemp,'  ',num2str(wlog.first)];
stop=['STOP.',stemp,'  ',num2str(wlog.last)];
step=['STEP.',stemp,'  ',num2str(wlog.step)];
null=['NULL.    ',num2str(wlog.null)];
lash1=char('#MNEM.UNIT  VALUE/NAME',start,stop,step,null);
lash2=char('   :DESCRIPTION','   :Start Depth','   :Stop Depth','   :Step', ...
          '   :Null Value');

if isfield(wlog,'wellname') 
  lash1=char(lash1,['WELL.    ',wlog.wellname]);
else
  lash1=char(lash1,['WELL.    ','UNKNOWN']);
end
lash2=char(lash2,'   :Well Name');

if isfield(wlog,'country'), 
  lash1=char(lash1,['CTRY.    ',wlog.country]);
else
  lash1=char(lash1,['CTRY.    ','UNKNOWN']);
end
lash2=char(lash2,'   :Country');
 
if isfield(wlog,'county'), 
  lash1=char(lash1,['CNTY.    ',wlog.county]);
else
  lash1=char(lash1,['CNTY.    ','UNKNOWN']);
end
lash2=char(lash2,'   :County');

if isfield(wlog,'state'), 
  lash1=char(lash1,['STAT.    ',wlog.state]);
else
  lash1=char(lash1,['STAT.    ','UNKNOWN']);
end
lash2=char(lash2,'   :State');

if isfield(wlog,'api'), 
  lash1=char(lash1,['API .    ',wlog.api]);
else
  lash1=char(lash1,['API .    ','UNKNOWN']);
end
lash2=char(lash2,'   :API number');

if isfield(wlog,'uwi'), 
  lash1=char(lash1,['UWI .    ',wlog.uwi]);
else
  lash1=char(lash1,['UWI .    ','UNKNOWN']);
end
lash2=char(lash2,'   :Unique well ID');

if isfield(wlog,'location'),  
  lash1=char(lash1,['LOC .    ',wlog.location]);
else
  lash1=char(lash1,['LOC .    ','UNKNOWN']);
end
lash2=char(lash2,'   :Well Location');

if isfield(wlog,'field'), 
  lash1=char(lash1,['FLD .    ',wlog.field]);
else
  lash1=char(lash1,['FLD .    ','UNKNOWN']);
end
lash2=char(lash2,'   :Field');

if isfield(wlog,'company'), 
  lash1=char(lash1,['COMP.    ',wlog.company]);
else
  lash1=char(lash1,['COMP.    ','Generic Oil Company']);
end
lash2=char(lash2,'   :Company');

if isfield(wlog,'service'),  
  lash1=char(lash1,['SRVC.    ',wlog.service]);
else
  lash1=char(lash1,['SRVC.    ','UNKNOWN']);
end
lash2=char(lash2,'   :Service Company');

if isfield(wlog,'date'), 
  lash1=char(lash1,['DATE.    ',wlog.date]);
else
  lash1=char(lash1,['DATE.    ',date]);
end
lash2=char(lash2,'   :Date');

lash=[lash,'~WELL INFORMATION SECTION',line_feed];
for ii=1:size(lash1,1)
  lash=[lash,lash1(ii,:),lash2(ii,:),line_feed];
end
if iprint == 1, fprintf('... completed well information section\n'), end

%      Parameter information section (parameters are fields of the log structure
%      which matching entry in the first column of the cell array 
%      wlog.parameter_info
if ~isfield(wlog,'parameter_info')
  np=0;
else 
  parameters=wlog.parameter_info(:,1);
  np=length(parameters);
end

temps1='#MNEM';
temps1a='.UNITS';
temps2='  VALUE';
temps3='   :DESCRIPTION OF PARAMETER';
for ii=1:np
    temps=wlog.parameter_info(ii,2:3);
%    temps=getfield(wlog.parameter_info,parameters{ii});
    temps1=char(temps1,parameters{ii});
    temps1a=char(temps1a,['.',temps{1}]);
    temps2=char(temps2,['  ',num2str(getfield(wlog,parameters{ii}))]);
    temps3=char(temps3,['   :',temps{2}]);
end
lash=[lash,'~PARAMETER INFORMATION SECTION',line_feed];

for ii=1:size(temps1,1)
  lash=[lash,temps1(ii,:),temps1a(ii,:),temps2(ii,:),temps3(ii,:),line_feed];
end

if iprint == 1 
  fprintf('... completed parameter information section\n')
end

%	Curve information section
if iprint == 1, fprintf('... start curve information section\n'), end
[nsamp,ncurves]=size(wlog.curves);

temps1='#MNEM';
temps1a='.UNITS';
temps1b='  API CODES';
temps2='   :DESCRIPTION OF MNEMONIC';

for ii=1:ncurves
  temps1=char(temps1,wlog.curve_info{ii,1});
  temps1a=char(temps1a,['.',wlog.curve_info{ii,2}]);
  temps1b=char(temps1b,' ');
  temps2=char(temps2,['   :',wlog.curve_info{ii,3}]);
end
  
% lash=char(lash,'~CURVE INFORMATION SECTION',[temps1,temps2]); 
lash=[lash,'~CURVE INFORMATION SECTION',line_feed];
for ii=1:size(temps1,1)
  lash=[lash,temps1(ii,:),temps1a(ii,:),temps1b(ii,:),temps2(ii,:),line_feed];
end       
if iprint == 1, fprintf('... completed curve information section\n'), end


%	Other information
if isfield(wlog,'comments')
%  lash=char(lash,'~Other information',wlog.comments);
  lash=[lash,'~Other information',wlog.comments,line_feed];
end





⌨️ 快捷键说明

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