【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计

       在这一部分,我们开始理解DDSCAT程序设计中的一些参数问题。

       承接第二部分内容中的ddscat.par文件,我们来聊一聊偶极子、实际体积、有效半径等关键词。

 

一、偶极子点阵

       【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计_第1张图片

       手册中说,我们需要设计模型(target/目标),它是有偶极子点阵组成的。偶极子,顾名思义,是由一对电荷组成的,但我们不用设计一对,我们设计一个点就行,一个点就代表一对。我们后面说的偶极子点,就代表一对偶极子。

       对于第二部分,我们设计的block模型,我们给'RCTGLPRSM'设定了一组参数,16 32 32,这表示这个模型是由分布在x,y,z轴上总共16*32*32=16384个偶极子点组成的。

       【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计_第2张图片

       当我们ddscat.exe运行完程序之后,会有一个target.out文件产生,其中记录了每个偶极子点的坐标位置(IX, IY, IZ)。

       【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计_第3张图片

       然后,我们来给大家一个图,将这种偶极子点阵直观表示出来。

       【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计_第4张图片

       16 32 32模型的偶极子点数太多了,我们这里就设计一个4 8 8的模型。

 

二、实际体积和有效半径

       下面我们来聊一下ddscat.par中的有效半径aeff(Effective Radii (micron))这个参数。

       【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计_第5张图片

       在DDSCAT的设计中,我们需要知道自己的模型的实际大小,不论是什么形状的模型,程序都会将他等体积地转换为一个球体来得出一个有效半径来进行后续计算。

       那么上面公式中的V就是我们已知自己模型的实际体积,一般自己都可以通过计算得出。比如,你做了一个纳米球,根据从TEM或者SEM图中测得的半径,就可计算出其体积。然后根据公式(4),计算出模型的有效半径。

       这个公式是不是看起来很熟悉,没错,就是球体体积计算公式的反推。他与 V=4πR^3/3 刚好是相逆的。

       

       我们在来看d这个参数,它代表的是相邻偶极子点之间的距离。因为N代表的是偶极子总数,所以,d代表偶极子点之间的距离你应该很好理解吧。很好想到,当V不变时,d越小(即N越大),那么我们模拟的模型精度就越低,d越大(即N越小),则计算速度会降低。

       【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计_第6张图片

       在实际操作中,我们一般不需要在ddscat.par中去设定d这个参数,我们需要设定的是aeff有效半径这个参数,V已知,aeff自然可以简单算出。而d这个参数,DDSCAT会帮你计算出来,在一些结果文件中有所记录。

 

三、使用Matlab自行设计shape.dat文件

       理解了实际体积和有效半径,我们接下来学习如何自己设计模型,而不在只是使用软件里面自带的模型。我们通过一个经典的核壳纳米球模型的设计来开始。

       对于球形模型的设计,思路很简单,循环遍历N个点,将距离球心距离小于等我我们需要的半径的点筛选出来就行。

       在这里,给大家准备了两种形式的Matlab代码,分别是脚本和函数的形式。

       1)脚本形式的核壳纳米球shape.dat文件生成代码

%**************************************************************************
% 希望此代码能帮助各位学习DDSCAT的网友更近一步
% Author:XD_Yangf
% Date:2019-04-23
%**************************************************************************
clear;
clc;
%**************************************************************************

d=0.001; %设定d值,代表偶极子间的间距

r=0.024; % 纳米球的半径

% 设定纳米球的中心点位置
x_c=0; 
y_c=0;
z_c=0;

%**************************************************************************

v=4*pi*(r^3)/3; % 计算实际纳米球的体积
aeff=(v*3/4/pi)^(1/3); % 计算纳米球的有效半径

% 偶极子点的起止坐标范围,用于for循环
nXmin=-round(r/d);
nXmax=round(r/d);
nYmin=-round(r/d);
nYmax=round(r/d);
nZmin=-round(r/d);
nZmax=round(r/d);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nat=0; % 记录偶极子个数

