分子动力学基本分析-数密度二维云图及一维分布计算

关注 M r . m a t e r i a l   , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 多 \color{blue}{多} 精 \color{orange}{精} 彩 \color{green}{彩}


主要专栏内容包括:
  †《LAMMPS小技巧》: ‾ \textbf{ \underline{\dag《LAMMPS小技巧》:}}  LAMMPS小技巧》: 主要介绍采用分子动力学( L a m m p s Lammps Lammps)模拟相关安装教程、原理以及模拟小技巧(难度: ★ \bigstar
  ††《LAMMPS实例教程—In文件详解》: ‾ \textbf{ \underline{\dag\dag《LAMMPS实例教程—In文件详解》:}}  ††LAMMPS实例教程—In文件详解》: 主要介绍采用分子动力学( L a m m p s Lammps Lammps)模拟相关物理过程模拟。(包含:热导率计算、定压比热容计算,难度: ★ \bigstar ★ \bigstar ★ \bigstar
  †††《Lammps编程技巧及后处理程序技巧》: ‾ \textbf{ \underline{\dag\dag\dag《Lammps编程技巧及后处理程序技巧》:}}  †††Lammps编程技巧及后处理程序技巧》: 主要介绍针对分子模拟的动力学过程(轨迹文件)进行后相关的处理分析(需要一定编程能力。难度: ★ \bigstar ★ \bigstar ★ \bigstar ★ \bigstar ★ \bigstar )。
  ††††《分子动力学后处理集成函数—Matlab》: ‾ \textbf{ \underline{\dag\dag\dag\dag《分子动力学后处理集成函数—Matlab》:}}  ††††《分子动力学后处理集成函数—Matlab》: 主要介绍针对后处理过程中指定函数,进行包装,方便使用者直接调用(需要一定编程能力,难度: ★ \bigstar ★ \bigstar ★ \bigstar ★ \bigstar )。
  †††††《SCI论文绘图—Python绘图常用模板及技巧》: ‾ \textbf{ \underline{\dag\dag\dag\dag\dag《SCI论文绘图—Python绘图常用模板及技巧》:}}  †††††SCI论文绘图—Python绘图常用模板及技巧》: 主要介绍针对处理后的数据可视化,并提供对应的绘图模板(需要一定编程能力,难度: ★ \bigstar ★ \bigstar ★ \bigstar ★ \bigstar )。
  ††††††《分子模拟—Ovito渲染案例教程》: ‾ \textbf{ \underline{\dag\dag\dag\dag\dag\dag《分子模拟—Ovito渲染案例教程》:}}  ††††††《分子模拟—Ovito渲染案例教程》: 主要采用 O v i t o \rm Ovito Ovito软件,对 L a m m p s \rm Lammps Lammps 生成的轨迹文件进行渲染(难度: ★ \bigstar ★ \bigstar )。

  专栏说明(订阅后可浏览对应专栏全部博文): ‾ \color{red}{\textbf{ \underline{专栏说明(订阅后可浏览对应专栏全部博文):}}}  专栏说明(订阅后可浏览对应专栏全部博文):
注意: \color{red} 注意: 注意:如需只订阅某个单独博文,请联系博主邮箱咨询。 l a m m p s _ m a t e r i a l s @ 163. c o m \rm lammps\_materials@163.com lammps_materials@163.com

♠ \spadesuit † \dag 开源后处理集成程序:请关注专栏《LAMMPS后处理——MATLAB子函数合集整理》
♠ \spadesuit † \dag † \dag 需要付费定制后处理程序请邮件联系: l a m m p s _ m a t e r i a l s @ 163. c o m \rm lammps\_materials@163.com lammps_materials@163.com


请添加图片描述
请添加图片描述

一、数密度计算思路

数密度可以定义为:原子的数量/所在空间的体积,单位为 A ˚ − 3 \rm \AA^{-3} A˚3

根据上面的分析可以看出,计算流程为:

1)对体系进行划分;

针对一维数密度分布的计算,需要沿着该方向进行划分,统计原子数量,冰并除以对应的空间体积。

针对二维数密度分布的计算,需要先将三维空间划分为二维空间,统计每一个格子内原子的数量,并除以体积。

2)计算统计划分后的空间内原子数量;

二、读取dump轨迹文件获得坐标

注意:请按照: I D   T Y P E   X   Y   Z  的顺序在 l a m m p s 中输出 d u m p \rm \color{red} 注意:请按照:ID\ TYPE\ X\ Y\ Z\ 的顺序在lammps中输出dump 注意:请按照:ID TYPE X Y Z 的顺序在lammps中输出dump

