git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@382 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp
2007-03-08 23:57:08 +00:00
parent 2fa8f3d114
commit 87ada1e556
8 changed files with 830 additions and 0 deletions

BIN
tools/matlab/README.pdf Normal file

Binary file not shown.

252
tools/matlab/lmp2cfg.m Normal file
View File

@ -0,0 +1,252 @@
function lmp2cfg(varargin)
% Converts LAMMPS dump file to Extended CFG Format (No velocity) to be used
% with AtomEye (http://164.107.79.177/Archive/Graphics/A/)
% Input :
% Necessary (in order)
% timestep,Natoms,x_bound,y_bound,z_bound,H,atom_data,mass,
% cfg file name, dumpfile name
% Optional
% 'vel' --> 'yes' (if velocity data needs to be written)
% --> Default is 'no'
% 'atomtype' --> {Atom symbol}
% 'autonumber' --> 'yes' (default) numbers cfgfiles consecutively based on timestep
% 'autolog' --> 'on' (default) writes details of conversion to a log file
% 'rotation' --> To specify rotation (Transform in cfg file) say 'rotation' followed by
% number of rotations,the axes of rotation ('X' or 'Y' or 'Z')and the
% angle in degrees. CAUTION : Do remember that rotations are
% non-commutative and hence the order of rotations must be the same as
% intended
% 'aux' --> Auxiliary data must be a two column array with Quantity and Type in each
% column
%
%
% THE DATA MUST BE SCALED (0 to 1)IN ORDER FOR ATOMEYE TO READ PROPERLY
% Real coordinates x = s * H, x, s are 1x3 row vectors
%
% Example
% lmp2cfg_all(data.timestep,data.Natoms,data.xbound,data.ybound,...
% data.zbound,H,data.atom_data,mass,cfgfile,dumpfile,...
% 'vel','no','aux',{'sxx' 'Lammps O/P'
% 'syy' 'Lammps O/P'
% 'szz' 'Lammps O/P'
% 'sxy' 'Lammps O/P'
% 'sxz' 'Lammps O/P'
% 'syz' 'Lammps O/P'},...
% 'atomtype',{'Ni'
% 'Al'},...
% 'autonumber','on',...
% 'autolog','on',...
% 'rotation',2,'X',45,'Y',30);
%
% See also readdump_all, readdump_one, scandump
%
% Author : Arun K. Subramaniyan
% sarunkarthi@gmail.com
% http://web.ics.purdue.edu/~asubrama/pages/Research_Main.htm
% School of Aeronautics and Astronautics
% Purdue University, West Lafayette, IN - 47907, USA.
%------------ Defaults
vel = 'no';
auxstatus = 0;
atom_typestatus = 0;
rotstatus = 0;
autonumber_status = 1; % default is ON
autolog_status = 1;
%----------------------------------
%-----Required Input --------------
timestep = varargin{1}
Natoms = varargin{2};
x_bound = varargin{3};
y_bound = varargin{4};
z_bound = varargin{5};
H = varargin{6};
atom_data = varargin{7};
mass = varargin{8}; %arrange it in order of atom type , ie 1 - mass1 etc
filename = varargin{9}; %Just give one file name
if length(varargin) < 10
dumpfilename = ['dump.' filename];
else
dumpfilename = varargin{10};
end
if length(varargin) > 10
i=11;
while i<length(varargin)
id = varargin{i};
switch id
case 'vel'
vel = varargin{i+1};
i=i+2;
case 'aux'
auxiliary = varargin{i+1};
auxstatus = 1;
i=i+2;
case 'atomtype'
atom_type = varargin{i+1};
atom_typestatus = 1;
i=i+2;
case 'rotation'
nrot = varargin{i+1}; % number of rotations
i = i+2;
if nrot <=0
error('Number of rotations must be a positive value');
end
rotstatus = 1;
for j = 1 : 1 : nrot
rotaxes{j} = varargin{i};
i = i + 1;
rotangle(j) = varargin{i};
i = i + 1;
end
case 'autonumber'
numberstate = varargin{i+1};
i = i +2;
if strcmpi(numberstate,'ON')
autonumber_status = 1;
elseif strcmpi(numberstate,'OFF')
autonumber_status = 0;
end
case 'autolog'
logstate = varargin{i+1};
i = i + 2;
if strcmpi(logstate,'ON')
autolog_status = 1;
elseif strcmpi(logstate,'OFF')
autolog_status = 0;
end
end
end
end
% Calculating Transformation matrix [T]
if rotstatus == 0
T = eye(3); % Identity matrix
elseif rotstatus == 1
T = eye(3);
for j = 1 : 1 : nrot
B = beta(rotangle(j)*pi/180,rotaxes{j});
T = B*T;
end
end
T = T'; % because Transform = [beta]transpose
%----------------------------------
nfiles = length(timestep);
%----Default Atom type names------------
if atom_typestatus == 0
atom_type = {'Au'
'Ni'
'Zn'
'H'
'O'
'Cu'
'Al'
'Ag'
'C'
'Si'};
end
%--------Sorting atom types ---------
[s,id] = sort(atom_data(:,2,:));
%---------Writing CFG files---------------
for i = 1 : 1 : nfiles
if autonumber_status == 1
n = [filename '_' num2str(i) '.cfg'];
elseif autonumber_status == 0
n = [filename '.cfg'];
end
name{i}=n;
fid = fopen(name{i},'w+');
fprintf(fid,'Number of particles = %d\n',Natoms(i));
fprintf(fid,'A = 1.0000000000 Angstrom \n');
% Writing [H]
fprintf(fid,'H0(1,1) = %f A \n',H(1,1));
fprintf(fid,'H0(1,2) = %f A \n',H(1,2));
fprintf(fid,'H0(1,3) = %f A \n',H(1,3));
fprintf(fid,'H0(2,1) = %f A \n',H(2,1));
fprintf(fid,'H0(2,2) = %f A \n',H(2,2));
fprintf(fid,'H0(2,3) = %f A \n',H(2,3));
fprintf(fid,'H0(3,1) = %f A \n',H(3,1));
fprintf(fid,'H0(3,2) = %f A \n',H(3,2));
fprintf(fid,'H0(3,3) = %f A \n',H(3,3));
% Writing [T]
fprintf(fid,'Transform(1,1) = %f \n',T(1,1));
fprintf(fid,'Transform(1,2) = %f \n',T(1,2));
fprintf(fid,'Transform(1,3) = %f \n',T(1,3));
fprintf(fid,'Transform(2,1) = %f \n',T(2,1));
fprintf(fid,'Transform(2,2) = %f \n',T(2,2));
fprintf(fid,'Transform(2,3) = %f \n',T(2,3));
fprintf(fid,'Transform(3,1) = %f \n',T(3,1));
fprintf(fid,'Transform(3,2) = %f \n',T(3,2));
fprintf(fid,'Transform(3,3) = %f \n',T(3,3));
if strcmpi(vel,'no')
fprintf(fid,'.NO_VELOCITY. \n');
end
fprintf(fid,'entry_count = %d \n',length(atom_data(1,:,i))-2);
if auxstatus == 1
for k = 1 : 1 : length(auxiliary(:,1))
fprintf(fid,'auxiliary[%d] = %s [%s]\n',k-1,auxiliary{k,1},...
auxiliary{k,2});
end
end
aid = 1;
atom_change = 1;
for j = 1 : 1 : Natoms(i)
if atom_change == 1
fprintf(fid,'%f\n',mass(aid));
fprintf(fid,'%s\n',atom_type{aid});
end
atom_change = 0;
fprintf(fid,'%f\t',atom_data(id(j,1,i),3:length(atom_data(1,:,i)),i));
fprintf(fid,'\n');
if j ~= Natoms
if atom_data(id(j,1,i),2,i) ~= atom_data(id(j+1,1,i),2,i)
atom_change = 1;
aid = aid+1;
end
end
end
fclose(fid);
end
if autolog_status == 1
flog = fopen([filename '_lmp2cfg.log'],'w+');
fprintf(flog,'----------------------------------------------------------\n');
fprintf(flog,['LAMMPS DUMP to CFG file conversion :\t' datestr(now) '\n']);
fprintf(flog,'----------------------------------------------------------\n');
fprintf(flog,'LAMMPS Dump file : \t %s \n\n',dumpfilename);
for i = 1 : 1 : nfiles
fprintf(flog,'Timestep : %d --> \t\t %s \n',timestep(i),name{i});
end
fclose(flog);
end
%---------- Function to calculate beta
function b = beta(angle,axes)
switch axes
case 'X' % X axes
b = [1 0 0
0 cos(angle) sin(angle)
0 -sin(angle) cos(angle)];
case 'Y' % Y axes
b = [cos(angle) 0 sin(angle)
0 1 0
-sin(angle) 0 cos(angle)];
case 'Z' % Z axes
b = [cos(angle) sin(angle) 0
-sin(angle) cos(angle) 0
0 0 1];
end
end
% --------------------------------------------------
end % For main function

166
tools/matlab/readEAM.m Normal file
View File

@ -0,0 +1,166 @@
function varargout = readEAM(varargin)
% Function to read EAM potential files
% Input
% 1: EAM potential file name
% 2: file type --> 'FUNCFL' for single element file
% --> 'SETFL' for multiple element file
% Output : Structure with members
% .embed : Embedding function
% .pair : Pair Potential
% .elecden : Electron Density
% .nrho : Number of points for electron density
% .drho : increment of r for electron density
% .nr : Number of points for pair potential
% .dr : increment of r for pair potential
% .rcut : cut-off distance
% All output is in exactly the same units as in the EAM file. For
% multielement SETFL files the members are multidimensional arrays with
% each element data stored in (:,:,ELEM)
%
% Example
% eam = readEAM('cuu3.eam','funcfl');
%
% Author : Arun K. Subramaniyan
% sarunkarthi@gmail.com
% http://web.ics.purdue.edu/~asubrama/pages/Research_Main.htm
% School of Aeronautics and Astronautics
% Purdue University, West Lafayette, IN - 47907, USA.
if length(varargin) < 2
error('Too few input parameters : Need Filename and filetype');
elseif length(varargin) > 2
error('Too many input parameters');
end
filename = varargin{1};
type = varargin{2};
try
fid = fopen(filename,'r');
catch
error('EAM file not found!');
end
if strcmpi(type,'FUNCFL')
t = 1;
elseif strcmpi(type,'SETFL')
t = 2;
else
error(['Unknown file type : "' type '"']);
end
switch t
case 1 %FUNCFL
% Read line 1 : comment line
a = fgetl(fid);
% read Line 2
rem = fgetl(fid); % ielem amass blat lat
[ielem,rem] = strtok(rem);
[amass,rem] = strtok(rem);
[blat,rem] = strtok(rem);
[lat,rem] = strtok(rem);
ielem = str2num(ielem); % Atomic Number
amass = str2num(amass); % Atomic Mass
blat = str2num(blat); % Lattice Constant
% Read Line 3
a = str2num(fgetl(fid));
nrho = a(1);
drho = a(2);
nr = a(3);
dr = a(4);
rcut = a(5);
% Reading embedding function
for i = 1 : 1 : nrho/5
embed(i,:) = str2num(fgetl(fid));
end
% Reading pair potential
for i = 1 : 1 : nr/5
pair(i,:) = str2num(fgetl(fid));
end
% Reading electron density function
for i = 1 : 1 : nr/5
elecden(i,:) = str2num(fgetl(fid));
end
% Output
out.embed = embed;
out.pair = pair;
out.elecden = elecden;
out.nrho = nrho;
out.drho = drho;
out.nr = nr;
out.dr = dr;
out.rcut = rcut;
varargout{1} = out;
% --------------------------------------------------------------------
case 2 % SETFL
% Read lines 1 - 3 : comment lines
a = fgetl(fid);
a = fgetl(fid);
a = fgetl(fid);
% Atom types
ntypes = str2num(fgetl(fid));
% Read Global information
a = str2num(fgetl(fid));
nrho = a(1);
drho = a(2);
nr = a(3);
dr = a(4);
rcut = a(5);
% Read element specific Data
% Embedding function and Electron Density
for elem = 1 : 1 : ntypes
rem = fgetl(fid); % ielem amass blat lat
[ielem1,rem] = strtok(rem);
[amass1,rem] = strtok(rem);
[blat1,rem] = strtok(rem);
[lat1,rem] = strtok(rem);
ielem(elem) = str2num(ielem1); % Atomic Number
amass(elem) = str2num(amass1); % Atomic Mass
blat(elem) = str2num(blat1); % Lattice Constant
lat(elem,:) = lat1; % Lattice type
% Reading embedding function
for i = 1 : 1 : nrho/5
embed(i,:,elem) = str2num(fgetl(fid));
end
% Reading electron density function
for i = 1 : 1 : nr/5
elecden(i,:,elem) = str2num(fgetl(fid));
end
end
% Pair Potentials
n_pair = ntypes + (factorial(ntypes)/2);
for np = 1 : 1 : n_pair
for i = 1 : 1 : nr/5
pair(i,:,np) = str2num(fgetl(fid));
end
end
% Output
out.embed = embed;
out.elecden = elecden;
out.pair = pair;
out.nrho = nrho;
out.drho = drho;
out.nr = nr;
out.dr = dr;
out.rcut = rcut;
varargout{1} = out;
end

View File

@ -0,0 +1 @@
function [varargout] = readdump_all(varargin)

120
tools/matlab/readdump_one.m Normal file
View File

@ -0,0 +1,120 @@
function [varargout] = readdump_one(varargin)
% Read LAMMPS dump file one timestep at a time
% Input
% Dump file name with path
% Starting file pointer position in dump file
% Number of columns in the dump file
% Output is in the form of a structure with following variables
% .timestep --> Vector containing all time steps
% .Natoms --> Vector containing number of atoms at each time step
% .x_bound --> [t,2] array with xlo,xhi at each time step
% .y_bound --> [t,2] array with ylo,yhi at each time step
% .z_bound --> [t,2] array with zlo,zhi at each time step
% .atom_data --> 2 dimensional array with data
% .position --> file pointer for reading next time
%
% Example
% data = readdump_one('dump.LAMMPS',0,5);
% Reads the first timestep in the file dump.LAMMPS
% Specify position = -1 if only the last dump step in the
% file is needed
%
% See also readdump, scandump
%
% Author : Arun K. Subramaniyan
% sarunkarthi@gmail.com
% http://web.ics.purdue.edu/~asubrama/pages/Research_Main.htm
% School of Aeronautics and Astronautics
% Purdue University, West Lafayette, IN - 47907, USA.
try
dump = fopen(varargin{1},'r');
catch
error('Dumpfile not found!');
end
position = varargin{2}; % from beg of file
ncol = varargin{3}; %number of columns
i=1;
t=0;
done = 0;
last_status = 0;
if position ~= -1
fseek(dump,position,'bof');
else
last_status = 1;
end
while done == 0 & last_status == 0
id = fgetl(dump);
switch id
case 'ITEM: TIMESTEP'
if t == 0
timestep(i) = str2num(fgetl(dump));
t=1;
end
case 'ITEM: NUMBER OF ATOMS'
Natoms = str2num(fgetl(dump));
case 'ITEM: BOX BOUNDS'
x_bound(1,:) = str2num(fgetl(dump));
y_bound(1,:) = str2num(fgetl(dump));
z_bound(1,:) = str2num(fgetl(dump));
case 'ITEM: ATOMS'
atom_data = zeros(Natoms,ncol);%Allocate memory for atom data
for j = 1 : 1: Natoms
atom_data(j,:) = str2num(fgetl(dump));
end
done = 1;
p = ftell(dump);
end
end
% Getting only the last step
if last_status == 1
% First get the position of the beginning of the last step in the
% dumpfile
while ~feof(dump)
temp = fgetl(dump);
if length(temp) == 14
if strcmpi(temp,'ITEM: TIMESTEP')
p = ftell(dump); % starting position of line next to the header
end
end
end
fclose(dump);
dump = fopen(varargin{1},'r');
fseek(dump,p,'bof');
% getting Timestep
timestep = str2num(fgetl(dump));
while ~feof(dump)
id = fgetl(dump);
switch id
case 'ITEM: NUMBER OF ATOMS'
Natoms = str2num(fgetl(dump));
case 'ITEM: BOX BOUNDS'
x_bound(1,:) = str2num(fgetl(dump));
y_bound(1,:) = str2num(fgetl(dump));
z_bound(1,:) = str2num(fgetl(dump));
case 'ITEM: ATOMS'
atom_data = zeros(Natoms,ncol);%Allocate memory for atom data
for j = 1 : 1: Natoms
atom_data(j,:) = str2num(fgetl(dump));
end
end
end
end
%----------Outputs-------------
%OUTPUTS IN SAME VARIABLE STRUCTURE
varargout{1}.timestep = timestep;
varargout{1}.Natoms = Natoms;
varargout{1}.x_bound = x_bound;
varargout{1}.y_bound = y_bound;
varargout{1}.z_bound = z_bound;
varargout{1}.atom_data = atom_data;
varargout{1}.position = p; %gives postion of ITEM: TIMESTEP line
%------------------------------
fclose(dump);

92
tools/matlab/readlog.m Normal file
View File

@ -0,0 +1,92 @@
function [varargout] = readlog(varargin)
% Read LAMMPS log files
% input is log file name with path
% output is a structure --> out
% out.Chead --> has heading of columns in each run
% out.data --> has the data during each run in the form of string
% Type str2num(out.data{i}) to get the numeric array
%
% Example
% logdata = readlog('log.LAMMPS');
%
% Author : sarunkarthi@gmail.com
% http://web.ics.purdue.edu/~asubrama/pages/Research_Main.htm
% Arun K. Subramaniyan
% School of Aeronautics and Astronautics
% Purdue University, West Lafayette, IN - 47907, USA.
logfile = varargin{1};
try
fid = fopen(logfile,'r');
catch
error('Log file not found!');
end
loop = 1;
while feof(fid) == 0
%----------- To get first line of thermo output --------
while feof(fid) == 0
a = fgetl(fid);
if length(a) > 4 && strcmp(a(1:4),'Step')
findstep = 1;
break;
end
end
%-------------------------------------------------------
%---------Seperate column headings----------------------
j=1;
k=1;
Ch='';
i=1;
while i < length(a) && findstep == 1
for i = k : 1 : length(a)
if strcmp(a(i),' ')
Chead{loop,j} = Ch;
clear Ch;
Ch = '';
k=i+1;
j=j+1;
break;
else
Ch = [Ch a(i)];
end
end
end
if findstep == 1
Chead{loop,j} = Ch; % to get the last column heading
end
%-------------------------------------------------------
%----------------------Get Data-------------------------
id = 1; %row id...
while feof(fid) == 0
a = fgetl(fid);
if strcmp(a(1:4),'Loop')
loop = loop + 1;
break;
else
logdata(id,:) = str2num(a);
id = id+1;
end
end
%--------------------------------------------------------
if feof(fid) == 0
b = num2str(logdata);
data{loop-1} = b;
clear b;
clear logdata;
findstep = 0;
end
end
fclose(fid);
%--------OUTPUT-------------------------------------------
out.Chead = Chead;
out.data = data;
varargout{1} = out;

142
tools/matlab/readrdf.m Normal file
View File

@ -0,0 +1,142 @@
function varargout = readrdf(varargin)
% Function to read Radial Distribution Funtion output from LAMMPS
% Input
% 'bin' --> number of bins in rdf histogram
% 'runtime' --> Run length of each of the run commands
% 'step' --> rdf Dump step for each of the run commands
% 'ncol' --> number of columns in the file
% 'final' --> 'YES' indicates that only the average values will be extracted
% If only the averages are needed, you don't need to specify 'runtime',
% 'step' and 'ncol'
%
% Output is in the form of a structure with following variables
%
% if 'final' was given as 'NO'
% .rdf_step_data --> Matrix with RDF for each of the dumped steps
% .rdf_ave_data --> Matrix with average RDF for each RUN
% .rdf_ave_data --> Matrix with average RDF for each RUN
%
% if 'final' was given as 'YES'
% .rdf_ave_data --> Matrix with average RDF for each RUN
%
% Example
% rdf = readrdf('inputfile','bin',100,'runtime',[30000;20000],...
% 'step',[100;100],'ncol',3,'final','no')
%
% Author : Arun K. Subramaniyan
% sarunkarthi@gmail.com
% http://web.ics.purdue.edu/~asubrama/pages/Research_Main.htm
% School of Aeronautics and Astronautics
% Purdue University, West Lafayette, IN - 47907, USA.
rdf_name = varargin{1}; % RDF File name
% Setting all status checks to zero
bin_status = 0;
runtime_status = 0;
step_status = 0;
ncol_status = 0;
final_status = 'no';
for id = 2 : 1 : length(varargin)
if strcmpi(varargin{id},'bin')
rdf_bin = varargin{id+1}; % RDF bins
bin_status = 1;
elseif strcmpi(varargin{id},'runtime')
rdf_runtime = varargin{id+1}; % Runtimes
runtime_status = 1;
elseif strcmpi(varargin{id},'step')
rdf_step = varargin{id+1}; % Runtimes
step_status = 1;
elseif strcmpi(varargin{id},'ncol')
ncol = varargin{id+1}; % Runtimes
ncol_status = 1;
elseif strcmpi(varargin{id},'final')
final_status = varargin{id+1};
end
end
if ncol_status == 0
ncol = 3;
end
% Check for errors in input arguments
if bin_status == 0
error('No bin specified');
elseif step_status == 1 && runtime_status == 0
error('Step size specified without Runtime');
elseif step_status == 0 && runtime_status == 1
error('Runtime specified without Step size');
end
if step_status == 1 && runtime_status == 1
if length(rdf_runtime) ~= length(rdf_step)
error('Runtime and Step size do not match');
end
end
% Preallocating memory if runtime and step size are provided
if step_status == 1 && runtime_status == 1 && strcmpi(final_status,'no')
total_steps = round(sum(rdf_runtime./rdf_step));
rdf_step_data = zeros(rdf_bin,ncol,total_steps);
rdf_ave_data = zeros(rdf_bin,ncol,length(rdf_runtime));
elseif strcmpi(final_status,'yes') && step_status == 1 && runtime_status == 1
rdf_ave_data = zeros(rdf_bin,ncol,length(rdf_runtime));
end
try
rdf_file = fopen(rdf_name,'r');
catch
error('RDF file not found!');
end
if strcmpi(final_status,'yes')
run_id = 1; % Run id..
while feof(rdf_file) ~= 1
rdf_data = fgetl(rdf_file);
if strcmpi(rdf_data(1:11),'RUN AVERAGE')
fgetl(rdf_file); % to skip the title
for id = 1 : 1 : rdf_bin
rdf_ave_data(id,:,run_id) = str2num(fgetl(rdf_file));
end
run_id = run_id + 1;
end
end
else
run_id = 1;
id = 1;
while feof(rdf_file) ~= 1
rdf_data = fgetl(rdf_file);
if strcmpi(rdf_data(1:8),'TIMESTEP')
timestep(id,1) = str2num(rdf_data(10:length(rdf_data)));
fgetl(rdf_file); % to skip the title
for j = 1 : 1 : rdf_bin
rdf_step_data(j,:,id) = str2num(fgetl(rdf_file));
end
id = id+1;
elseif strcmpi(rdf_data(1:11),'RUN AVERAGE')
fgetl(rdf_file); % to skip the title
for j = 1 : 1 : rdf_bin
rdf_ave_data(j,:,run_id) = str2num(fgetl(rdf_file));
end
run_id = run_id + 1;
end
end
end
fclose(rdf_file);
if strcmpi(final_status,'no')
out_data.timestep = timestep;
out_data.rdf_step_data = rdf_step_data;
out_data.rdf_ave_data = rdf_ave_data;
else
out_data.rdf_ave_data = rdf_ave_data;
end
varargout{1} = out_data;

57
tools/matlab/scandump.m Normal file
View File

@ -0,0 +1,57 @@
function [varargout] = scandump(varargin)
% Function to scan LAMMPS dump file
% Input is dumpfile name
% Output is a structure with the following members
% .timestep --> column vector with all the timesteps
% .natoms --> column vector with number of atoms in each timestep
% .position --> column vector with position (for input into readdump)
% .ncol --> column vector with number of columns
% .boxbound --> 3 by 3 by N (number of time steps) 3D array with
% [xlo xhi
% ylo yhi
% zlo zhi];
% Example
% dump = scandump('dump.LAMMPS');
%
% See also readdump_one, scandump
%
% Author : Arun K. Subramaniyan
% sarunkarthi@gmail.com
% http://web.ics.purdue.edu/~asubrama/pages/Research_Main.htm
% School of Aeronautics and Astronautics
% Purdue University, West Lafayette, IN - 47907, USA.
try
dump = fopen(varargin{1},'r');
catch
error('Dumpfile not found!');
end
i = 1;
out.position(i,1) = 0;
while ~feof(dump)
id = fgetl(dump);
switch id
case 'ITEM: TIMESTEP'
out.timestep(i,1) = str2num(fgetl(dump));
case 'ITEM: NUMBER OF ATOMS'
out.Natoms(i,1) = str2num(fgetl(dump));
case 'ITEM: BOX BOUNDS'
out.boxbound(1,:,i) = str2num(fgetl(dump));
out.boxbound(2,:,i) = str2num(fgetl(dump));
out.boxbound(3,:,i) = str2num(fgetl(dump));
case 'ITEM: ATOMS'
t = str2num(fgetl(dump));
out.ncol(i,1) = length(t);
for j = 2 : 1 : out.Natoms(i,1)
fgetl(dump);
end
out.position(i+1,1) = ftell(dump);
i = i+1;
end
end
% Output
varargout{1} = out;