【HyperWorks优化案例】之基于Compose和HyperStudy的喷灌水量均匀性分析及优化
- 技术邻 >
- CAE仿真 >
- HyperWorks
首先让我们来欣赏下面这张照片,这是Altair张北草原团建时留下的美丽风景。
假设我们要灌溉这样一片草坪。随着时代的进步,人工成本的上涨和水资源的紧缺,喷灌相对人工洒水的优势不言自明。
本文使用 Altair Compose™进行水量均匀性分析,使用 Altair HyperStudy™ 优化喷头安装位置。优化目标是使各个位置得到水尽可能平均。
输入条件
▪喷头的距离-水量特性曲线;
▪草坪的起伏形状;
▪喷头的数量;
▪可供安装喷头的位置等。
简单起见,本文假设所有喷头都是一样的。
1.喷头的距离-水量特性曲线
可以通过实验测试得到,只需要从喷头位置到最远喷水距离的某条半径线上放置一系列量杯并在实验后记录每个量杯距离喷头的距离和接到的水量即可。
以下代码中的x是到喷头的距离,y是对应位置的量杯测到的水量。为方便后续计算,把距离-水量特性曲线拟合为一条三阶多项式。
对应的Compose拟合代码如下:
测量和拟合得到的喷头的水量特性曲线如下:
对应的多项式如下:
2.草坪的起伏形状
起伏可以通过 Altair HyperMesh划分网格后导出为FEM文件得到。整个草坪的水量分布可以通过计算网格点的水量得到,模型如下:
处理后的节点坐标文件格式如下, x,y,z坐标值用逗号分割:
3.喷头数量及位置
假设喷头如下图中的最底部框中的节点所示一共21个,每个喷头可以在所在列的节点中选一个进行安装,如蓝色箭头所示。
这里的id号顺序是有地理位置方面的意义的(杂乱无章的id会把优化算法搞糊涂的),节点的id号就是后续HyperStudy中的设计变量。
这个优化的求解器是 Altair Compose(免费版即可),计算喷灌水量均匀性的代码如下(短小精悍又有注释,不解释了哈)
优化过程需要反复调用该代码计算,所以必须后台执行Compose脚本,测试方法如下:
▪打开dos命令行窗口,开始计算前目录下的文件如下:
▪输入如下三条命令,前面两条只是进入目录,最后一句才是执行Compose脚本的命令。
▪如果命令执行后目录下多出两个文件,说明运行成功了。
variance.txt文件里面只有一个数值,代表水量分布均匀性的方差。depth.txt文件里面是所有节点的水量值,用于后处理显示。
接下来该HyperStudy上场了
(优化部分正式开始···)
喷头位置参数化
设计变量的范围是离散变量,需要在HyperStudy进行设置。
如果希望喷头可以安装在草坪的任意位置,只需要把每个喷头的x和y坐标作为变量,z坐标需要通过后台运行HyperMesh的tcl脚本得到(创建一个临时节点,沿着z向投影至曲面,最后返回该节点的坐标即可)。
计算还需要草坪坐标文件和oml脚本,可以让HyperStudy每次自动copy到计算目录。
优化的详细操作步骤如下:
1.模型参数化
这里需要进行参数化的文件是喷头安装位置文件spray_location.txt。也可以选择把这些数据放入oml文件,那样的话就参数化oml文件,可能这样更符合大家的思维习惯。参数化前文件如下,每行代表一个用于安装喷头的节点编号:
参数化可以使用HyperStudy中的Editor工具,也可以直接使用文本编辑器或者用你熟悉的编程语言处理(如果你想到的是excel,我也没意见)。参数化之后的spray_location.tpl文件如下:
2.注册求解器
只需在HyperStudy的Edit/Solver Script下拉菜单弹出对话框中添加一行。
3.定义优化模型
因为计算需要另外两个文件,需要进行Add Resource操作,也就是每次计算前把这两个文件复制到当前文件夹,结果如下图所示。
然后,在HyperStudy中设置如下求解模型,所有模型都是在当前目录进行的。
4.设置变量范围
这里需要参考HyperMesh中的节点编号来进行。模型已经在HyperMesh 中按空间位置对节点ID进行了重编号,这样有意义的编号可以让HyperStudy更有效地工作 。
如上图所示,变量spary_10对应100至110这一列节点。
5.测试运行
如果前面都做对了,这里直接点一下Run Definition即可完成计算,工作目录下会生成两个新的文件。
6.创建方差响应
直接把run_00001/m_1目录下生成的variance.txt文件拖入图形区,在弹出对话框中全部使用默认选项即可得到数值。
7.添加一个优化
目标定义为方差最小。
8.优化算法
优化算法选择GRSM,设置迭代次数为100。
优化迭代曲线如下:
优化结果的方差是15.753086。对应优化设计的喷头所在节点ID如下:
为了显示方便
可以在最终喷头位置绘制一个小球
只需要如下几行tcl脚本:
每个迭代目录下都有完整的计算输入和结果文件。
最优解的水量云图如下
绘制云图需要结果数据,具体而言有如下三种方法:
A.使用HyperMesh中的Matrix Browser
B.写成ASCII格式的结果文件,用HyperView查看
C.直接使用Compose把结果数据写成h3d文件
这里选(C),这是最新技术(需要使用商业版Compose软件),代码如下:
本文的详细操作就不再提供视频了,只要下载了spray.hstx,用HyperStudy后一切就都在眼前了。
Q:灵魂提问——哪里做得还不够好呢?
1、网格太粗,导致结果不够精确(导致结果中2,3,4,5列的喷头过于聚集)。
2、没有考虑向上坡方向喷射的距离会比下坡方向短(这个处理起来比较麻烦,需要测试不同坡度下的距离-水量曲线,Compose计算过程也相应变复杂)。
3、喷头只能在一条曲线的特地节点位置安装(解决方法前面讲过了)。
4、喷头数量没有作为变量(可以对不同数量的喷头分别进行优化)。
5、没有限制最小水量和最大水量(解决办法是让Compose输出最小水量和最大水量,然后在HyperStudy中创建约束)。
其实还有更好更简单的解决方案,比如把喷头的覆盖区域设计成正方形或长方形,然后优化喷射距离内的水量分布尽可能均匀。这样,布置喷头就变成了铺地砖了。
醉翁之意不在酒,想必你读完本文后也不会去优化喷灌系统,但是优化、Compose、tcl二次开发脚本、生成h3d等技能说不定哪天会用得上。写完喷灌系统优化,作者脑海里闪现的是蒲公英的样子。
文章来源:Altair官方技术博客