clc;clear;
% 这里写出需要读取的dump文件及路径
file ="test.dump";
%========================================%
%  这里开始读dump文件,这里不用修改程序! %
%========================================%

t_start_all = cputime;
try
    dump = fopen(file,'r');
catch
    error('Dumpfile not found!');
end

i=1;
while feof(dump) == 0
    id = fgetl(dump);
     if (strncmpi(id,'ITEM: TIMESTEP',numel('ITEM: TIMESTEP')))
            timestep(i) = str2num(fgetl(dump));
    else
     if (strncmpi(id,'ITEM: NUMBER OF ATOMS',numel('ITEM: NUMBER OF ATOMS')))
            Natoms(i) = str2num(fgetl(dump));
     else
      if (strncmpi(id,'ITEM: BOX BOUNDS',numel('ITEM: BOX BOUNDS')))
            x_bound(i,:) = str2num(fgetl(dump));
            y_bound(i,:) = str2num(fgetl(dump));
            z_bound(i,:) = str2num(fgetl(dump));
      else
       if (strcmpi(id(1:11),'ITEM: ATOMS'))
            for j = 1 : 1: Natoms
                atom_data(j,:,i) = str2num(fgetl(dump));
            end
            i=i+1;
       end
      end 
     end
   end
end
t_start_stop = (cputime-t_start_all)/60;

fprintf('Now the used time is: %.1f mins.\n',t_start_stop);
disp("-------------------");
disp("----ALL DONE!!!----");
disp("-------------------");
%========================================%

三、数密度一维分布统计

将原子按三个方向划分,依次统计每个空间内的原子数量。

%------------------------------------------------%          
            if((XYZ(i,1)>(block-1)*(xl/bin_num)) && (XYZ(i,1)<=block*(xl/bin_num)))
                  
                DEN_bins_x(block,frame)=((DEN_bins_x(block,frame)+1));  

            end     
% XYZ(i,2) y方向           
%------------------------------------------------%            
            if((XYZ(i,2)>(block-1)*(yl/bin_num)) && (XYZ(i,2)<=block*(yl/bin_num)))
                  
                DEN_bins_y(block,frame)=((DEN_bins_y(block,frame)+1));  

            end  
% XYZ(i,3) z方向            
%------------------------------------------------%            
            if((XYZ(i,3)>(block-1)*(zl/bin_num)) && (XYZ(i,3)<=block*(zl/bin_num)))
                  
                DEN_bins_z(block,frame)=((DEN_bins_z(block,frame)+1));  

            end  

四、数密度二维分布统计

将体系划分为二维空间,根据原子距离模拟体系边界的位置统计个数

                if(1)   
                    
                    x_n = floor((XYZ(i,1)-x_bound(1,1))/bin_ALL_mesh_xsize)+1;
                    y_n = floor((XYZ(i,2)-x_bound(1,1))/bin_ALL_mesh_ysize)+1;                    
                    z_n = floor((XYZ(i,3)-z_bound(1,1))/bin_ALL_mesh_zsize)+1;          
                    
                    if(x_n<=0)
                       x_n=1;
                    elseif(x_n>=bin_ALL_mesh)
                        x_n=bin_ALL_mesh;
                    end
                    
                    if(y_n<=0)
                       y_n=1;
                    elseif(y_n>=bin_ALL_mesh)
                        y_n=bin_ALL_mesh;
                    end          
                    
                    if(z_n<=0)
                       z_n=1;
                    elseif(z_n>=bin_ALL_mesh)
                       z_n=bin_ALL_mesh;   
                    end
                    
                     DEN_mesh_xy(x_n,y_n)=(DEN_mesh_xy(x_n,y_n)+1);
                     DEN_mesh_yz(y_n,z_n)=(DEN_mesh_yz(y_n,z_n)+1);
                     DEN_mesh_xz(x_n,z_n)=(DEN_mesh_xz(x_n,z_n)+1);
                end

