精华内容
下载资源
问答
  • 编辑备注:这里所说的周期性边界指的是几何上具有周期性,并不是有限元模型中常说的周期性边界条件,在做有限元分析时,有限元模型中的周期性边界条件还得借助其他脚本或者开源插件生成,例如EasyPBC。强推!周期性...

    08567fe8d1958916140d3d3430445981.gif

    之前发布了单向纤维增强复合材料结构细观建模软件1.0版本,有读者提议说能不能创建可加载周期性边界的模型,于是对程序进行了修改,增加了周期性几何功能

    编辑备注:这里所说的周期性边界指的是几何上具有周期性,并不是有限元模型中常说的周期性边界条件,在做有限元分析时,有限元模型中的周期性边界条件还得借助其他脚本或者开源插件生成,例如EasyPBC。

    ccf9397e68257812825af0fd0c2aa218.png

    强推!周期性边界条件实用工具EasyPBC(附下载链接)

    对于创建有周期性几何模型,相对于单向纤维增强复合材料结构细观建模软件v1.0版本,修改了算法,先随机生成周围边界上的一个纤维,对该纤维的xy坐标进行处理,生成三个纤维坐标(x+width,y) (x+width,y+height)(x,y+height),分布距离和矩形四个顶点相同,再进行随机生成几个边界上的纤维;边界上的纤维生成后,与单向纤维增强复合材料结构细观建模软件中算法三相同,以边界上的纤维为基础,向内生成其他纤维,原理如图所示。

    59f85944e977a16630544673e522b838.gif

    单向纤维增强复合材料结构细观建模软件V2.0加入周期性几何边界按钮,可生成具有周期性几何模型,打开周期性开关后随机起始位置对生成结果无影响,对于其他功能介绍可查看之前发布的文章 单向纤维增强复合材料结构细观模型建模软件

    工具使用环境:

    a)  Catia V5版本

    b)  工具为exe格式,Windows电脑可直接运行

    工具说明:

    改进后的软件界面如下,

    f51f2ddfa64153af7a856ffe118ead65.png

    使用方法演示

    注意要打开CATIA,并进入Part设计模块。

    41e35a0caa223b86e24bb1f6f8659f42.gif

    生成效果如下:

    c7fe533660a31a0602b73a825b1fce19.png

    将上述生成的几何模型导入到Abaqus中,划分网格、赋属性、施加边界载荷即可进行计算。该案例仅为演示细观建模插件效果,模型中并未考虑周期性边界条件。

    c73b7444a6dfbb54ca5eda68e6b29a0f.png

    有限元网格

    a8e65c00f05bc0a2fc8a73dedb198acc.png

    计算结果

    注意事项:

    1.此处长度单位为mm(Catia默认单位)

    2.输入数据时注意若有小数点,注意是否输入完整

    3.纤维体积含量使用浮点数,例0.6,不能使用类似60%的百分比数据

    4.关于随机起始位置:随机起始位置即为第一个纤维的坐标位置,有5个选项,会影响纤维分布的随机性及纤维体积含量的随机性

    5.对于最大、最小距离因子的解释:

    1. 任意两纤维中心距不得小于最小距离因子乘纤维直径

    2. 一个纤维与相近的两个纤维中心距不得大于最大距离因子乘纤维直径

    3. 最大距离因子减最小距离因子越大,纤维分布随机性越好,最大距离因子减最小距离因子越小,纤维体积含量分布更稳定

    4. 要提高纤维体积含量,则可适当减小距离因子,若要减小纤维体积含量,可适当增加距离因子(一般最小距离因子不低于1.05)

    5. 距离因子在允许纤维体积含量的条件下,不宜过小,若距离因子太小,会导致相邻纤维距离减小,可能会影响网格划分质量

    6.关于工具的算法:该工具采用方案三生成纤维坐标数据,按照输入的数据进行尝试,最多尝试5次,若尝试生成的纤维体积含量与目标纤维体积含量相差1%以内,则直接创建模型;若5次都未达到相差1%以内,则可有几种选项:

    1. 显示出5次尝试的纤维体积含量,根据5次尝试的结果修改距离因子,重新尝试

    2. 在纤维数量不变的情况下,调整纤维直径至纤维体积含量达到预定要求(注意:若纤维直径增加可能会导致Catia草图自相交)

    3. 若5次尝试最接近目标纤维体积含量的纤维体积含量仍大于目标纤维体积含量,则可纤维直径不变,从已确定的纤维坐标中随机删除几个纤维坐标至纤维体积含量达到预定要求(注意:实际生成的纤维体积含量仍大于目标纤维体积含量才可使用)

    7.关于网格划分:

    1. 模型可分为两部分导入有限元或前处理软件:基体和纤维,所有纤维作为一个整体,方便网格划分和分配材料

    2. 建议划分网格时提取出含有纤维的表面先划分面网格,调整二维网格质量后,然后通过偏移或扫掠生成体网格

    8.工具使用环境:

    1. Catia V5版本(电脑上要提前安装)

    2. 工具为exe格式,Windows电脑可直接运行

    d105618d208721b07135fc0fcd80b12c.png

    扫码添加客服微信

    欢迎关注“复合材料力学”微信公众平台

    4241ed4a5beacf9b6458b40cee96b335.gif

    敬请关注

    b70e0aec0b560892abcb7c93d6ffc050.png

    展开全文
  • 结果表明:在周期性边界条件下,围岩体各处的温度随时间周期性地波动,并且温度波动的振幅随围岩深度的延伸呈负指数规律变化,围岩体不同层面上的温度波具有振幅衰减和波动延迟的特点。综合以上分析,推导了巷道围岩体...
  • Voronoi的生成不是难点,程序和介绍都非常多,这篇文章的特点主要区别是运用了周期性边界条件(PBC),以便进行后期的MD仿真,最后附有演化视频和几个Voronoi源代码。MD的编程应用对我们的发展至关重要,工业界CAD和...

    感谢最近一些在做MD和随机网络的朋友的关注和私信,我决定在这里陆续分享一些相关MD的小知识,原因是这些内容在国内的很难搜索到,资料非常匮乏,同时也希望我可以记录自己的学习历程。Voronoi的生成不是难点,程序和介绍都非常多,这篇文章的特点主要区别是运用了周期性边界条件(PBC),以便进行后期的MD仿真,最后附有演化视频和几个Voronoi源代码。

    MD的编程应用对我们的发展至关重要,工业界CAD和CAE已经被老外牢牢掌握,经过了数10年的发展,我们很难在上面进行超越,如果想用这些软件去发表论文和工业设计,都要老老实实的给老外交钱,一般这些软件都价格不菲,最重要的是一旦国外停止供应,就一个matlab都足以给我们造成很大的打击。然而在物理化学领域,第一性原理和MD几乎各占半边天,也有现在逐渐相结合的aiMD,幸运的是这些软件都需要很大的改进,目前还都不完善,没有一个非常强大且垄断的商业软件出现,所以我们国家在这方面有着巨大的发展潜力。

    好了,废话不多说了,本文说说随机的二维Voronoi图(附带周期边界条件)如何变成石墨烯通过这样产生的石墨烯脱离了完美晶体模型的记忆性,更加利于进一步的MD仿真!Voronoi又称“泰森多边形”,在模拟计算领域可谓是大名鼎鼎,广泛用在气象,地理,交通,晶体生长领域,长相如下:

    1ad3117035ac7d6eb1b10cfd8e2c9e38.png

    一个平面被分成了多个区域,而且每个区域中都仅包含一个随机点,这里要注意的是,可能会误解是先有的彩色区域而后有的黑点,实际上是现有的黑色随机点,然后进行德劳内三角划分得到了不同的彩色区域。这样的图形有一个性质就是每个区域内任何一点到该随机点的距离总是小于到其他区域内随机点的距离。

    具体的介绍可以参见里面的高赞回答: 沃罗诺伊图(Voronoi Diagram,也称作Dirichlet tessellation,狄利克雷镶嵌 )是怎样的? 最好有图说明。

    方法不再赘述,我这里的Voronoi使用了首先生成一堆随机点的坐标(x, y),x是在0~Lx间生成,y是在0~Ly之间生成,所以一定要记下这里的Lx和Ly,这是运用到周期边界中的关键因素,而且以便后期盒子松弛使用。

    下面产生100个随机点,为了运用PBC,实际需要400个点,因为要把每个方位的点都按周期Lx和Ly移动到相应的位置上,例如:

    dde7904043037b9d6046fc1ea6cc57ca.png

    上图中红色虚线中的是我们的仿真盒子,它在x和y方向的长度分别为Lx和Ly,在虚线的区域中放入N个原子,为了使用PBC,我们需要再加3N个原子按如图所示放在其他各个方向,从而构成了具有PBC的散点图,如下:

    65a37c1b272d43ac88b34b98b0c723a8.png

    红色实线为我们的仿真box,里面100个原子,外面的为周期性复制,接下来进行Delaunay三角划分,将散点图构成三角形,然后找出其外接圆的圆心,此处不再赘述,然后将外接圆的圆心都链接起来,就得到了泰森多边形,每个区域内仅仅包含一个散点。

    9a2bcc3cd5a9d41ea2afaaa87f3eb980.png

    每个外接圆圆心都只与三个点相连,正好满足石墨烯中每个C原子外面有3个分子键。然后将随机点去掉,只留下box中的Voronoi图:

    2a40328a50934c3907af06fbe62ee695.png

    之前box内的100个散点图这里变成了200个C原子,然后给每个原子标号,记录下每个键两边连接的原子信息,还有每个原子相邻的3个原子信息,放入我们的MD程序中进行能量弛豫,这样就可以得到原始的石墨烯样本:

    564af96bf1be3a8fdc4e157f10fd7ca2.png

    如果扩展到三维,只需要随机改变部分c原子的z坐标:

    a48dba13c76e3e317b9a633e1840ffba.png

    弯弯曲曲的看起来,不过这只是最初的随机模型,如果进一步生成多晶石墨烯还需要随机换键处理。

    下面是二维voronoi弛豫的视频:

    知乎视频www.zhihu.com
    zhihu-card-default.svg

    附上一个简单的Voronoi图的python代码:

    from PIL import Image
    import random
    import math
    
    def generate_voronoi_diagram(width, height, num_cells):
    	image = Image.new("RGB", (width, height))
    	putpixel = image.putpixel
    	imgx, imgy = image.size
    	nx = []
    	ny = []
    	nr = []
    	ng = []
    	nb = []
    	for i in range(num_cells):
    		nx.append(random.randrange(imgx))
    		ny.append(random.randrange(imgy))
    		nr.append(random.randrange(256))
    		ng.append(random.randrange(256))
    		nb.append(random.randrange(256))
    	for y in range(imgy):
    		for x in range(imgx):
    			dmin = math.hypot(imgx-1, imgy-1)
    			j = -1
    			for i in range(num_cells):
    				d = math.hypot(nx[i]-x, ny[i]-y)
    				if d < dmin:
    					dmin = d
    					j = i
    			putpixel((x, y), (nr[j], ng[j], nb[j]))
    	image.save("VoronoiDiagram.png", "PNG")
    	image.show()
     
    generate_voronoi_diagram(500, 500, 25)
    展开全文
  • 今日份~01板块模型周期性边界条件和板块模型 目前普遍使用的计算程序是在所有三个坐标方向上都应用了周期边界性条件,在超晶胞的底部,原子在x、y方向上充满,而在超晶胞的顶部区域却是空的,这种模型称之为板块...
    af27ae74d5107dfe906fd5bc94a332dd.pngac1da3547ee3536be44255e4885fa437.png

    今日份~

    71e310f98bfa26dd129e4e9a567a5f28.png

    09935527de3df19c1db22d65bb3d4aa1.pnge7df54d6b2243575f2c45431ae336f7f.png6344f3fe9e4fb670327d16448f0249f9.png37dbaa8e515420b676a1c6b2f8e9e12f.pnga92cf81ec1f90a11dfa5775d23640d87.png01

    板块模型

    周期性边界条件和板块模型

      目前普遍使用的计算程序是在所有三个坐标方向上都应用了周期边界性条件,在超晶胞的底部,原子在xy方向上充满,而在超晶胞的顶部区域却是空的,这种模型称之为板块(Slab)模型,在z方向上分隔开周期性板块的空白区域称之为真空区(Vacuum Space)。使用这种模型时,一定需要有足够大的真空区,以便材料的电荷密度在真空区逐渐消失为0,从而使该板块的顶面和相邻板块的底面之间并不存在实质的相互作用:

    7c744ccc1bb39734798beb26853c19ba.png

    选定k

       对于板块模型的计算同样可使用Monkhorst-Pack方法选定k点。由于倒易空间中矢量长度反比于实空间,如果真空区足够大,在距离板块边缘很短的位置电荷密度即消失为0,这意味着在b3方向上只使用一个k点即可能得到精确结果。因此对于板块计算常使用M×N×1k点网格。

    表面弛豫

    靠近材料表面的原子由于表面层的配位数减少,导致靠近表面处的原子层间距应该与体相中不同,即表面弛豫(Surface Relaxation)。

    表面弛豫意味着弛豫后的表面要比理想表面能量更低。可将板块下层的原子看作体相部分,并对底部原子层进行约束,在弛豫使总能最小化时仅允许顶部几层原子移动(一般量级为0.1埃):

    a1f7ac08d6cf7acf52067f61b62d7845.png

    在表面弛豫的讨论中我们仅仅考虑了垂直于表面方向的弛豫,这实际上也是正确的,因为板块模型在表面的晶面内是对称的,因此在表面的晶面上作用于每个原子上力的分量恰巧为0,故弛豫过程中原子不会在表面晶面上移动位置,这一点不仅仅是在理论计算上,在实际物理中也是正确的。因此所用晶格常数的数值的选择十分关键,最好的方法是,使用与表面计算相同的交换关联泛函,先对体相材料进行精确收敛的DFT计算,并采用该计算得到的晶格常数,使用其他的晶格常数(比如实验测得的晶格常数)会导致材料模型中出现人为应力(Artificial Stress),并导致表面原子在物理上产生虚假弛豫(Spurious Relaxation)。

    表面重构

    仅仅进行表面弛豫也不能,有可能也不能通过DFT得到精确解,因为许多表面会发生表面重构(Reconstruction),表面原子形成了新键。在重构过程中,相较于弛豫后体相封端表面的对称性,重构表面原子的对称性发生了某些改变。如Si(001)面,每个表面原子都有一个未配对电子的悬空键,表面原子的电子配对从而稳定化。

    表面能的计算

    表面能(σ)即劈裂体相所需要的能量,通过DFT板块模型计算方法如下:

    ba50d7d4987702369efd1bbae0d773f3.png

    其中Eslab是表面板块模型的总能,Ebulk是体相中单个原子或者分子的能量,n为板块模型中的原子或分子个数,A为板块模型中的总面积(包含顶面和底面)。

    宏观上表面能的单位为J/m2DFT中常用eV/Å2。其中1J/m2=16.02eV/Å2

    前式定义的表面能为两个量的差值,但这两个量的计算方式稍有不同,对于表面部分通常使用较大的超晶胞并含有一个真空区,使用较少的k点,而对于体相则恰恰相反。使两者计算差值不影响表面能结果,并没有唯一的正确方法(对板块模型的原子层数、k点、截断能、超晶胞尺寸等因素进行测试,保证两个结果都收敛良好)。

    举例:需要8层原子才能某材料表面弛豫改变量的结果收敛良好,但事实上仅需4层原子即可得到表面能的合理估算值,这意味着,收敛性并不是一个可以同等地应用于所有物理特性的概念,在经过一系列计算后,对某个物理量可能已经达到了良好收敛,但可能并没有达到另一个物理量的收敛范围。

    对称性不同的板块模型

    如前所述的板块模型上层进行弛豫,下层原子层保持固定,即非对称性板块模型。但是该模型会在随后的研究中产生偶极子(Dipole),比如吸附一个原子如F,这会产生相当大的偶极现象,当对此体系使用周期性条件时,这个偶极子上下方的其他影像就会产生静电作用,从而对总能产生一定贡献。在周期性体系中这个作用是数学上的正确反应,但对于一个真正的隔离态表面,这个作用是虚拟的。许多DFT计算程序都已经采取了相关方案,消除了对非零偶极子模型应用周期性边界条件引发的虚拟静电场,一般做法为,计算得到偶极子,然后应用一个相等且相反的偶极子校正真空区的局域电势。

    另一个方法是使用对称性模型描述,即板块的中心为镜面,以中间层作为体相结构,使上下层原子同时弛豫,这样上下层形成的偶极可以抵消。但这样做需要更高的计算成本,因为相对于非对称模块,为了相对精确的描述往往对称性模型需要更多的层数。

    274815d36627ad6f11ee71cc480816f6.png

    17799aa883547911d6cb4d5c88e132cc.png5fd9c956402b5af1c22c976a27659fca.png789e42fc1b65ca1c44095941115140b6.pngfd42453d57827f3686883ccc4382f2ed.png02

    吸附质

    表面吸附质

    对于面心立方晶体的(100)面有三种吸附位点:顶位,二重对称桥位,四重对称空穴位。

    de6f3915047a268067fca413b336bbd3.png

    将一个原子放置在接近于表面顶层的某个以上的位置处,然后最小化其总能并允许几个原子层和吸附原子的位置发生弛豫,可以简单的比较其总能,计算预测了吸附原子在四重空穴位的总能最低,而二重桥位的总能与之接近,可以猜测在某些情形下吸附原子的这两种情况都存在。对于这些结果,有必要验证一下该体系上实际的局域能量最低值所得的原子构型。对于正好位于前述三种对称吸附位点正上方的吸附原子,根据对称性,在平行于金属表面的平面内,作用与这个原子的力必为0,这意味着在优化计算的过程中,原子会始终位于对称吸附位点的正上方,即使从这个对称位置移开后可能会降低能量。可以通过小心地打破这种对称性防止这种错误的产生:将吸附原子向非对称方向移动一个微小距离(比如0.2埃),优化后发现无论初始位置位于哪一种吸附位点附近,最后弛豫后的位置都位于四重对称空穴位,这表明该位置为体系的最小能量点。

    另一个问题是,在该表面上相较于其他位置,吸附原子处于优先位置的倾向有多强烈,这可以通过计算吸附原子在表面的吸附能来回答,吸附能定义如下:

    Eads=EX/surf-EX(g)-Esurf

    这里,右侧三项分别为表面吸附X后的总能,单个气态X的总能和洁净表面总能,其物理意义是X原子从表面脱离并进入气相的过程所需的能量。这个定义简单易用,但在化学上不符合自然规律,因为单原子X不可能长时间存在,故下式更具有物理意义:

    Eads=EX/surf-0.5EX2(g)-Esurf

    这个吸附能的定义即将X从金属表面拉脱下并形成气相的分子X2所需要的能量。这个吸附能的定义与之前完全不同,因为X2分子存在很大的键能,由此可以观察到四重位置吸附能更负,热力学上最优先。

    随着吸附于表面的分子尺寸增加,不同吸附方式的数量就会急剧增加,很多情况下不参考实验数据将会很难完全确定最优吸附构型。

    如前所述由于交换关联泛函本身就是一个近似,相对于薛定谔方程的真实解,DFT计算存在未知的系统误差,然而大量的计算结果显示如果两个DFT计算之间化学上近似,则这两个计算的系统误差也是近似的,故相对能量比绝对能量准确的多。故可以计算两种不同位点的吸附能差,数据精度更高。

    表面覆盖效应

    使用周期性边界条件并将吸附质放置在超晶胞中,意味着每个吸附质都在其相邻超晶胞中存在一个完全相同规则性重复的复制品。在周期性边界条件的限制下,吸附质是长程规则排布的,不可能建立一个真实的无序排列模型,而自然界中晶体表面的吸附大多是长程有序的,所以DFT可以起到较好的模拟。

    超晶胞的体积决定了吸附质之间的距离,超晶胞较大则意味着定义了一个低密度吸附质的表面,超晶胞较小则意味着定义了一个高覆盖密度的表面。

    事实上对于大多数计算我们不能忽略相邻吸附质之间的作用,如果吸附质之间的距离增大,吸附能相应会降低,热力学上有更大的优先级。

    d48439e2ba11eaac3b0571d9d19b227d.png

    END

    展开全文
  • 程序结构命名变量简短变量声明指针new 函数变量的生命周期赋值元组赋值 命名 Go 中的命名规范与 Java 类似,都是必须以一...在 Go 语言中不存在未初始化的变量,也就可以在不需要额外代码的情况下判断边界条件的合理

    命名

    Go 中的命名规范与 Java 类似,都是必须以一个字母或者下划线开头,不能是数字开头,后面可以接上任意的数字和字母,并且区分大小写。

    有 25 个关键字,不能被用于自定义变量名

    break 		default 	func 	interface 	select
    case 		defer 		go 		map 		struct
    chan 		else 		goto 	package 	switch
    const 		fallthrough if 		range 		type
    continue 	for 		import 	return 		var
    

    此外,还有大约 30 多个预定义的名字,主要对应内建的常量、类型和函数,可以自定义使用这些,但是要在注意使用引起混乱

    内建常量: 	true 	false 	iota 	nil
    内建类型: 	int 	int8 	int16 	int32 	int64
    			uint	uint8 	uint16 	uint32 	uint64 	uintptr
    			float32 float64 complex128 		complex64
    			bool byte rune string error
    内建函数: 	make 	len 	cap 	new 	append 		copy 	close 	delete
    			complex 	real 	imag
    			panic 		recover
    

    由于 Go 中没有了 Java 中的 privatepublic 关键字来限制方法的访问权限,所以在一个文件中,如果一个名字是大写字母开头的,像函数名,那么它将是导出的,也就是可以被外部的包访问,例如fmt.Printf()可以在引用了fmt包的地方访问 Printf方法

    变量

    var 声明语句可以创建一个特点类型的变量,然后给变量附加一个名字,并且设置变量的初始值。语法如下

    var 变量名字 类型 = 表达式
    var s string = "apple" 
    

    其中,变量类型和表达式可以省略掉其中的一个,如果省略了类型,则会根据表达式的内容进行类型推断;如果省略了表达式的值,则会使用零值来初始化。

    Go 语言的零值机制可以确保声明的变量都有一个良好定义的值,从而避免很多不必要的麻烦。因此在 Go 语言中不存在未初始化的变量,也就可以在不需要额外代码的情况下判断边界条件的合理性。

    • 数值类型变量对应的零值是 0
    • 布尔类型变量对应的零值是 false
    • 字符串类型对应的零值是空字符串 ""
    • 接口或者引用类型(包括slice、指针、mapchan和函数)对应的零值是nil
    • 数组或结构体等聚合类型对应的零值是每个元素或者字段对应类型的零值

    例如:

    var s string 
    fmt.Println(s) 	//输出的是空字符串"",啥都没有,而不是错误或者其他不可预知的行为
    

    也可同时声明多个变量

    var j,k,l int		//三个变量都是int
    var j,k,l,m = 1,false,"str",0.65	//int, bool, string,float
    

    也可以通过函数返回的多个值进行初始化

    var f, err = os.Open(name)
    

    简短变量声明

    在函数内部,可以通过 名字 := 表达式 的形式声明变量,变量的类型根据表达式来推断

    a := 0.0
    start := time.Now()
    i, j := 0, 1
    resp, err := http.Get(url)
    

    简短变量声明语句中必须至少要声明一个变量,下面的情况将无法编译通过:

    f, err := os.Open(infile)
    // ...
    f, err := os.Create(outfile) 		//会报错
    

    指针

    一个指针的值是另一个变量的地址。即指向对应变量在内存中的存储位置。

    x := 2
    p := &x
    fmt.Println(p)			//0xc000054190
    fmt.Println(*p)			//2
    fmt.Println(x)			//2
    *p = 100
    fmt.Println(p)			//0xc000054190
    fmt.Println(*p)			//100
    fmt.Println(x)			//100
    fmt.Println(x==*p)		//true
    

    任何指针的零值都是 nil

    var p *int					//初始化指针变量,零值为nil
    fmt.Println(p) 				//<nil>
    fmt.Println(p == nil)		//true
    
    var x, y string
    fmt.Println(&x,&y)			//0xc000032bc0 0xc000032bd0 	
    							//x,y的零值为"",但是分配了不同的内存地址
    fmt.Println(&x == &y,&x == nil, &y == nil)		//false false false
    
    func f() *int {
    	y := 1
    	return &y
    }
    
    fmt.Println(f())			//0xc000054198
    fmt.Println(f())			//0xc0000541c0
    fmt.Println(f() == f())		//false
    

    对于Go语言,严格意义上来讲,只有一种传递,也就是按值传递(by value)。当一个变量当作参数传递的时候,会创建一个变量的副本,然后传递给函数或者方法,你可以看到这个副本的地址和变量的地址是不一样的。

    new 函数

    内建的 new 函数也可以来创建变量,通过表达式 new(T) 将创建一个 T 类型的匿名变量,并且初始化零值,然后返回变量地址,返回的指针类型为 *T

    p := new(int)
    fmt.Println(p)				//0xc000054190
    *p = 1000
    fmt.Println(*p)				//1000
    

    虽然 new 是 Go 的内建函数,但是并不是 25 个关键字之一,所以可以被用作变量名

    每次调用new函数都是返回一个新的变量地址

    变量的生命周期

    对于在包一级的声明的变量来说,它们的生命周期和整个程序运行的生命周期一致。相比之下,局部变量的生命周期则是动态的:每次从创建局部变量到不再被引用为止,然后可能被回收。函数的参数和返回值都是局部变量。

    一个变量的有效周期只取决于是否可达,因此一个局部变量的可能会超出其作用域,同时,局部变量可能在函数返回之后依然存在。

    编译器会自动选择是在栈上还是在堆上分配局部变量的存储空间,这个并不是由用var 声明还是用new声明的

    var global *int
    
    func a() {
    	var x int
    	x = 1
    	global = &x
    }
    
    func b() {
    	x := new(int)
    	*x = 1
    }
    
    

    对于a() 来说,局部变量x必须分配到堆上,因为在函数a退出后,x依然可以通过包一级的变量找到,也就是说,这个局部变量x从函数a中逃逸了。相反的,在函数b中的局部变量x在函数退出后就可以马上被回收了。编译器可以选择在栈上分配函数b中的x的内存空间,当然也可以选择在堆上分配,然后由 Go 的垃圾回收器GC来回收

    赋值

    元组赋值

    元组赋值允许同时更新多个变量的值。

    在赋值之前,右边的所有表达式会先进行求职,然后再统一更新左边的值。

    例如,求最大公约数

    func gys(x, y int) int {
    	for y != 0 {
    		x, y = y, x%y
    	}
    	return x
    }
    fmt.Printf("最大公约数为%v\n",gys(16,24))		//最大公约数为8
    

    计算斐波那契数列的第N个数

    func fib(n int) int {
    	x, y := 0, 1
    	for i := 0; i < n; i++ {
    		x, y = y, x+y
    	}
    	return x
    }
    
    fmt.Printf("斐波那契数列的第%v个数是%v\n",15,fib(15))	//610
    
    展开全文
  • 程序根据1992年Nagel和Schreckenberg发表的交通流论文,利用matlab编写。采用周期性边界条件,答案在array矩阵中,希望有所帮助
  • NaSch模型(matlab实现)

    2015-10-26 17:11:31
    程序根据1992年Nagel和Schreckenberg发表的交通流论文,利用matlab编写。采用周期性边界条件,答案在array矩阵中,希望有所帮助
  • 软件开发阶段的测试 经典的测试组合策略方案 1、在任何情况下,都应该使用边界值分析的方法; 2、必要时用等价类划分法补充测试...可以根据对程序可靠的要求采用不同的逻辑覆盖标准,如果现有测试方案的...
  • 修改高级表格支持库,解决在鼠标按下和抬起之间收到时钟周期事件的情况下,无法收到“被单击”事件的BUG。 3. 修改扩展界面支持库三,解决单击卷帘菜单后导致日期框不能弹出下拉窗口的BUG。 4. 修改XP风格支持库...
  • 此外,本书通过大量的例子,用非形式化的规范来详细定义这些数据抽象,描述模块所需完成的任务,并定义了模块所需的性能边界条件。该书的后7章主要讲述了怎样利用抽象构建大型软件,主要侧重于软件工程的内容,基于...
  • 测试计划和测试用例

    2020-12-16 18:46:39
    针对:对程序中的可能存在的错误有针对地测试 可判定性:测试执行结果的正确是可判定的,每一个测试用例都应有相应的期望结果 可重现:对同样的测试用例,系统的执行结果应当是相同的 测试用例通
  • 讨论了具有周期性和开放性边界的TASEP的平稳大偏差带来的意外相似性。 给出了另外两个应用程序。 (i)我们的方法被普遍用于研究Airy点过程(即GUE边缘特征值)的线性统计量。 我们获得经验度量累积量的生成函数。 ...
  • 4.3.2 次边界条件 4.3.3 边界值分析测试 4.3.4 健壮测试 4.3.5 边界值分析举例 4.3.6 边界值分析的局限 4.4 决策表测试 4.4.1 决策表 4.4.2 决策表在黑盒测试中的应用 4.4.3 决策表测试的指导方针 4.5 其他黑盒...
  • 2020-06-15

    2020-06-15 11:40:35
    标题人工智能《十万个为什么》。 时空。柯西发展将是一个渐进平坦的时空,没找到适合的一个...周期性有轨迹吗?一条轨迹能量表面密集吗?能量表面紧凑吗? 8为什么质量数量是0(100gev)应该增加普朗克质量及自然截止理
  • 软件工程知识点

    2012-12-02 21:34:25
    系统分析是对软件项目的高层分析,需要获取的是有关系统的框架描述,并需要使系统从它所处的环境中分离出来,为划分系统边界与确定系统构架提供依据。 (3)系统分析模型 分析模型是指采用作图方式对系统进行直观的...
  • 软件测试规范

    2018-04-23 09:16:12
    条件覆盖 ............................................................................................................................................ 11 4.判定/条件覆盖 .................................
  • 软件测试(美)Ron Patton(超级经典)

    热门讨论 2013-11-20 08:31:39
    5.4.2 边界条件类型 5.4.3 测试边界线 5.4.4 次边界条件 5.4.5 2的乘方 5.4.6 ASCII表 5.4.7 默认、空白、空值、零值和无 5.4. 8 非法、错误、不正确和垃圾数据 5.5 状态测试 5.5.l 测试...
  • 算法一般具有4个基本特征:可行、确定、有穷、拥有足够的情报。 (2)算法的基本运算和操作 算法的基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。 (3)算法的3种基本控制结构 算法的3种基本...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    (3)传统音乐程序设计不够灵活,扩展差。 本项目从Android的声音处理入手,实现音乐功能,根据用户的兴趣,提高用户参与度。本项目是一个能提高用户参与和娱乐程序的项目,具有一定的使用价值。 系统的研发背景 1...
  • 顶层:将整个系统作为一个加工,描述系统边界(输入与输出)。 中间层:表示某个加工分解为一组子加工,其中的子加工还需进一步分解。 底层:由不再进行分解的基本加工组成。 4. 加工小说明有...
  • 全书叙述清晰、图文并茂、实例丰富,是一部来自于大量经验的总结论著,适合在学习和工作中需要运用面向对象技术的高校师生或工程技术人员使用,特别适用于对面向对象技术有一定了解但希望进一步提高开发水平的应用...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 3.5 小 结 .27 第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型...
  • C#微软培训资料

    2014-01-22 14:10:17
    第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 3.5 小 结 .27 第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统。 综上所述,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以...
  • 其中电磁场计算模块可实现包括周期与反周期边界条件的施加、转子任意角度旋转、场路耦合和各种类型的损耗计算等二维有限元计算的基本功能。热分析模块可实现材料任意方向各向异性导热设置、接触热阻、场路耦合等功能...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    6.9 秘诀:移动带边界的视图到任意位置 179 6.10 秘诀:视图变形 180 6.11 显示和交互特性 183 6.12 UIView动画 183 6.12.1 建立UIView动画块 184 6.12.2 动画回调 184 6.13 秘诀:视图的淡入和淡出 185 ...
  • 9.1 应用程序生命周期 166 9.1.1 创建Application对象 166 9.1.2 创建一个自定义的Application类 168 9.1.3 关闭应用程序 169 9.1.4 应用程序事件 170 9.2 事件执行周期 171 9.2.1 Startup应用程序启动事件 171 ...
  • 实例061 设置TMemo组件的边界 73 实例062 TMemo组件的光标定位 74 实例063 得到TMemo中的可见行数 75 2.4 TListBox控件应用典型实例 76 实例064 在TListBox组件间交换数据 76 实例065 为TListBox添加水平...
  • 3.软件生命周期: 7 第二章 测试过程 8 1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 3外部测试: 10 验收测试:(在系统测试之后) 11 回归测试: 11 4.测试过程(干什么,怎么干) 12 5.各阶段输入、输出标准...
  • 8.5.2 过程边界、封装和测试 168 8.5.3 管理异步与超时问题 169 8.5.4 使用测试替身对象 171 8.6 验收测试阶段 174 8.6.1 确保验收测试一直处于 通过状态 175 8.6.2 部署测试 177 8.7 验收测试的性能 ...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
热门标签
关键字:

周期性边界条件程序