forked from lijiext/lammps
255 lines
8.5 KiB
Matlab
255 lines
8.5 KiB
Matlab
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 = atom_data(id(1,1,i),2,i);
|
|
% 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 = atom_data(id(j+1,1,i),2,i);
|
|
% 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
|
|
|
|
|