五、MATLAB绘图

  
    drawnow;
    
    x_real_length = ((1:length(DEN_bins_x)).*xl./bin_num)';
    y_real_length = ((1:length(DEN_bins_y)).*yl./bin_num)';
    z_real_length = ((1:length(DEN_bins_z)).*zl./bin_num)';
    %------------------------------------------------%  
    set(gcf, 'Position', [300 200 1500 800]); % gcf 获取当前figure的句柄

    subplot(2,3,1);  box on;hold on;
    title(strcat("frame: ",num2str(frame)));
    plot(x_real_length,(DEN_bins_x(:,frame)./bin_size./yl./zl),"ko-");
    xlim([0,max(x_real_length)]);
    xlabel('Length /Å','fontsize',20);
    ylabel('Density /Å^-3','fontsize',20);
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('Along X-axis','Location','southEast');        
    %------------------------------------------------%  
    set(gcf, 'Position', [300 200 1500 800]); % gcf 获取当前figure的句柄    
    subplot(2,3,2);  box on;hold on;
    plot(y_real_length,DEN_bins_y(:,frame)./bin_size./xl./zl,"r^-");
    xlim([0,max(x_real_length)]);
    xlabel('Length /Å','fontsize',20);
    ylabel('Density /Å^-3','fontsize',20);
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('Along Y-axis','Location','southEast');        
    %------------------------------------------------%  
    subplot(2,3,3);  box on;hold on;
    plot(z_real_length,DEN_bins_z(:,frame)./bin_size./xl./yl,"b*-");
    xlim([0,max(x_real_length)]);
    xlabel('Length /Å','fontsize',20);
    ylabel('Density /Å^-3','fontsize',20);
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('Along Z-axis','Location','southEast');
    %------------------------------------------------%  
    
    subplot(2,3,4);   box on;hold on;
    surf(DEN_mesh_xz./bin_ALL_mesh_xsize./bin_ALL_mesh_zsize./yl);
    shading interp;
    xlabel('Bin number','fontsize',20);
    ylabel('Bin number','fontsize',20);
    zlabel('Bin number','fontsize',20);
    
    
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('X-Z','Location','southEast');
    %------------------------------------------------%      
    subplot(2,3,5);  box on;hold on;
    surf(DEN_mesh_xy./bin_ALL_mesh_xsize./bin_ALL_mesh_ysize./zl);
    shading interp;
    
    xlabel('Bin number','fontsize',20);
    ylabel('Bin number','fontsize',20);
    zlabel('Bin number','fontsize',20);
    
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('X-Y','Location','southEast');
    %------------------------------------------------%  
    
    subplot(2,3,6);  box on;hold on;
    surf(DEN_mesh_yz./bin_ALL_mesh_ysize./bin_ALL_mesh_zsize./xl);
    shading interp;    
    
    
    xlabel('Bin number','fontsize',20);
    ylabel('Bin number','fontsize',20);
    zlabel('Bin number','fontsize',20);
    
    
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('Y-Z','Location','southEast');
    %------------------------------------------------%  

六、 全部代码

clc;clear;
% 这里写出需要读取的dump文件及路径
file ="test.dump";
%========================================%
%  这里开始读dump文件,这里不用修改程序! %
%========================================%

t_start_all = cputime;
try
    dump = fopen(file,'r');
catch
    error('Dumpfile not found!');
end

i=1;
while feof(dump) == 0
    id = fgetl(dump);
     if (strncmpi(id,'ITEM: TIMESTEP',numel('ITEM: TIMESTEP')))
            timestep(i) = str2num(fgetl(dump));
    else
     if (strncmpi(id,'ITEM: NUMBER OF ATOMS',numel('ITEM: NUMBER OF ATOMS')))
            Natoms(i) = str2num(fgetl(dump));
     else
      if (strncmpi(id,'ITEM: BOX BOUNDS',numel('ITEM: BOX BOUNDS')))
            x_bound(i,:) = str2num(fgetl(dump));
            y_bound(i,:) = str2num(fgetl(dump));
            z_bound(i,:) = str2num(fgetl(dump));
      else
       if (strcmpi(id(1:11),'ITEM: ATOMS'))
            for j = 1 : 1: Natoms
                atom_data(j,:,i) = str2num(fgetl(dump));
            end
            i=i+1;
       end
      end 
     end
   end
end
t_start_stop = (cputime-t_start_all)/60;

fprintf('Now the used time is: %.1f mins.\n',t_start_stop);
disp("-------------------");
disp("----ALL DONE!!!----");
disp("-------------------");
%========================================%

% 请修改这里!
bin_num   = 100;        % 将体系划分block,计算沿着某一方向的密度分布(一维)

%%----------------------------------------------%%

bin_ALL_mesh = 100;   % 将体系划分block,计算沿着某一方向的密度分布(二维)
%%----------------------------------------------%%

%(不用修改)
all_frame = size(atom_data,3);  % 全部需要计算的帧
%------------------------------------------------% 
DEN_mesh_xz = zeros(bin_ALL_mesh,bin_ALL_mesh);%
DEN_mesh_xy= zeros(bin_ALL_mesh,bin_ALL_mesh);%
DEN_mesh_yz = zeros(bin_ALL_mesh,bin_ALL_mesh);%


