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

       这部分我们补充一下calltarget与vtrconvert的使用,并带来另外一个精简型可视化软件ParaView的使用,并与前面介绍的Vislt进行了对比。

 

一、calltarget

       1)calltarget的使用

       calltarget,顾名思义,呼唤目标对象,即用来生成模型的程序。

       首先,需要说一下,使用DDSCAT内置模型进行消光近场计算的方式不只有在ddscat.par中设置shape参数。

       也可以使用DDSCAT内置的calltarget.exe程序,先帮助我们生成一个target.out模型文件,然后改名为shape.dat,再根据前面介绍的FROM_FILE方法计算消光近场。此步骤相当于,DDSCAT帮助我们自主创建的模型,然后以文件的方式引用到ddscat.par中,与上面的一步法不同。

       与ddscat.exe和ddpostprocess.exe不同的是,calltarget.exe和vtrconvert.exe不需要对应的参数配置文件。

       cmd指令并进入有calltarget程序的路径中,然后输入calltarget.exe指令,出现如下图的内容。给出了一系列的DDSCAT内置模型,并问我们需要选择哪种。

       之前也有网友问我,为什么examples_exp里面的示例不全,没有手册里面所述的其他模型。现在看到calltarget程序显示的示例,我们再来对比User Guide使用手册中的内容,就可以知道手册里提到的模型现在都可以通过calltarget创建。

       现在我们假定输入一个ELLIPSOID,表示想要生成一个球体。然后命令结果会提示我们输入xv, yv, zv三个参数,表示椭球体的三个轴长。我们输入19 19 19,表示生成一个直径为19的球体。这里需要注意的是,三个参数需要以space空格隔开,有可能别的方式隔开也可以,不过目前我只确定空格是没有问题的。生成结束后,此时程序并没有运行完,继续提示你进行输入椭球的参数。这时如果需要刚才创建好的模型,就不要再输入了,因为产生的target.out文件不会自动改文件名,因而会覆盖刚刚产生的模型文件。此时,输入0 0 0,结束程序。

       上图中模型创建成功生成了一些文字说明,其中TARGET中的1.000 1.000 1.000表示晶格间距,此时不要惊慌,认为1这样的间距是不是太大了。根据我们第四部分的讲解,其实,最后的d还是由我们自己设定的aeff有效半径决定的。

       aeff确定,则V确定,V确定且N(即为NATO=3695)确定,则d确定。

       而命令行中的SIZER,根据内容我们可以判断出,这表示能够囊括此球体的最小立方体积为19*19*19=6859。

       此时打开创建模型成功后生成的target.out文件,NAT和lattice spacings与命令行中相一致。

       2)部分参数解释

       根据我们上一篇(第11篇)中对模型旋转的介绍所涉及到的一些内容,我们可以知道,上图target.out文件内容中的部分参数意义。

       首先,A_1 vector和A_2 vector,即是上一篇中所提的 a^1 和 a^2 两个正交向量,a^1初始状态为沿着x轴,因而表示为1 0 0,a^2初始状态为沿着y轴,因此表示为0 1 0。

       其次,对于lattice spaceings我们刚才说到,它不表示偶极子之间的间距,d才表示。其描述的值为(d_x,d_y,d_z)/d,既然默认值定为1 1 1,那么这里我们正常设计模型可以忽略此参数。虽然目前对d_x,d_y,d_z的概念尚不清楚,但是我们可以理解为,它表示了在每个坐标轴上对模型的拉伸,如果为值为1 1 1,则表示模型比例不变。在下文中,我们将换一种模型,并对其可视化来理解这个概念。

       最后,lattice offset,表示模型中心的距离Lab框架中心的偏移量。对于模型中心的理解,其实并不是模型的几何中心,而是a^1 和 a^2 两个向量的起点。这个起点的设定方式,可以由我们自己设定。若改变了lattice offset,即改变了模型的旋转中心,也就改变了模型在Lab框架中的位置。但是,根据我目前的实验结果和思考,这个设定应该是没有意义的。下文中我们解释为什么。

       另外,在上一篇中,我提到可以将a^1和a^2看作Target Frame中的坐标系,此时我在手册中又找到了一些相关说明:

       上图中框出的部分,都说明是在TF中的参数,这就表明,所有有关shape文件的参数,都是在TF框架中指定的。

 

二、对于自建模型,不同lattice offset下的近场结果

       1)先来看模型设计Matlab代码,这里创建了一个长宽高分别为39 31 19的立方体。

nat = 0;
% 模型中心在 0 0 0
for x=-19:19
    for y=-9:9
        for z=-15:15
            nat=nat+1;
            ixyz(nat,1)=x;
            ixyz(nat,2)=y;
            ixyz(nat,3)=z;
            ixyz(nat,4)=1;
            ixyz(nat,5)=1;
            ixyz(nat,6)=1;
        end
    end
end

shape=fopen('CSDN_Block.dat','w'); % 运行时将文件名至于独立文件夹中并改名为shape.dat即可
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);

       Matlab代码里面此时没有写上shape.dat前面几行的说明和参数,此时我们自行复制粘贴补上。

       这里设定的lattice offset为0 0 0,与模型的中心相对应,因而,做近场计算(具体的所有ddscat.par参数目前不重要,只要保证后面几次的设定统一就行,因而此处没有给出)可视化之后,如下图。

       可以看到Vislt中的坐标轴中心和我们创建的立方块几何中心是重合的。

       2)我们再使用Matlab创建两外一个同样大小的立方体,但几何中心在19 9 15。

