AbqVoronoi插件教程[二维梯度晶体模型]
1. 二维梯度模块界面
图1.1 二维梯度晶体模型生成界面
2. 输入参数说明
长方体尺寸参数[Box Size],矩形大小;
分布方式[Distribution Method],可选项①Ramp, ②Pow2, ③UDF;
尺寸限制[Size Limit],最小/最大尺寸限制或文件路径;
实体晶界厚度参数[Gap,默认0: 为不生成实体晶界];
是否为每一个晶粒创建单独的Set[Cell Set];
3. 常用UDF分布代码
3.1 自带Ramp分布
插件自带的Ramp选项表示从上至下晶粒尺寸线性变化,具体实现代码如下:
#coding:utf-8 import math def getSize(x, y, z): yMin, yMax = 0.0, 50.0 sizeLimit = [2.0, 6.0] k = (sizeLimit[1] - sizeLimit[0]) / (yMax - yMin) size = k * (y - yMin) + sizeLimit[0] return max(size, 1E-5) if __name__ == "__main__": print(getSize(0.0, 25.0, 0.0))
使用上面代码生成的模型:
图1.2 二维Ramp分布梯度晶体模型
3.2 自带Pow2分布
插件自带的Pow2选项表示从上至下晶粒尺寸平方变化,具体实现代码如下:
#coding:utf-8 import math def getSize(x, y, z): yMin, yMax = 0.0, 50.0 sizeLimit = [2.0, 6.0] k = (sizeLimit[1] - sizeLimit[0]) / (yMax - yMin)**2 size = k * (y - yMin) ** 2 + sizeLimit[0] return max(size, 1E-5) if __name__ == "__main__": print(getSize(0.0, 25.0, 0.0))
使用上面代码生成的模型:
图1.3 二维Pow2分布梯度晶体模型
3.3 中间渐变分布
中间渐变分布是指晶粒尺寸从模型的中间向两端线性变化,具体实现代码如下:
#coding:utf-8 import math def getSize(x, y, z): yMin, yMax = 0.0, 50.0 sizeLimit = [1.0, 4.0] yMid = (0.5*(yMax - yMin) + yMin) k = 2.0*(sizeLimit[0] - sizeLimit[1]) / (yMax - yMin) size = k * abs(y - yMid) + sizeLimit[1] return max(size, 1E-5) if __name__ == "__main__": print(getSize(0.0, 25.0, 0.0))
使用上面代码生成的模型:
图1.4 二维中间渐变分布梯度晶体模型
3.4 辐射渐变分布1
辐射渐变分布是指晶粒尺寸沿中心点向四周渐变,具体实现代码如下:
#coding:utf-8 import math def getSize(x, y, z): # center point xc = 25.0 yc = 25.0 zc = 0.0 initSize = 0.25 # the grain size of center point incrRatio = 0.15 # the rate of increase in size per unit length # linear growth: initSize + incrRatio * sqrt((x - xc)^2 + (y - yc)^2 + (z - zc)^2) dist = math.sqrt((x - xc)**2 + (y - yc)**2 + (z - zc)**2) incrSize = incrRatio * dist size = initSize + incrSize return max(size, 1E-5) if __name__ == "__main__": print(getSize(0.0, 0.0, 0.0))
使用上面代码生成的模型:
图1.5 二维辐射分布梯度晶体模型
3.5 辐射渐变分布2
将3.4节代码中的中心点位置调整到Box的一个角点上,可得到另一种辐射分布,调整后的代码如下:
#coding:utf-8 import math def getSize(x, y, z): # center point xc = 0.0 yc = 0.0 zc = 0.0 initSize = 0.25 # the grain size of center point incrRatio = 0.1 # the rate of increase in size per unit length # linear growth: initSize + incrRatio * sqrt((x - xc)^2 + (y - yc)^2 + (z - zc)^2) dist = math.sqrt((x - xc)**2 + (y - yc)**2 + (z - zc)**2) incrSize = incrRatio * dist size = initSize + incrSize return max(size, 1E-5) if __name__ == "__main__": print(getSize(0.0, 0.0, 0.0))
使用上面代码生成的模型:
图1.6 二维辐射分布梯度晶体模型
3.6 辐射渐变分布3
将3.4节代码中的中心点位置调整到Box的底边的中点上,可得到另一种辐射分布,调整后的代码如下:
#coding:utf-8 import math def getSize(x, y, z): # center point xc = 25.0 yc = 0.0 zc = 0.0 initSize = 0.25 # the grain size of center point incrRatio = 0.1 # the rate of increase in size per unit length # linear growth: initSize + incrRatio * sqrt((x - xc)^2 + (y - yc)^2 + (z - zc)^2) dist = math.sqrt((x - xc)**2 + (y - yc)**2 + (z - zc)**2) incrSize = incrRatio * dist size = initSize + incrSize return max(size, 1E-5) if __name__ == "__main__": print(getSize(0.0, 0.0, 0.0))
使用上面代码生成的模型:
图1.7 二维辐射分布梯度晶体模型
3.7 辐射叠加分布
将3.4节代码中的中心点位置调整到Box的4个角点和中心点上,晶粒尺寸取5个辐射分布场的最小值,可得到辐射叠加分布,调整后的代码如下:
#coding:utf-8 import math def getSize(x, y, z): # center point points = [[0.0, 0.0, 0.0], [50.0, 0.0, 0.0], [0.0, 50.0, 0.0], [50.0, 50.0, 0.0], [25.0, 25.0, 0.0]] initSize = 0.25 # the grain size of center point incrRatio = 0.15 # the rate of increase in size per unit length allSize = [] for p in points: # linear growth: initSize + incrRatio * sqrt((x - xc)^2 + (y - yc)^2 + (z - zc)^2) dist = math.sqrt((x - p[0])**2 + (y - p[1])**2 + (z - p[2])**2) incrSize = incrRatio * dist allSize.append(initSize + incrSize) size = min(allSize) return max(size, 1E-5) if __name__ == "__main__": print(getSize(0.0, 0.0, 0.0))
使用上面代码生成的模型:
图1.8 二维辐射叠加分布梯度晶体模型
3.8 分层分布
可以使用梯度模块来创建分层模型(建议使用插件自带的分层模块,生成速度和精度都高于梯度模块),示例创建双层模型,分为上下两层,具体代码如下:
#coding:utf-8 import math def getSize(x, y, z): yMid = 25.0 sizeLimit = [2.0, 4.0] if y > yMid: size = sizeLimit[1] else: size = sizeLimit[0] return max(size, 1E-5) if __name__ == "__main__": print(getSize(0.0, 25.0, 0.0))
使用上面代码生成的模型:
图1.9 二维分层分布梯度晶体模型