for jz=nZmin:nZmax  
    for jy=nYmin:nYmax
        for jx=nXmin:nXmax
           
           x=jx*d; % 当前点以纳米球实际尺寸来计算,精度更高
           y=jy*d;
           z=jz*d;
           
           distance_2=(x-x_c)^2+(y-y_c)^2+(z-z_c)^2;
           distance=distance_2^0.5; % 当前点距离中心点的距离
           
           % 距离小于0.013时,该点的ICOMP(x,y,z)值设为 1 1 1,作为核部分
           % 需要多大半径可自行设定
           if distance<0.013 
                nat=nat+1;
                ixyz(nat,1)=jx;
                ixyz(nat,2)=jy;
                ixyz(nat,3)=jz;
                ixyz(nat,4)=1;
                ixyz(nat,5)=1;
                ixyz(nat,6)=1;
           end
           % 需要多大半径可自行设定
           % 距离大于0.012小于0.025时,该点的ICOMP(x,y,z)值设为 2 2 2,作为壳部分
           if (0.013<=distance)&&(distance<0.025)
                nat=nat+1;
                ixyz(nat,1)=jx;
                ixyz(nat,2)=jy;
                ixyz(nat,3)=jz;
                ixyz(nat,4)=2;
                ixyz(nat,5)=2;
                ixyz(nat,6)=2;
           end
           
        end
    end
end 
%**************************************************************************
% 取消注释,可以以散点图的形式显示偶极子分布
% xPlot=ixyz(:,1);
% yPlot=ixyz(:,2);
% zPlot=ixyz(:,3);
% 
% scatter3(xPlot,yPlot,zPlot);
%**************************************************************************

% 写操作,输出shape.dat文件
shape=fopen('shape_CSDN.dat','w');
fprintf(shape,'>TARREC   rectangular prism; AX,AY,AZ= 16.0000 32.0000 32.0000\n');
fprintf(shape,'     ');     
fprintf(shape,'%i', nat);
fprintf(shape,' = NAT\n');
fprintf(shape,'  1.000000  0.000000  0.000000 = A_1 vector\n');
fprintf(shape,'  0.000000  1.000000  0.000000 = A_2 vector\n');
fprintf(shape,'  1.000000  1.000000  1.000000 = lattice spacings (d_x,d_y,d_z)/d\n');
fprintf(shape,' -16.50000 -16.50000 -16.50000 = lattice offset x0(1-3) = (x_TF,y_TF,z_TF)/d for dipole 0 0 0\n');
fprintf(shape,'   JA  IX  IY  IZ ICOMP(x,y,z)\n');
for natnumber=1:nat
    fprintf(shape,'%4i',natnumber,ixyz(natnumber,1),ixyz(natnumber,2),ixyz(natnumber,3),ixyz(natnumber,4),ixyz(natnumber,5),ixyz(natnumber,6));
    fprintf(shape,'\n');
end
fclose(shape);

       2)函数形式的核壳纳米球shape.dat文件生成代码

%**************************************************************************
% 希望此代码能帮助各位学习DDSCAT的网友更近一步
% Author:XD_Yangf
% Date:2019-04-23
%**************************************************************************
function [v, aeff, nat] = CoreShell_Function(x_c, y_c, z_c, d, r, r1, r2)
%**************************************************************************

% 设定d值,代表偶极子间的间距 如:d=0.001;

% 设定r值,代表纳米球的半径 如:r=0.024;

% 设定r1值,代表核的半径 如:r1=0.001;

% 设定r2值,代表壳的半径 如:r2=0.024;

% r2不能小于r1;

% 设定x_c, y_c, z_c值,代表纳米球的中心点位置 如:
    % x_c=0; 
    % y_c=0;
    % z_c=0;

%**************************************************************************
% 输出值预设
v=4*pi*(r^3)/3; % 计算实际纳米球的体积
aeff=(v*3/4/pi)^(1/3); % 计算纳米球的有效半径
nat = 0; % 记录偶极子个数

