首页/文章/ 详情

Hypermesh+Lsdyna的爆炸压力波传播

6小时前浏览65

这是一篇2D的ALE算法爆炸案例

                       无反射边界的爆炸动画

涉及的软件有Hypermesh、Hyperview、Ls-Run、LS-prepost使用的Dyna模板,涉及的主要关键字有: 






#ALE算法控制关键字 *CONTROL_ALE #ALE单元MPP计算分配关键字 *CONTROL_MPP_DECOMPOSITION_DISTRIBUTE_ALE_ELEMENTS#计算时长 *CONTROL_TERMINATION #计算步长及质量缩放 *CONTROL_TIMESTEP #单位设定,非必要项 *CONTROL_UNITS #后处理数据输出项(场变量) *DATABASE_BINARY_D3PLOT #后处理数据输出项(历史变量) *DATABASE_OPTION(此篇文章未提取相关数据)#材料相关关键字,炸药*MAT_HIGH_EXPLOSIVE_BURN #材料相关关键字,空气、水 *MAT_NULL #材料相关状态方程,多项式 *EOS_LINEAR_POLYNOMIAL #材料相关状态方程,JWL爆炸 *EOS_JWL#属性 *SECTION_ALE2D #多物质材料组 *ALE_MULTI-MATERIAL_GROUP#SPC固定约束 *BOUNDARY_SPC_SET #边界条件,点起爆 *INITIAL_DETONATION

以上就是所涉及的关键字,下面开始进入正题

模型示意:模型为2D轴对称,炸药和空气域进行共节点处理,以Y轴对称,在Hypermesh中完成建模

如果第一次接触Dyna,需要注意的一点就是Comp那边的Card Image需要设置为Part,在其他cae软件中可能没有Part的概念,但Dyna必须设置

材料的属性正常赋予,主要是EOSID那边需要选特定的状态方程,还需要设置沙漏控制,本案例未设置,在提交求解后会出现一个警告,所以正常情况下需要设置沙漏QH的值,具体值需要根据经验或者关键字手册,默认为0.1

状态方程

用来描述材料在极端条件下(如高应变率、高压等)的压力 - 体积 - 能量之间关系的数学表达式。它主要用于处理材料在冲击、爆炸等动态加载过程中的行为

我按照左侧结构树中的顺序从上至下进行梳理下

红框中的Card是需要自己添加的,其余都是默认自带的,添加方式如图所示

在ALE1的卡片中,需要注意的就是DCT=-1和AFAC=-1,如果这两个值默认的话,提交计算会存在警告,而且计算出来的结果也会存在问题,后面文章会做对比

Termin这个卡片代表的是计算时长,一般只需要设置ENDTIM,本案例设置的为0.0001s,时间比较小,这是由于爆炸是一瞬间的事情,量级一般为us级别

Timestep这个卡片代表的是质量缩放(步长),需要设置TSSFAC和DT2MS,TSSFAC默认为0.9,对于结构分析而言保持默认即可,但对于爆炸相关的模型而言,网上推荐的数据为0.67-0.68,DT2MS就是时间步长,可设置为正或者负值,设置正值即对所有的单元进行质量缩放,如果设置为负值,就是对不满足步长要求的节点进行质量缩放,这样的话就在一定程度上保证了质量增加系数,因此推荐设置负值

提交计算后出现的步长dt就是DT2MS*TSSFAC的乘积,这个对于显式动力学软件来说是通用的

对于Units这个卡片来说,不是必须项,因为Hypermesh本身是无单位制的软件,当然这句话可能不严谨,但是你在设置密度、弹性模量的时候,是啥单位由你自己定,如果是mm ms g,那钢的密度就是0.00785,如果是mm s Tonne,那钢的密度就是7.85e-9,如果是m kg s,那钢的密度就是7850,所以单位这块在设置的时候一定要换算清楚

