设计变量是优化设计的三要素之一,是优化模型定义的基础。对于飞机整体粗有限元模型,长桁、框等间隔区域即一个单元。建立尺寸优化设计模型时,要对每一个单元建立一个设计变量。对于蒙皮需要建立二维单元的设计变量,设计变量需要关联单元的初始厚度,单元的属性,单元的偏置量。对于长桁一般为杆单元,设计变量需要关联单元的初始面积,单元的属性。对于框等结构一般为梁单元,设计变量需要关联单元的初始面积、初始惯性矩、扭矩、单元属性、单元的偏置量,且要反映优化过程中梁单元的惯性矩的变化。对于大型尺寸优化设计模型,例如机翼翼盒、机身等结构,这些内容如果通过手动创建,效率低、易出错。HyperMesh提供了其二次开发工具TCL\TK,并且也提供了已经开发好的基于TCL的函数库。通过二次开发工具,可以快速的实现设计变量的自动创建,效率高、正确性高、易于修改、移植、维护。
1 自动创建尺寸优化设计变量的功能实现
首先建立一个命名空间组织整个程序的框架。通过界面指定所有的已知输入信息,方便数据正确输入及修改;建立杆、梁、壳单元的过程;通过界面指定所有的已知输入信息。
##关联HyperWorks GUI Toolkit (HWT)
package require hwt;
##建立命名空间,定义相关变量,相关过程。
namespace eval ::ALTAIRPD::Aero {
variable DLL 3.5;
variable DUL 12.0;
variable SIFW 22;
variable SWH 60;
variable SOFW 67;
variable WTR 0.95;
variable IFTR 1.4;
proc GUI {args } {
}
proc create_dv_for_PROD {args} {
......
}
proc create_dv_for_PBAR {args} {
......
}
proc create_dv_for_PSHELL {args} {
......
}
}
::ALTAIRPD::Aero::GUI;
1.1 输入界面
定义输入界面,方便用户输入、修改相关信息。相关代码如下所示。
proc GUI {args } {
variable frm_mainWnd .createcube
# 创建主界面窗口
catch {destroy .createcube}
::hwt::CreateWindow createcube \
windowTitle "Create Desvar For PBAR" \
geometry 350250 \
minSize 100 100 \
-noGeometrySaving \
-acceptButton "Create" \
-acceptFunc "::ALTAIREPM::Aero::create_dv_for_PBAR" \
-noCancel
::hwt::PostWindow createcube
##创建框架
set frm_v1 [::hwt::WindowRecess $frm_mainWnd]
pack $frm_v1 -side top -fill both -expand yes -anchor nw
set n_labelWidth 26
set n_entryWidth 20
##创建输入框
AddEntry $frm_v1.ety0 \
-label "Desvar Lower Limit:" \
-labelWidth $n_labelWidth \
-entryWidth $n_entryWidth \
-validate real \
-textvariable "::ALTAIREPM::Aero::DLL" \
-afterFunc "" \
-state normal
}
相关代码产生效果如图1 所示。
图1 输入窗口界面
生成设计变量有三种方法,一是直接在界面生成,这种方法对于大量变量基本不可行。二是通过TCL在界面里直接生成,此种方法在TCL程序实现较麻烦,且难以控制输出格式,不易排查错误。三是通过TCL程式生成设计变量的Bulk data的卡片形式,这样就把问题转化为生成文本,且生成变量具有重复性,极易方便程序实现。且方便自己定义卡片格式,方便变量定义,方便问题检查。
下面主要以二维单元变量定义方法为例,相关代码定义如下。
set output_desvar ""
set output_desvar_file ""
##选取需要定义设计变量的单元
*createmarkpanel elems 1 "Please selec elems";
set ElemList [ hm_getmark elems 1 ];
##取的每个单元的属性,厚度、面积、惯性矩等信息
foreach one_of_elelist $ElemList {
set propID [hm_getentityvalue elems $one_of_elelist propertyid 0 -byid];
##壳单元,获取单元厚度
set elemt [hm_getentityvalue properties $propID "\$PSHELL_T" 0 -byid];
##杆单元,获取单元面积
##set pbar_A [hm_getentityvalue properties $propID $\PROD_A 0 -byid];
##梁单元,获取单元面积,惯性矩
set pbar_A [hm_getentityvalue properties $propID $\PBAR_A 0 -byid];
set elem_offset_ay [hm_getentityvalue elems $one_of_elelist "offsetay" 0 -byid];
set elem_offset_by [hm_getentityvalue elems $one_of_elelist "offsetby" 0 -byid];
##定义相关变量ID
set DESVARID $one_of_elelist
set DESVARID1 [string replac $one_of_elelist 0 0 71]
##定义变量
append output_desvar "DESVAR $DESVARID $DESVARID $elem_t$DLL_skin $DUL_skin" \n;
##关联属性
append output_desvar "DVPREL1 $DESVARID \PSHELL $one_of_elelist 4 0.0 " \n;
append output_desvar "+ $DESVARID1.0 " \n;
##定义偏置量
append output_desvar "DVPREL1 $DESVARID1\PSHELL $DESVARID ZOFFS 0.0" \n;
append output_desvar "+ $DESVARID -0.5" \n;}
##输出相关设计变量定义
set StartDir [file dir [info script]];
set output_desvar_file \
[open "$StartDir/$partname\_desvar_section_rib$rib_id1\_to_section_rib$rib_id2\.fem" "w"];
puts $output_desvar_file $output_desvar;
close $output_desvar_file;
最终结果生成一个定义变量的文本文件,然后可以通过输入、或者直接提交计算检验生成结果的正确性。生成效果如图2、3所示。
图2 壳单元尺寸优化设计变量
图3 梁单元单元尺寸优化设计变量
通过HyperMesh的二次开发工具及相关的函数实现了快速生成大规模尺寸优化设计模型的设计变量的定义。同时此方法可以推广到设计响应、设计约束的定义,对于类似的其它类型优化的问题,也可应用此方法。
3 参考文献
[1] HyperMesh.Reference Guide