图187:
预处理部分的结构
 |
图188:
属于给定节点的所有单元的数据结构
 |
图187显示了预处理部分的结构。首先,确定属于同一节点的所有单元,并存储在图188所示的数据结构中。然后,程序流程根据设计变量是坐标还是材料方向进行分支。
对于坐标设计变量,执行以下步骤:
- 确定结构的外部面,并以图175所示的数据格式以及图189所示的数据格式存储(findextsurface.f)
图189:
存储外部面类型和属于该面的节点的数据结构
 |
- 将给定节点所属的所有外部面存储在字段iponoelfa和inoelfa中,根据图190所示的数据结构(extfacepernode.f)
图190:
属于给定节点的所有外部面的数据结构
 |
- 将设计变量(即节点)按升序存储在字段nodedesi(*)中。设计变量的总数为ndesi(getdesiinfo.f)
- 将属于同一设计变量的所有单元存储在字段istartdesi和ialdesi中,根据图191所示的结构(elemperdesi.f)
图191:
属于特定设计变量的所有单元的数据结构
 |
- 计算外部表面的法向。在设计变量处,这是节点移动的方向,也是计算灵敏度的方向。在每个节点只能有一个法向。这是该节点所属所有外部面上法向的平均值。如果在*FILTER卡片上激活了EDGE PRESERVATION=YES参数,则仅考虑"设计变量域"内部的外部表面来计算法向。如果一个外部表面超过一半的节点是设计变量,则该外部表面"内部"于"设计变量域"(normalsonsurface_se.f)。
- 计算外部表面的法向。虽然这似乎与前一项相同,但实际上不同。这里计算的法向是优化过程中网格修改所需要的。通常,灵敏度研究的性能本身不是目标,而是优化循环的一部分,在每次迭代中重新计算灵敏度(关于设计变量的目标函数导数),并用于最速下降或共轭梯度等优化策略。在每次迭代结束时,设计变量沿法向方向(在前一项中计算)移动一小步,其他节点不在法向方向移动。这会使网格变形并可能导致不良单元。因此,需要改进网格,例如使用拉普拉斯算子。然而,在操作过程中不应改变结构的外部表面。后者可以通过基于局部法向定义多个点约束来处理。确实,现在可能需要多个法向,例如在需要保留的尖角处。因此,这里确定法向的方式(normalsforequ_se.f)与normalsonsurface_se.f中的方式不同。方程存储在输入文件jobname.equ中以供进一步使用。
- 确定活动节点,即属于单元的节点(createinum.f),并将normalsonsurface_se.f中确定的法向以frd格式存储在jobname.frd中(frd_sen.c)。
- 确定属于同一单元的两个节点之间的最小距离distmin。基于此距离导出一个度量(max(distmin/1.e6,1.e-8)),用于通过有限差分逐单元计算灵敏度(smalldist.f)。
对于方向设计变量,执行以下步骤:
- 将方向设计变量存储在jobname.dat文件中。每个局部方向恰好导致三个设计变量,它们是描述方向的旋转矢量的分量(writedesi.f)。
- 确定与给定方向对应的所有单元。它们以与字段iponoel(*)和inoel(2,*)完全相同的方式存储在字段ipoorel(*)和iorel(2,*)中,用于存储给定节点所属的所有单元,参见图188(elemperorien.f)。
- 将属于同一设计变量的所有单元存储在字段istartdesi和ialdesi中,根据图191所示的结构(elemperdesi.f)。这与坐标是设计变量的情况类似。
以下四个例程对于坐标设计变量和方向设计变量都是通用的:
- 首先确定每个单元的设计变量,并将其存储在字段istartelem(*)和ialelem(*)中,方式与字段istartdesi(*)和ialdesi(*)用于存储每个设计变量的单元完全相同,根据图191(desiperelem.f)。
- 确定实际外载荷(tempload.f)
- 确定灵敏度矩阵df的矩阵结构,并使用变量irows(*)和jqs(*)存储。灵敏度矩阵用于存储∂Fext/∂s、∂Fint/∂s、∂K/∂s·U或其组合。维度为neq × ns,其中neq是独立自由度的数量,ns是设计变量的数量。该矩阵非常稀疏,因为只有设计变量所属的节点的自由度才会非零。非零值按每列升序行号逐列存储。字段irows包含相应的行号(大小=非零值的总数),字段jqs(i)包含irows中属于列i的第一个条目的位置。
- 字段df中的每个自由度对应于特定节点中的特定方向。在gennactdofinv.f中确定字段nactdofinv(i),以自由度的形式给出方向和节点(node-1)*mt+direction,其中mt是方向的最大数量(=mi(2),参见变量列表及其含义)+1。
此时,预处理部分根据目标是特征值还是Green函数分裂。在这种情况下,从文件读取特征值、振型、刚度矩阵和质量矩阵(在之前的*FREQUENCY或*GREEN步骤中生成),或者目标是质量、应力或形状能量。在这种情况下,从文件读取刚度矩阵和矩阵结构(在之前的*STATIC步骤中生成)。