DBplot是后处理的云图数据输出,这个一般可以设置DT,也就是多少时间步每输出一个云图,这个比较好理解

Decomposition_Ale_Elems这个卡片是在使用MPP求解ALE算法的时候,不设置的话会报警告,所以设置了这个卡片

本例的Card基本上就这些内容,Comp这边也没有什么好说的,那就进行Load Collector,设置的边界条件都在这个里面,在Hypermesh中使用dyna模板时候一定要打开Solver这个Tab页,不然设置的边界条件参数都找不到地方设置,这时候就需要从Model切换到Solver的Tab页下,打开如下图所示

在Dyna里面这个就很清晰,对整个模型可以一览无余

边界条件很简单,一个是点起爆,需要设置起爆点的坐标和起爆时间,另一个就是SPC固定约束,约束6个自由度为0,如下图

下面就是材料,这块就是MAT8和MAT9,前者是爆炸的御用材料,后者是水,空气等物质的御用材料,下图为相关参数,参数也是从网上随便查的,不代表工程数据

接下来就是属性,属性这块也没啥选的,由于是2D的ALE轴对称模型,因此选择ALE_2D的单元属性,然后选择多物质材料11号算法,再选择轴对称算法,如果是3D的实体模型,就需要选择Solid Section,然后单元算法选择11号,单点的ALE算法

接下来就是Set集,建立节点集进行SPC固定约束的添加

建立ALE_MMG的Set集,因为在属性的时候选择的是ALE_2D,就需要建多物质组将所有与ALE相关的comp放入进去

下面就是状态方程,左边是空气的多项式,右边是JWL炸药

以上就是结构树中的设置及相关用法,设置后导出K文件提交LS-Run进行计算,下面是Ls-run的提交界面

求解完成后,使用Hyperview打开D3plot文件,相当于ABAQUS的ODB,可以看到爆炸之后的压力波在空气中的传播状态,并提取一个单元的压力曲线,有经验的网友会看到这个压力曲线是震荡的,不符合常规,这是由于我前面设置的为SPC固定约束,如果设置为无反射的边界条件,那压力波在边界就不会反射回来,也就是单元的压力曲线会在冲击波经过的时候达到压力峰值,然后最终断崖式下降边界反射的压力曲线对比如下图所示

篇幅有点长了,下次接着这篇继续,无反射边界的施加以及不添加ALE控制卡片的对比


来源:CAE中学生

HyperMeshHyperViewAbaqus显式动力学通用爆炸材料控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-11-16
最近编辑:6小时前
CAE无剑
硕士 | 仿真工程师 CAE中学生
获赞 685粉丝 1503文章 250课程 0
点赞
收藏
作者推荐

Hypermesh二次开发之找目标面