DEN_bins_x = zeros(bin_num,all_frame);
DEN_bins_y = zeros(bin_num,all_frame);
DEN_bins_z = zeros(bin_num,all_frame);
Block_Size_bins = zeros(all_frame,1);

%%----------------------------------------------%%
number_check = zeros(bin_num,all_frame);
%%----------------------------------------------%%

Nlocal = Natoms(1,1);
t_all_start=cputime;

for frame = 1:all_frame

    
%计算盒子大小(不用修改)
%------------------------------------------------% 
xl = x_bound(1,2)-x_bound(1,1);
yl = y_bound(1,2)-y_bound(1,1);
zl = z_bound(1,2)-z_bound(1,1);
%------------------------------------------------% 

%------------------------------------------------% 
    t_start = cputime;
    if(rem(frame,50)==0)
        disp('%------------------------------------------------%');
        fprintf('Now the frame %d is completed!\n',frame);
    end
%------------------------------------------------%    
% ITEM: id type x y z 
    now_frame = atom_data(:,:,frame);
    ID     = now_frame(:,1);
    TYPE   = now_frame(:,2);
    XYZ    = now_frame(:,3:5);
    %xl,yl,zl
%%----------------------------------------------%%
%%----------------------------------------------%%

bin_size  = xl/bin_num; % 

Block_Size_bins(frame) =bin_size;

bin_ALL_mesh_xsize = xl/bin_ALL_mesh;      % 能量/动能/势能-在x_bin格子大小
bin_ALL_mesh_ysize = yl/bin_ALL_mesh;      % 能量/动能/势能-在x_bin格子大小
bin_ALL_mesh_zsize = zl/bin_ALL_mesh;      % 能量/动能/势能-在z_bin格子大小

%%----------------------------------------------%% 
  for block = 1:bin_num   
      number_bin=0;
      for i = 1:Nlocal
%------------------------------------------------%
%------------------------------------------------%

          if((block==1))
%mesh temp of each atom in bin
                if(1)   
                    
                    x_n = floor((XYZ(i,1)-x_bound(1,1))/bin_ALL_mesh_xsize)+1;
                    y_n = floor((XYZ(i,2)-x_bound(1,1))/bin_ALL_mesh_ysize)+1;                    
                    z_n = floor((XYZ(i,3)-z_bound(1,1))/bin_ALL_mesh_zsize)+1;          
                    
                    if(x_n<=0)
                       x_n=1;
                    elseif(x_n>=bin_ALL_mesh)
                        x_n=bin_ALL_mesh;
                    end
                    
                    if(y_n<=0)
                       y_n=1;
                    elseif(y_n>=bin_ALL_mesh)
                        y_n=bin_ALL_mesh;
                    end          
                    
                    if(z_n<=0)
                       z_n=1;
                    elseif(z_n>=bin_ALL_mesh)
                       z_n=bin_ALL_mesh;   
                    end
                    
                     DEN_mesh_xy(x_n,y_n)=(DEN_mesh_xy(x_n,y_n)+1);
                     DEN_mesh_yz(y_n,z_n)=(DEN_mesh_yz(y_n,z_n)+1);
                     DEN_mesh_xz(x_n,z_n)=(DEN_mesh_xz(x_n,z_n)+1);
                end
          end %select atom
          
% here is to claculate density of all blocks

% XYZ(i,1) x方向
%------------------------------------------------%          
            if((XYZ(i,1)>(block-1)*(xl/bin_num)) && (XYZ(i,1)<=block*(xl/bin_num)))
                  
                DEN_bins_x(block,frame)=((DEN_bins_x(block,frame)+1));  

            end     
% XYZ(i,2) y方向           
%------------------------------------------------%            
            if((XYZ(i,2)>(block-1)*(yl/bin_num)) && (XYZ(i,2)<=block*(yl/bin_num)))
                  
                DEN_bins_y(block,frame)=((DEN_bins_y(block,frame)+1));  

            end  
% XYZ(i,3) z方向            
%------------------------------------------------%            
            if((XYZ(i,3)>(block-1)*(zl/bin_num)) && (XYZ(i,3)<=block*(zl/bin_num)))
                  
                DEN_bins_z(block,frame)=((DEN_bins_z(block,frame)+1));  

            end     