nat = 0;
% 模型中心在 19 9 15
for x=0:38
    for y=0:18
        for z=0:30
            nat=nat+1;
            ixyz(nat,1)=x;
            ixyz(nat,2)=y;
            ixyz(nat,3)=z;
            ixyz(nat,4)=1;
            ixyz(nat,5)=1;
            ixyz(nat,6)=1;
        end
    end
end

shape=fopen('CSDN_Block2.dat','w'); % 运行时将文件名至于独立文件夹中并改名为shape.dat即可
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);

       同时,shape文件中设定lattice offset为0 0 0。

       此时的近场可视化如下图。坐标轴中心在0 0 0处,而几何中心在19 9 15处,这符合我们的设定。        

       3)此时,仅对第二个模型shape文件中的lattice offset进行更改,改为19 9 15。

       此时,近场图如下,可以看到坐标轴中心和立方体几何中心是重合的。我们可以这样理解这个现象,首先,几何中心不再原点,而在19 9 15;然后,将lattice offset也设定为19 9 15,则与几何中心重合;最后,最终的坐标轴原点将定为lattice offset所在的位置。这样一来,就通过相对一致的位置设定,将第二个偏移了坐标轴原点的模型,重新拉回了坐标轴中心。

       那为什么说lattice offset这样的设定没有意义呢,因为入射光是沿着x轴正方向的一个平面波,首先考虑模型不旋转的情况:此时,不论模型LF中的什么位置,任何位置处的消光计算和近场计算结果都是一样的,因为入射光是相对同一方向的平面波;其次,考虑模型旋转的情况:我们可以把lattice offset的位置考虑为a^1坐标轴的起点,看似坐标轴的起点可以通过lattice offset改变位置,而实质是,不管改变到哪里,旋转的形式都是相对一致,只要a^1和a^2坐标轴的方向保持相对不变(即1 0 0和0 1 0),这模型整体在TF中的方向是不变的。这一观点我们可以这样思考,即向量是一个有方向和大小的量,但是他们没有固定的位置,是在空间中的一个相对方向。因而,改变lattice offset并不能改变a^1和a^2的方向,因此这个坐标点的设定意义不大。

 

三、calltarget的使用细节

       对于calltarget的使用,我们对于所有要求输入的尺寸,最好输入奇数而不是偶数,这样才能保持模型在该参数的对应方向上是对称的。

       1)calltarget→ELLIPSOID→18 18 18

      通过设定ELLIPSOID的输入参数为18 18 18产生的targe.out文件可以直接可视化(这个方法我们在后面的vtrconvert中会讲到),下图为Vislt对模型进行的可视化,使用的是Add→Pseudocolor→Composition叠加Operators→Slicing→Isosurface方法。

       在辅助线的帮助下,我们可以看到,球体的球心不在坐标轴中心。这是因为这个模型的球心不可能在坐标轴中心,因为每个坐标轴上的偶极子点数都是偶数个,而DDSCAT的偶极子点设定又只能是整数,所以球心不会与坐标轴中心重合。因而内置ELLIPSOID算法产生的球体球心是接近于坐标轴中心的。

       下面再看下产生的target.out文件,其中的lattice offset设定的位置为0.5 0.5 0.5。根据我的猜想,这只能是一种理论上的位置,因为是小数,所以是不能把模型的球心拉回到坐标轴中心的。

       2)calltarget→ELLIPSOID→19 19 19

       此时,针对ELLIPSOID设定了奇数参数的模型,可视化出的球体就位于坐标轴中心了,同时lattice offset也将变为0 0 0。

 

四、vtrconvert的使用

       对于上文中我们提到的19 19 19球体模型,我们可以不进行近场计算,也可以将calltarget生成的target.out文件直接转换为vtr文件,从而可视化。此时,就是DDSCAT中最后一个exe执行程序登场的时候了,即vtrconvert.exe。

       使用方法为,在同时有shape.dat和vtrconvert.exe程序的文件夹中,cmd命令行进入该路径,并输入vtrconvert.exe target.out vtrname,回车即可生成vtr文件。对于此输入命令,第二个参数不用一定为target.out(或shape.dat),也可以是别的文件全名,只要文件里的内容是shape.dat的规范形式即可。而第三个参数为输出文件的命名,也是用户自主命名。

       出现we will output VTK name: 这样的内容的时候,就表示我们的shape.dat文件没有问题,已经被转换为了vtr可视化文件。

       此处需要注意,如果通过vtrconvert程序将shape.dat转换为vtr的过程中报错了,则说明shape.dat文件不符合规范,如果直接去运行ddscat程序,也一样会报错。即,若vtrconvert程序报错,则ddscat程序必报错。

 

       此时使用Vislt对vtrname.vtr进行可视化的步骤如下。

       注意,因为没有近场计算,所以我们添加伪彩效果呈现模型时,只能选择Composition,即以材料的不同构成展现模型。而不像之前进行过近场计算的模型,此时还可以选择Intensity,即以电场强度的形式呈现模型。

       第二步,在Silicing中添加Isosurface,即可看到模型的表面轮廓。

 

       当然,我们可以继续选择添加Silicing中别的切面方式或其他的模型效果,更多的可视化功能我们将在下一篇继续介绍。

 

posted @ 2020-04-25 21:03  XD_Yangf  阅读(112)  评论(0编辑  收藏  举报