本节处理简支梁在应力方面的优化问题,并受质量不增加的约束。本示例展示了如何进行优化,过程本身是手动的,绝非优化后的。对于工业应用,通常会编写通用脚本来处理这里解释的手动步骤。
本示例使用文件opt1.inp、opt1.sh、opt2.fbl和op3.inp,均可在CalculiX测试套件中找到。文件opt1.inp包含问题的几何形状和加载:结构是一个简支梁(一端铰接,另一端滚动),中间有点力。图45显示了冯·米塞斯应力。
优化的目标是降低梁中的应力。最高应力出现在梁的中间和支座处(参见图45)。由于梁的几何形状变化不会减少支座处的应力(支座处的峰值应力是由支座的点性质引起的),设计变量集(即允许在优化过程中改变梁几何形状的节点)被选为梁中除支座附近节点外的所有节点。这些排除的节点如图46所示。
为了执行优化,必须确定目标函数相对于设计变量的敏度,同时考虑优化每个中间设计步骤(迭代)中的任何约束。目标函数和约束通常是设计响应。首先,每个设计响应的敏度在*SENSITIVITY步骤中确定。然后,在*FEASIBLE DIRECTION步骤中选择一个设计响应作为目标函数,一个或多个作为约束。在后一步中,将无约束目标的敏度与约束的敏度结合,以获得约束目标的敏度。
设计变量已在前面讨论过,构成允许设计改变的节点集。在本示例的输入卡中,这由以下行处理:
*DESIGNVARIABLES,TYPE=COORDINATE DESIGNNODES"DESIGNNODES"是包含如前所述的设计节点的节点集。对于要优化结构几何形状的优化问题,类型为COORDINATE。或者,可以优化结构中各向异性材料的取向,这由TYPE=ORIENTATION覆盖。
目标函数是要最小化的设计响应。在本示例中,需要最小化从所有设计节点中的冯·米塞斯应力计算的Kreisselmeier-Steinhauser函数(参见*DESIGN RESPONSE中该函数的定义)。同样,由于局部应力奇异性,支座节点不被考虑。目标函数由以下行处理:
*DESIGN RESPONSE, NAME=STRESS_RESP MISESSTRESS,DESIGNNODES,10.,100.在灵敏度步骤中,以及
*OBJECTIVE,TARGET=MIN STRESS_RESP在可行方向步骤的输入卡中。注意,用于定义Kreisselmeier-Steinhauser函数的节点集(*DESIGN RESPONSE卡下的第二个条目)不必与设计变量集相同。*DESIGN RESPONSE卡下的第三个和第四个条目构成Kreisselmeier-Steinhauser函数中的参数。具体来说,第四个条目是参考应力值,应与模型中实际最大应力值的数量级相同。第三个参数允许将最大应力值在模型的较小或较大区域中模糊化。
除了目标函数(只允许一个目标函数)外,还可以在可行方向步骤中定义一个或多个约束。在实际示例中,优化过程中梁的质量不应增加。这由以下内容处理:
*DESIGN RESPONSE, NAME=MASS_RESP MASS,Eall在灵敏度步骤中,以及
*CONSTRAINT MASS_RESP,LE,1.在可行方向步骤中。关于条目的含义,请参阅*DESIGN RESPONSE和*CONSTRAINT。注意,为了使此约束生效,用户应该为相关材料定义密度。在CalculiX中,约束是线性化的。这意味着,根据优化过程中的增量大小,约束将不会精确满足。
在CalculiX运行中,计算了目标和所有约束相对于设计变量的敏度。敏度不外乎是目标函数相对于设计变量的一阶导数(约束也是如此),即敏度显示如果改变设计变量,设计响应将如何变化。对于COORDINATE类型的设计变量,设计变量(即设计节点)的变化方向在局部上垂直于几何形状。因此,在我们的例子中,应力的敏度告诉我们如果沿局部法线方向改变几何结构,应力将如何变化(类似于质量约束)。如果敏度为正,则结构加厚时应力增加,反之亦然。可以通过使用过滤器对敏度进行后处理。在当前输入卡(opt1.inp)中,应用了以下过滤器:
*FILTER,TYPE=EXPLICIT,EDGE PRESERVATION=YES,DIRECTION WEIGHTING=YES 3.选择过滤器为显式。对于默认为线性的过滤器,选择了3的半径(可以将其可视化为每个设计变量中的圆锥体,在其中集成敏度然后模糊),应保持尖角(EDGE PRESERVATION=YES,参见*FILTER),并且具有明显不同方向(例如正交)的表面在过滤时不考虑(或较少考虑,DIRECTION WEIGHTING=YES)。过滤器分别应用于每个设计响应。图47显示了过滤前的应力敏度,图48显示过滤后的应力敏度,图49显示过滤后的质量敏度。所有这些信息都可以通过在*NODE FILE卡下请求SEN获得。