%------------------------------------------------%            
      end % loop all atom
  end 
  
    drawnow;
    
    x_real_length = ((1:length(DEN_bins_x)).*xl./bin_num)';
    y_real_length = ((1:length(DEN_bins_y)).*yl./bin_num)';
    z_real_length = ((1:length(DEN_bins_z)).*zl./bin_num)';
    %------------------------------------------------%  
    set(gcf, 'Position', [300 200 1500 800]); % gcf 获取当前figure的句柄

    subplot(2,3,1);  box on;hold on;
    title(strcat("frame: ",num2str(frame)));
    plot(x_real_length,(DEN_bins_x(:,frame)./bin_size./yl./zl),"ko-");
    xlim([0,max(x_real_length)]);
    xlabel('Length /Å','fontsize',20);
    ylabel('Density /Å^-3','fontsize',20);
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('Along X-axis','Location','southEast');        
    %------------------------------------------------%  
    set(gcf, 'Position', [300 200 1500 800]); % gcf 获取当前figure的句柄    
    subplot(2,3,2);  box on;hold on;
    plot(y_real_length,DEN_bins_y(:,frame)./bin_size./xl./zl,"r^-");
    xlim([0,max(x_real_length)]);
    xlabel('Length /Å','fontsize',20);
    ylabel('Density /Å^-3','fontsize',20);
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('Along Y-axis','Location','southEast');        
    %------------------------------------------------%  
    subplot(2,3,3);  box on;hold on;
    plot(z_real_length,DEN_bins_z(:,frame)./bin_size./xl./yl,"b*-");
    xlim([0,max(x_real_length)]);
    xlabel('Length /Å','fontsize',20);
    ylabel('Density /Å^-3','fontsize',20);
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('Along Z-axis','Location','southEast');
    %------------------------------------------------%  
    
    subplot(2,3,4);   box on;hold on;
    surf(DEN_mesh_xz./bin_ALL_mesh_xsize./bin_ALL_mesh_zsize./yl);
    shading interp;
    xlabel('Bin number','fontsize',20);
    ylabel('Bin number','fontsize',20);
    zlabel('Bin number','fontsize',20);
    
    
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('X-Z','Location','southEast');
    %------------------------------------------------%      
    subplot(2,3,5);  box on;hold on;
    surf(DEN_mesh_xy./bin_ALL_mesh_xsize./bin_ALL_mesh_ysize./zl);
    shading interp;
    
    xlabel('Bin number','fontsize',20);
    ylabel('Bin number','fontsize',20);
    zlabel('Bin number','fontsize',20);
    
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('X-Y','Location','southEast');
    %------------------------------------------------%  
    
    subplot(2,3,6);  box on;hold on;
    surf(DEN_mesh_yz./bin_ALL_mesh_ysize./bin_ALL_mesh_zsize./xl);
    shading interp;    
    
    
    xlabel('Bin number','fontsize',20);
    ylabel('Bin number','fontsize',20);
    zlabel('Bin number','fontsize',20);
    
    
    set(gca,'fontsize',20,'linewidth',1.5);
    legend ('Y-Z','Location','southEast');
    %------------------------------------------------%  

    
end

%----------------------------------------------%
%                  计算一维分布
%----------------------------------------------%
DEN_bins_x = DEN_bins_x./bin_size./yl./zl;
DEN_bins_y = DEN_bins_y./bin_size./xl./zl;
DEN_bins_z = DEN_bins_z./bin_size./xl./yl;

DEN_bins_x_ave = sum(DEN_bins_x,2)./all_frame;
DEN_bins_y_ave = sum(DEN_bins_y,2)./all_frame;
DEN_bins_z_ave = sum(DEN_bins_z,2)./all_frame;

%----------------------------------------------%
%                  计算二维分布
%----------------------------------------------%
% 注意这里计算的是X-Z平面上的投影,因此,计算数密度的时候需要除以yl
DEN_mesh_xz_ave =DEN_mesh_xz./bin_ALL_mesh_xsize./bin_ALL_mesh_zsize./yl./all_frame;

%计算数密度的时候需要除以zl
DEN_mesh_xy_ave =DEN_mesh_xy./bin_ALL_mesh_xsize./bin_ALL_mesh_ysize./zl./all_frame;

%计算数密度的时候需要除以xl
DEN_mesh_yz_ave =DEN_mesh_yz./bin_ALL_mesh_ysize./bin_ALL_mesh_zsize./xl./all_frame;
%----------------------------------------------%

disp("-------------------");
disp("----Finished!!!----");
disp("-------------------");

七、代码下载

链接: https://pan.baidu.com/s/1QXdCguI77sotfZNs9Eilvg?pwd=mshp
提取码: mshp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr. Material

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值