昨天在某个技术群里看到有个小伙伴在问hypermesh二开的问题,题大概如下所示:问题:如何通过二开的方法找到图中几何模型的四个外表面(不包含圆角)?首先对题目解读一下已知条件:①Comp的名称②全局坐标系的朝向其实,这两个条件也就相当于没有已知条件,毕竟只要打开这个模型,这两个条件在任何情况下都是存在的我看这个问题的第一反应其实是抽取这个几何的外表面,因为前段时间刚好写了这个需求,所以对这个需求印象比较深刻,但后来仔细一想,确实搞复杂了,那就从不同的角度和逻辑写一下这个需求吧梳理一下需求,方向有很多,我这边只写了2个作为示例:第一个是不单独抽取这个几何外表面,直接在这个Solid几何上处理;第二个就是单独抽取几何外表面,然后对新的几何外表面进行处理方向一:不单独抽取几何外表面逻辑:step1:找到几何的最大最小边界坐标step2:通过坐标计算这四个外表面的中心点step3:通过点到面的距离得到最小距离及对应的面IDstep4:索引面的IDPs:一般情况下,谈到最短距离及ID,我首先想到的是hm_measureshortestdistance2或者hm_measureshortestdistance,但是我这次没有用它,因为之前写代码时候经过了多次测试,这两个API存在BUG,在2021.1的版本下,这个BUG目前还没有得到修复,最短距离数据没问题,但是返回的ID并不是距离最短的,有兴趣的小伙伴可以下去测试一下相关代码如下:namespaceeval::Geom::Find{}proc::Geom::Find::surfaceGetMethod3{CompName}{#----------------------------------------------#最大最小坐标计算*createmarksurfs1"$CompName"setallSurf[hm_getmarksurfs1]setcompCoord[hm_getboundingboxsurfs1200]foreach{x_miny_minz_minx_maxy_maxz_max}$compCoord{}#----------------------------------------------#计算四个外表面的中心坐标setPoint1"[expr(abs($x_max)-abs($x_min))/2]$y_max[expr(abs($z_max)-abs($z_min))/2]"setPoint2"[expr(abs($x_max)-abs($x_min))/2]$y_min[expr(abs($z_max)-abs($z_min))/2]"setPoint3"[expr(abs($x_max)-abs($x_min))/2][expr(abs($y_max)-abs($y_min))/2]$z_max"setPoint4"[expr(abs($x_max)-abs($x_min))/2][expr(abs($y_max)-abs($y_min))/2]$z_min"foreach{x1y1z1}$Point1{}foreach{x2y2z2}$Point2{}foreach{x3y3z3}$Point3{}foreach{x4y4z4}$Point4{}#----------------------------------------------#得出四个外表面的IDsetsurf1[lindex[hm_getdistancefromnearestsurface[list$x1$y1$z1][list{*}$allSurf]]1]setsurf2[lindex[hm_getdistancefromnearestsurface[list$x2$y2$z2][list{*}$allSurf]]1]setsurf3[lindex[hm_getdistancefromnearestsurface[list$x3$y3$z3][list{*}$allSurf]]1]setsurf4[lindex[hm_getdistancefromnearestsurface[list$x4$y4$z4][list{*}$allSurf]]1]#*createmarksurfs1$surf1$surf2$surf3$surf4#hm_highlightmarksurfs1"h"}::Geom::Find::surfaceGetMethod3$CompName方向二:单独抽取几何外表面作为新的Comp在方向二这边又可以衍生出2种方法:①进行法向量判断想要的面②观察几何特征,通过面积比较法进行排除不需要的面先来说法向量的方法吧逻辑:step1:通过抽中面的命令抽中几何的外表面,这里要注意的一点是抽中面的功能并不是只能抽取到中面,其实它还可以抽取到内表面,外表面以及指定偏移距离的任何面,但是需要一些设置step2:遍历comp名称为"MiddleSurface"的所有面,通过面的法向量进行判断step3:留下法向指向Z和Y的面即可Ps:当时判断法向量的时候有点小插曲,这确实也是经常会遇到的问题,就是法向量应该是"001"的面,它的法向量在hypermesh中计算出来是"1.85e-255.48e-161"这是由于精度误差所致的,所以说没法直接判断,即便它的值很小,无限接近于0,但是它不是0后面我就设置了一个容差0.00001,然后让得出来无限接近于0的数减去0,如果小于这个容差,那就当做0进行处理,于是原本简洁的代码又新增了3个If判断相关代码如下:namespaceeval::Geom::Find{}#--------------------------------------------------------------------------------#提取实体外表面#--------------------------------------------------------------------------------proc::Geom::Find::Exterior_surface{CompName}{*createmarksolids1"bycomp""$CompName"*createmarksurfaces2"all"*midsurface_edit_base_surfaces2100*midsurface_extract_10solids13051902000100100undefined001*createmarkcomponents1"^Basesurfaces"*deletemarkcomponents1}proc::Geom::Find::surfaceGet{CompName}{#----------------------------------------------*createmarksurfs1"$CompName"setsurfId[hm_getmarksurfs1]settrueSurf""settol0.00001foreachsurf$surfId{*createmarksurfs1$surf#----------------------------------------------#得到面的中心setsurfCenter[hm_getcentroidsurfs1]hm_markclearall1foreach{xyz}$surfCenter{}#----------------------------------------------#求面的法向量setsurfNormal[lrange[hm_getsurfacenormalatcoordinate$surf$x$y$z]35]foreach{ijk}$surfNormal{}#----------------------------------------------#消除计算精度误差导致的判断失效问题if{[exprabs($i-0)<$tol]}{seti0}if{[exprabs($j-0)<$tol]}{setj0}if{[exprabs($k-0)<$tol]}{setk0}#----------------------------------------------#判断法向量是否满足if{"$i$j$k"=="001"||"$i$j$k"=="00-1"||"$i$j$k"=="010"||"$i$j$k"=="0-10"}{lappendtrueSurf$surf}}puts"TheSurfyouneedis$trueSurf"#*createmarksurfs1{*}$trueSurf#hm_highlightmarksurfs1"h"}::Geom::Find::Exterior_surface$CompName::Geom::Find::surfaceGet"MiddleSurface"再来说面积比较法,缺点就是会选取所有的surf进行判断,不一定能得到你想要的,所以需要删除其他无关的comp逻辑:step1:同样是先使用抽中面功能抽取几何外表面step2:遍历每个面的面积放入列表,进行从小到大的排序,因为此时一共有8个面,其中4个面是圆角面,所以它的面积肯定是最小的,也就是说8个面积中,索引位置分别为0123,然后把位置3对应的面积得到step3:使用hm_getsurfacesbyarea进行筛选,这个API可以把小于或等于你指定的面积对应的面ID得到step4:从8个面中通过列表操作移除4个圆角面相关代码如下:namespaceeval::Geom::Find{}#--------------------------------------------------------------------------------#提取实体外表面#--------------------------------------------------------------------------------proc::Geom::Find::Exterior_surface{CompName}{*createmarksolids1"bycomp""$CompName"*createmarksurfaces2"all"*midsurface_edit_base_surfaces2100*midsurface_extract_10solids13051902000100100undefined001*createmarkcomponents1"^Basesurfaces"*deletemarkcomponents1}::Geom::Find::Exterior_surface$CompNameproc::Geom::Find::surfaceGetMethod2{CompName}{#通过面积对比法,缺点就是会选取所有的surf进行判断,不一定能得到你想要的*createmarksurfs1"$CompName"setallSurf[hm_getmarksurfs1]setsurfAreaList""foreachsurf$allSurf{setcurrentArea[hm_getareaofsurfacesurfaces$surf]lappendsurfAreaList$currentArea}#----------------------------------------------#面积大小排序setnewAreaList[lsort-increasing$surfAreaList]setareaValue[lindex$newAreaList3]setsmallArea[hm_getsurfacesbyarea[exprdouble($areaValue)]]hm_markremovesurfs1{*}$smallAreasettrueSurf[hm_getmarksurfs1]#*createmarksurfs1{*}$trueSurf#hm_highlightmarksurfs1"h"}::Geom::Find::surfaceGetMethod2"MiddleSurface"对比完这些方法的感受就是,要实现某一个功能,逻辑方法很多,但是简洁通用的还需要进行打磨才可以,这个文章写出来只是为了记录一下我关于这个问题的一些思路及涉及的一些代码,算是给在学二开的人一些参考,代码格式可别参考我的,哈哈,要是自评的话,我只能说:"毫无章法"最后说一下我写了一段时间的hm二次开发脚本的感受吧,首先就是要对需求了解清楚,梳理好可能存在的问题,到时候输出一些log文件方便调试bug,其次就是对整个数据的传输与接收,数据的类型一定要有清晰的认识,最后分清楚主函数与方法调用,还有就是一定要写注释,一定!一定!最近学到了驼峰式命名,挺有意思~来源:CAE中学生

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