HyperStudy优化 附OptiStruct&HyperStudy理论基础与工程应用下载
优化技术历来是Altair的优势所在,Altair拥有众多优化工具,其中Altair HyperStudy™简单易用、算法高明,所以本文先介绍HyperStudy。此外,Altair最重要的优化工具当数Altair OptiStruct™,同时OptiStruct也是Altair Inspire™的优化内核,预计会在下一讲给大家介绍。
因HyperStudy相对简单,本文篇幅不长,也相对简单,但本文不过是个引子,文章最后有HyperMesh新界面中文教程、Templex语言,HyperStudy教程及Compose教程的下载链接,有兴趣的可以下载后再系统学习。
顺便说一句题外话,本文作者方献军老师表示:“我最喜欢的是Altair Compose™。”(可以在文末推荐链接查看Compose相关文章~)
例一:
首先要优化的结构是由三个实心杆组成的支架,如下图所示:
原始模型的性能水平如下:
工况1最大位移:22.85mm
工况2最大位移:75.72mm
体积:7656850mm3
(应力很小,不必考虑~)
优化三要素:
优化目标:最小化体积
优化约束:
工况1连接点最大变形量 < 22.0mm
工况2连接点最大变形量 < 75.0mm
设计变量:
1、 连接点可以在虚线框内任意移动
2、 三个杆的截面积变化范围如图中所示
形状变量需要使用HyperMorph创建,横向和纵向各一个。
截面积变量需要通过创建parameters得到。
最后,通过快捷键Ctrl+f搜索study进入HyperStudy,但是要注意不要关闭HyperMesh,因为HyperStudy需要利用HyperMesh进行模型更新。优化结果如下:
在这个例子中用到了网格变形(虽然只有一个点在动)和参数变量(双精度浮点数类型),实际上哪怕是更多的变量数目也不要紧,只不过是HyperMorph的操作会更加麻烦一些(文末链接中提供了培训资料下载),求解器的计算量会更大。对HyperStudy来说,任何求解器都只是一个黑盒,HyperStudy真正做的事情是:
✔ 不断生成新的模型
✔ 把新生成的模型提交计算
✔ 从新的得到的结果文件提取关心的结果
如下图所示:
例二:
下图所示三维曲面结构在两个零件交接处有条轨道,希望使用HyperStudy找到在考虑重力的情况下小车在哪个位置时应力最大,哪个位置时应力最小。最后在HyperView或者HyperMesh中画个云图或者矢量图。这个例子的不同之处在于它的设计变量是离散的整数变量。
最常规的想法是在各个节点分别创建一个单独的工况进行分析,但是这并不是本例想要介绍的。本例只创建一个工况,但是有很多load collector(每个里面放一个节点的FORCE),让HyperStudy运行的时候不断更换工况中的load collector ID。其实还有更简单的方法,只创建一个力,一个工况,让HyperStudy运行的时候不断更换力作用节点的ID。这个留给感兴趣的人自己去尝试(过程几乎一模一样,而且不用写脚本了)。
考虑到这里创建的load collector数量显著大于10,可以写几行脚本搞定load collector的批量创建。脚本如下:
提供给HyperStudy的是一个fem文件。
需要在HyperStudy的Editor工具中进行参数化。
此外,还需要创建一个文本文件告诉HyperStudy可选的load collector的id号都有哪些。格式是每个变量一列。本例只有一个变量,因此一列就够了,部分数据如下:
4
5
6
7
8
注意:由于数据表示的是load collector的id,如果不小心写了一个不存在的id,那OptiStruct求解器恐怕就要报错退出了。
如果有多列(多个变量,不同的列用空格分隔),文件的内容大致如下:
最后得到的结果是如下两个位置:
可以使用Matrix Browser在HyperMesh中显示一个云图(过程略):
或者在HyperView中画一个更加直观的矢量图(箭头大小表示全模型最大应力的大小而不是箭头所在位置的应力):
方法是将HyperStudy得到的结果写成一个如下的hwascii格式文本文件。
PS:为什么不用Compose或者python进行绘图呢?因为它们显示不了网格模型。
本例的目的是说明在HyperStudy中可以把ID号变成变量。类似的,HyperStudy中的变量还可以是节点、单元、梁截面、材料、属性、载荷、工况等的id号。实际上有限元软件中的几乎所有数据都是以ID号作为识别号的,这样一来换个材料、改个梁截面等等就都轻而易举了。
HyperStudy中的变量还可以是字符串,用的场合不多,这里就不介绍啦~
在HyperStudy的Editor工具中进行参数化后得到的tpl文件实际上是一个程序源代码(可能连很多HyperStudy资深用户都没有意识到这点),这门编程语言叫 templex,语法继承自C语言,基本数据类型是矩阵(类似MATLAB)。HyperStudy和HyperGraph / HyperView 等模块都会用它。实际上大家日常工作中在HyperGraph里面使用的函数和操作都是基于templex的。
我们先来看一下HyperGraph中怎么使用:比如希望得到多条曲线的上包络线,由于templex的强大功能,自己只需要写一点点代码,如下:
可以把得到的新曲线的数值直接放在{}里面进行绘图(当然,也可以变成HyperGraph的一部分),下图中的实线是sin(x)和cos(x)曲线,点是上包络得到的结果:
如果需要处理的问题比较复杂,建议使用HyperWorks中的Compose,理由是:
Compose可以使用HyperGraph的读取接口
兼容了MATLAB的编程语法(好处是很多编程问题在网上一搜就找到答案了)
可以和python共享变量,只要能通过python解决的问题都可以解决了。
比如你要绘制各种漂亮的图表,python很擅长。你可以在下面这个网站找到几千种不同类型的图表(带源代码)。
网址:
https://matplotlib.org/gallery/index.html
因为templex是编程语言,具有很大的灵活性,可以配合HyperStudy完成各种稀奇古怪匪夷所思的工作。这里抛砖引玉介绍一个比较特别的例子,下图是本例的简单模型。
本例的特别之处是:在tpl中通过templex语句实现了如果零件厚度这个设计变量大于1.1mm,单元7将从零件中移除掉(类似求解器的生死单元)。之所以选择这样简单的模型是希望大家看明白编程语言的关键,不被复杂的模型所蒙蔽。语句很简单,就是很普通的一句if语句。如下:
想象一下第二行可以换成任意多行的有限元卡片或者把include文件放在那里,那就可以表示任意复杂的结构和载荷了。
根据零件厚度不同,本例中得到的单元卡片是如下两种: