首页/文章/ 详情

【HyperMesh宝典】之OptiStruct优化响应

8月前浏览4169

本文摘要(由AI生成):

文章主要介绍了Altair OptiStruct优化软件的响应功能,包括第一类响应DRESP1、第二类响应DRESP2和第三类响应DRESP3。第一类响应是最常用的,可以直接计算得到,并且OptiStruct会自动计算灵敏度,可以大幅度提高优化的计算速度。第二类响应是第一类响应的代数表达式,OptiStruct自带了很多常用公式,也可以编写自己的公式。第三类响应是借助外部程序来完成响应计算。文章还介绍了如何创建求和的响应、创建约束、编辑fem文件等操作。

上一讲从优化变量的角度介绍了Altair OptiStruct™ 优化相关的功能。本讲将从响应的角度进行介绍,让我们赶紧开始吧~


 


响应的三大类


Altair OptiStruct之所以被认为是最强大的优化软件之一,其中一个原因就是丰富的内置响应。OptiStruct响应分三大类:


第一类响应DRESP1

1


OptiStruct 可以直接计算得到,具体可以看下图:


 

(点击图片可查看高清大图)


实际应用中90%以上的案例都是使用第一类响应。第一类响应很容易使用,而且OptiStruct会自动计算灵敏度,可以大幅度提高优化的计算速度。


第二类响应DRESP2

2


如果遇到第一类响应解决不了的问题,要优先考虑使用第二类响应。这样估计可以解决99%的优化问题了。第二类响应是第一类响应的代数表达式,OptiStruct自带了很多常用公式,如下图: 


 


您也可以编写自己的公式,例如计算点到平面距离的公式:


 


公式可能相当复杂,这时可以选择使用脚本生成公式卡片或者在fem文件里面填写或者把整个公式写成一行(脚本里面的str1),然后使用下面的这个脚本进行格式调整。


 


运行结果就是一个DEQATN卡片,复 制到fem文件即可(id号可能需要自己更改)


 


为了简化复杂的方程,可以把复杂的方程分成几个方程来实现,但是要注意的一点是所有参数必须写在第一行,后面的表达式直接用就可以了,通常最后一行是方程最终的返回值。


m1(x1,x2,x3,x4) = max(x1,x2);

m2 = max(x3,x4);

myavg = (m1 + m2)/2;


第三类响应DRESP3

3


如果你遇到了前面两类响应无法解决的那1%,那么还有第三类响应,也就是借助外部程序来完成响应计算。


DRESP3可以使用 Compose / EXCEL / c / c++ / FORTRAN 来创建。但这只是表面上的限制,实际上程序都是可以互相访问的,比如你熟悉python,那么不用遗憾这里没有python,因为可以通过Compose去调用python完成响应的创建,中间需要访问文件或者数据库或者再调用别的程序都是允许的。


是否能提供灵敏度给OptiStruct优化引擎对优化的速度有很大影响,DRESP1/2都是自动提供的。而DRESP3大多数情况都提供不了,这也是DRESP3的速度比DRESP1/2慢很多的原因。


选择响应的几个原则


  • 刚度优先,例如应变能和加权应变能

  • 全局性响应优先,例如模态频率/体积/体积分数

  • 鲁棒性高的响应优先,例如应力,高阶模态频率等要慎重


常见的优化问题设置有


  • 位移+体积(百分比)

  • (加权)应变能+体积(百分比)

  • 频率+体积(百分比)


考虑到创建响应的复杂性,所以本讲选择大家最熟悉的简单模型,把注意力集中在响应上。


 


案例讲解


初始问题模型

1


 


优化三要素:

目标:最小化体积百分比

约束:加载点位移 < 0.07

设计变量:所有单元


这种体积+位移的优化设置是最容易得到结果的,因此得到了广泛的应用。


拓扑优化的结果如下:


 


优化前最大位移0.032  =>  优化前最大位移0.07

优化前最大应力35MPa =>  优化前最大应力69.8MPa


施加应力约束

2


可以通过施加通用应力约束考虑应力


 


或者选择施加精确应力约束:


 


 


不同应力约束的优化效果如下(密度阈值都是0.3):


 


从上图可以看出,应力要求高了,剩余材料自然就多了。


通用应力约束自动过滤应力奇异的单元(不影响后续优化迭代),这是老方法,也是比较稳健的方法,建议大部分情况下使用。


精确应力约束的优点是应力约束被严格满足,但是这种用法必须要小心地把应力奇异的单元排除在外,否则将无法得到优化结果。


本次的优化的应力结果如下图:


 


影响刚度的因素是全局的,而影响局部应力的因素往往是局部。所以设计初期主要考虑刚度,兼顾强度。刚度设计好了,相当于身体强壮了,局部应力问题解决起来也就容易了。


如何降低应力

4


接下来讲怎么降低应力,先根据拓扑优化结果得到一个新设计,然后使用形状优化对设计进行微调将应力水平降低。新模型如下:



 


优化三要素:

目标:最小化体积

约束:应力< 50MPa

设计变量:25个形状变量


形状变量使用HyperMorph创建,具体情况请见如下动图:


 


优化结果如下:


黄色线条是优化前,粉色的部分是优化结果。


 


优化后的应力结果如下图:


 


很多时候自由形状优化是降低局部应力集中的更好工具,而且使用更加简单。


只需要将形状变量删掉(不删也可以),然后创建自由形状变量,其它设置不变。


 
 
 


优化结果如下:


 


优化后的应力结果如下:


 


自由形状优化也可以用在3D模型中,而且支持四面体的网格重划分。


创建第三类响应

5


有时希望控制的指标不是有限元求解器的直接计算结果,例如把该问题的位移控制定义为:abs(max1+max2),这时可以使用DRESP2或者使用EXCEL创建第三类响应。


 


在第一个例子的基础上来做。


第一步:创建26个位移响应,需要操作下图26次,每次只换节点。


 


或者运行一个脚本来批量生成,脚本如下:


 


第二步:编写EXCEL文件


文件名是yplus1.xlsx,后面会在HyperMesh中引用。


A列数值先随便给,被OptiStruct调用的时候会被替换成真实响应值。


B2的内容  = MAX(A2:A14)

B3的内容  = MAX(A16:A28)

C2的内容  = ABS(B3+B2)


 


第三步:使用Ctr+f快捷键,然后搜索LOADLIB响应LOADLIB卡片(或者在control card里面找到这个卡片)。 


 


第四步:创建第三类响应


 


点击create后再点击edit把26个响应依次选上(如果要选的很多也可以写脚本或者直接编辑fem文件解决),这里的卡片非常长,界面上看起来像这样(部分):


 


fem文件中显示的卡片:


 


最后的 SENSOPT AUTO 表示灵敏度的计算方法是由差分得到。默认是没有灵敏度(变量和响应多时计算速度会非常慢)。这行卡片需要导出fem文件后手工编辑dresp3卡片,注意编辑卡片的时候要注意每个字段只能放在属于它的那8列。防止出错的简单办法是在上面加一行参考列。


$$111111222222223333333344444444555555556666666677777777888888889999999900000000


更彻底的办法是干脆把整张卡片转换为自由格式,这样编辑起来就容易多了。脚本如下(把要转换成自由格式的卡片复 制到顶上大括号内即可): 


 


转换结果如下:


DRESP3,28,disp_df,ELIB,disp,,

+,DRESP1,2,3,4,5,6,7,8

+,,9,10,11,12,13,14,15

+,,16,17,18,19,20,21,22

+,,23,24,25,26,27

+,CELLIN,A2,A3,A4,A5,A6,A7,A8

+,CELLIN,A9,A10,A11,A12,A13,A14,A16

+,CELLIN,A17,A18,A19,A20,A21,A22,A23

+,CELLIN,A24,A25,A26,A27,A28

+,CELLOUT,C2

+,SENSOPT,AUTO


优化结果如下:


 


如果加上通用应力约束,优化结果如下:


 



Excel的优点是几乎所有电脑上都安装了,而且不用写程序。


 


正解:第二类响应

6


该题目的正解是使用第二类响应。理由是除非第二类响应实现非常困难或者根本无法实现才考虑使用第三类响应解决,而对本题而言几乎没有难度可言。


第二类响应创建步骤如下:


第一步:删除excel优化相关的几个卡片(略)


第二步:创建max1响应(上半部分的最大变形)


 


点击右侧edit输入13个点的响应


 


然后点击create创建。


第三步:和第二步类似,创建max2(下半部分的最大变形)


第四步:创建求和的响应add。


 
 


第五步:创建约束


 


第六步:编辑fem文件,引用约束,在工况部分引用约束id。


 


另外,需要删除或者注释掉如下选中的一行(全局约束):


 


这样就可以开始优化了。优化结果是一样的,但是对于较大的模型来说,时间上可以节约非常多。


如果需要创建的响应的数量比较多,在界面上要选择这些响应进行第二类响应创建的时候选择起来会比较麻烦。可以改为使用DRESP1V,具体可以参考如下视频:




利用Compose创建优化响应

7


创建优化响应的事当然不能少了Compose,特别是针对复杂的问题,使用方法类似EXCEL ,先在这个问题上小试牛刀。


第一步:创建Compose脚本


这个问题比较简单,一行搞定函数体,函数头每次拷贝就可以了。


 


第二步:创建loadlib卡片(Ctrl+f搜索loadlib)


 


第三步:创建DRESP3响应


 


点击create然后点击edit编辑


 


第四步:创建约束


 


然后就可以优化了,结果和前面是一样的(略)。


本来这种简单的情况根本犯不着使用Compose。接下来看一个稍微复杂一点的问题,使用Compose会比使用DRESP2方便很多。


使用Compose解决复杂问题

8


模型如下:

 


优化三要素:

目标:最小化质量

约束1:应力<65MPa

约束2:RBE中心节点到底面的距离<17.8mm

设计变量:板厚


最大的困难在于怎么计算点到平面的距离。因为整个结构都在变形,计算距离时要考虑原始的坐标值和各个方向的变形。如果使用DRESP2来计算这个响应稍微有点麻烦。大家可以在Altair的企业网盘中下载徐自立工程师以前录的操作视频。具体的公式推导过程如下:


 


公式中的ABC三个点定义了一个平面


在Compose中使用100000、110000、130000、120000四个节点的对角线叉乘来定义平面的法向n。n与PA矢量点乘即可得到想要的距离值。关键的公式只有如下几行:


      db = b - d;

      ac = c - a;

      pc = c - p;

      normal = cross(db,ac);

      unit_normal = normal/norm(normal);

      dist = abs(dot(unit_normal,pc))


需要从OptiStruct向Compose传递30个参数。完整程序如下(前面30行只是给参数取个别名方便后面引用),也可在文末下载附件查看具体参数:


向下滑动浏览

function [rresp, dresp, udata] = mydist(iparam, rparam, nparam,  ...

iresp, rresp, dresp, nresp, isens, udata)

      a_dx = rparam(1);

      a_dy = rparam(2);

      a_dz = rparam(3);

      b_dx = rparam(4);

      b_dy = rparam(5);

      b_dz = rparam(6);

      c_dx = rparam(7);

      c_dy = rparam(8);

      c_dz = rparam(9);

      d_dx = rparam(10);

      d_dy = rparam(11);

      d_dz = rparam(12);

      p_dx = rparam(13);

      p_dy = rparam(14);

      p_dz = rparam(15);

      % coordinates

      a_x = rparam(16);

      a_y = rparam(17);

      a_z = rparam(18);

      b_x = rparam(19);

      b_y = rparam(20);

      b_z = rparam(21);

      c_x = rparam(22);

      c_y = rparam(23);

      c_z = rparam(24);

      d_x = rparam(25);

      d_y = rparam(26);

      d_z = rparam(27);

      p_x = rparam(28);

      p_y = rparam(29);

      p_z = rparam(30);


% final coordinate of node p,a,b,c

      ax_all = a_x + a_dx;

      ay_all = a_y + a_dy;

      az_all = a_z + a_dz;

      bx_all = b_x + b_dx;

      by_all = b_y + b_dy;

      bz_all = b_z + b_dz;

      cx_all = c_x + c_dx;

      cy_all = c_y + c_dy;

      cz_all = c_z + c_dz;

      dx_all = d_x + d_dx;

      dy_all = d_y + d_dy;

      dz_all = d_z + d_dz;

      px_all = p_x + p_dx;

      py_all = p_y + p_dy;

      pz_all = p_z + p_dz;

 

% coordinates include displacements

      p = [px_all,py_all,pz_all];

      a = [ax_all,ay_all,az_all];

      b = [bx_all,by_all,bz_all];

      c = [cx_all,cy_all,cz_all];

      d = [dx_all,dy_all,dz_all];

      % calculate unit normal vector of plane abc

      db = b - d;

      ac = c - a;

      pc = c - p;

      normal = cross(db,ac);

      unit_normal = normal/norm(normal);

      % alculate a vector from node c to node p

      dist = abs(dot(unit_normal,pc))

      rresp(1) = dist;

end


详细操作过程如下:


第一步:创建Compose脚本


第二步:创建loadlib卡片


 

第三步:创建DRESP3响应


 
 

DRESP3卡片比较长,具体请下载fem文件查看。


第四步:创建约束:


 
 


第五步:创建目标:


 


然后就可以优化了。


优化前后的情况:


优化前:

 


优化后:

 


还可以使用c/c++语言,但是通常Compose是更好的选择。




实际工程中会碰到复杂得多的问题,主要的麻烦之一就是创建响应,特别是怎么确保Compose的程序运行无误。你可以先在Compose中进行debug,传过的参数就是一个1xn的矩阵,所以测试调用的时候只需要写成:


res = mydist([1,2,3,4等等])


如果不事先在Compose把程序调好,那么后续会遇到很多麻烦。


上面c语言的例子演示了如何把相关的数据写入到临时文件进行检查,对Compose等语言也是适用的。


本讲虽然看起来只是变着花样玩一块板子,实际上有较高难度。用例子进行演示是因为,例子是带你入门的最好方式。如果你希望提高自己的优化水平,建议你亲手完成一次,那时你才知道自己到底有没有“掌握核心科技 “。


 


来源:Altair澳汰尔
OptiStructHyperMesh碰撞形状优化拓扑优化二次开发通用UGpython材料控制Altair
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-03-26
最近编辑:8月前
Altair澳汰尔
澳汰尔工程软件(上海)有限公司
获赞 142粉丝 477文章 746课程 4
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