% 判定壳的半径是否大于核的半径
if r2TARREC   rectangular prism; AX,AY,AZ= 16.0000 32.0000 32.0000\n');
fprintf(shape,'     ');     
fprintf(shape,'%i', nat);
fprintf(shape,' = NAT\n');
fprintf(shape,'  1.000000  0.000000  0.000000 = A_1 vector\n');
fprintf(shape,'  0.000000  1.000000  0.000000 = A_2 vector\n');
fprintf(shape,'  1.000000  1.000000  1.000000 = lattice spacings (d_x,d_y,d_z)/d\n');
fprintf(shape,' -16.50000 -16.50000 -16.50000 = lattice offset x0(1-3) = (x_TF,y_TF,z_TF)/d for dipole 0 0 0\n');
fprintf(shape,'   JA  IX  IY  IZ ICOMP(x,y,z)\n');
for natnumber=1:nat
    fprintf(shape,'%4i',natnumber,ixyz(natnumber,1),ixyz(natnumber,2),ixyz(natnumber,3),ixyz(natnumber,4),ixyz(natnumber,5),ixyz(natnumber,6));
    fprintf(shape,'\n');
end
fclose(shape);

       此代码的结果是生成一个核壳模型,如果需要单纯的球,只需要把第二个判定距离的for循环注释掉就行。

       注意:对于核壳来说,较小的偶极子个数就可以保证仿真精度或者说仿真的正确性;但是对于较复杂的模型来说,例如立方体等有棱角的,或二聚体等,可能需要更多的偶极子个数,因为越尖锐的纳米粒子越需要较小的偶极子间距(from: 悠悠我心)。

 

自行设定模型的几个关键点是:

       1)如何生成你需要的偶极子点,即先有一个代码的思路

       2)设定一个合理的d,d越小for循环的次数越多,即精度越高,但是还是根据需要设定就行

       3)根据体积计算出有效半径,用于后面的ddscat.par

 

代码的细节:

       为什么我们要让x先除以d,在乘以d ( nXmin=-round(r/d)  ---->  jx=nXmin:nXmax  ---->  x=jx*d),这样做岂不是很麻烦。

       首先,除以除以d的方式,可以让我们通过改变d来决定循环的次数;其次,乘以d,可以让x从整数变回小数,这样的计算精度更高一点。

 

ddscat.par文件的修改:

       输出的文件名我们还需要修改,必须改为shape.dat才能使用。或者一开始就选好输出文件的路径,可以直接把输出名定位shape.dat。

       接下来,把shape.dat文件放到需要的文件夹里,再修改ddscat.par文件中的两个地方。

【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计_第7张图片

       1)首先,修改 Target Geometry and Composition,即模型的几何形状和构成。我们需要将模型名称改为'FROM_FILE',即从文件中获取,这个文件指的就是shape.dat。

       2)其次,修改 Effective Radii (micron) 有效半径,从Matlab的工作区或者输出结果就可以得到有效半径。

       【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计_第8张图片

 

       至此,所有准备工作结束,文件夹中相比之前的案例,多了一个shape.dat文件,然后开始运行ddscat.exe即可。

 

     【DDSCAT——离散偶极近似仿真程序01】概念和说明书介绍

     【DDSCAT——离散偶极近似仿真程序02】初步运行案例程序

     【DDSCAT——离散偶极近似仿真程序03】近场计算及其呈现

     【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计

     【DDSCAT——离散偶极近似仿真程序05】模型设计Matlab代码:多核壳球 、多核壳圆柱

     【DDSCAT——离散偶极近似仿真程序06】模型设计Matlab代码:多六棱柱 、多圆柱核六棱柱壳

     【DDSCAT——离散偶极近似仿真程序07】模型设计Matlab代码:圆环套多个圆柱

     【DDSCAT——离散偶极近似仿真程序08】如何在Linux系统上运行DDSCAT程序

     【DDSCAT——离散偶极近似仿真程序09】如何下载ifort安装文件

     【DDSCAT——离散偶极近似仿真程序10】DDSCAT内置示例运行结果

     【DDSCAT——离散偶极近似仿真程序11】DDSCAT目标方向的调整

     【DDSCAT——离散偶极近似仿真程序12】calltarget与vtrconvert程序的使用

     【DDSCAT——离散偶极近似仿真程序13】ParaView可视化工具的使用及其与Vislt的对比

     【DDSCAT——离散偶极近似 用户手册中文翻译稿 0201】

     【DDSCAT——离散偶极近似 用户手册中文翻译稿 0202】

     【DDSCAT——离散偶极近似 用户手册中文翻译稿 0203】

     【DDSCAT——离散偶极近似 用户手册中文翻译稿 0204】

     【DDSCAT——离散偶极近似 用户手册中文翻译稿 0205】

你可能感兴趣的:(DDSCAT)