<p>如果你正在寻找类似压力图可视化的东西,你就得写你自己的<code>FieldOutput</code>数据。一般来说,将数据直接输出到外部可视化程序比较容易,但在Abaqus中也可以(如果不是有点复杂的话)。在</p>
<p>一般流程如下:</p>
<ol>
<li><p>生成一个<code>FieldOutput</code>对象;语法是<code>FO = odbModel.steps.values()[-1].frames[-1].FieldOutput(name=data_name, description=data_description, type=SCALAR)</code>,其中</p>
<ul>
<li><code>odbModel</code>是一个打开的<code>Odb</code>对象</li>
<li><code>steps.values()[-1]</code>或命名步骤<code>steps[...]</code>是要输出到的步骤</li>
<li><code>frames[-1]</code>是在这一步中要输出到的最后一帧(或您选择的帧)</li>
<li>^{{cdb}中的{label}与<cdb}的输出{cdb}相当</li>
<li><code>SCALAR</code>是<code>abaqusConstants</code>模块的参数</li>
</ul></li>
<li><p>获取<code>rootAssembly.instance</code>对象及其关联元素<code>elementSet</code>s和<code>sectionAssignment</code>,它们与具有<code>material</code>属性的<code>material</code>有明确链接。</p></li>
<li>用<code>addData</code>命令更新<code>FieldOutput</code>对象;语法是<code>addData(position=CENTROID, instance=instance, labels=labels, data=data)</code>
<ul>
<li><code>CENTROID</code>是<code>abaqusConstants</code>模块中的一个参数(假设你只想在元素质心处有元素密度;如果你真的想要的话,你也可以把它们粘在积分点上)</li>
<li><code>instance</code>是与元素集相关联的实例(或者更广泛地说,是与此材质分配的<code>region</code>)</li>
<li><code>labels</code>是一个整数的iterable(<code>list</code>,<code>tuple</code>),指定要在其中写入数据的关联实例的元素标签</li>
<li><code>data</code>是<code>float</code>s的iterable的iterable,指定数据。在您的例子中,一个单一的密度值意味着<code>data</code>是一个长度为1个iterable的iterable,每个包含一个density值。<code>data</code>的长度必须等于<code>labels</code>的长度,因为{<cd31>}的每个成员都与{<cd28>}中相同位置的{<cd37>}完全对应。在</li>
</ul></li>
</ol>
<p>下面的脚本示例(警告:强烈建议备份<code>.odb</code>,以防出现问题)</p>
<pre><code>import odbAccess
from abaqusConstants import SCALAR, CENTROID # Import constants
odbModel = odbAccess.openOdb(odb_file_path) # Put the file path of the `odb` in odb_file_path
FO = odbModel.steps.values()[-1].frames[-1].FieldOutput(name='Density', description='', type=SCALAR)
# Loop through `rootAssembly.instances`
for instance in odbModel.rootAssembly.instances.values():
valid_materials = [] # Valid material names which have `density`
# Loop through `instance.sectionAssignments` to check if the associated `section` has a `material` with the attribute `density`
for i in range(len(instance.sectionAssignments)):
sectionName = instance.sectionAssignments[i].sectionName
matName = odbModel.sections[sectionName].material
if hasattr(odbModel.materials[matName], 'density'):
valid_materials.append(matName)
sectionNames = [] # Build list of valid section names which are associated with a material which has the attribute `density`
for s in odbModel.sections.values():
if s.material in valid_materials:
sectionNames.append(s.name)
if sectionNames:
# Loop through `sectionAssignments` and get all the `elementLabels` in the `region` of the `sectionAssignment`
for sa in instance.sectionAssignments:
sa_labels = []
if sa.sectionName in sectionNames:
# Get labels
if sa.region.elements is not None:
for e in sa.region.elements:
sa_labels.append(e.label)
# Get material
matName = odbModel.sections[sa.sectionName].material
sa_data = [(odbModel.materials[matName].density.table[0][0],)]*len(sa_labels)
# Update `fieldOutput` object
FO.addData(position=CENTROID, instance=instance, labels=sa_labels, data=sa_data)
# Save odb model. The FieldOutput object only exists as reference from `FO` unless the odb model is saved.
odbModel.save()
odbModel.close()
odbModel = odbAccess.openOdb(odb_file_path) # Reopen the model for visualisation. If you can't find the data_name in the list, expand the model to the step and frame for which the data is saved.
</code></pre>
<p>我不研究密度,但这里有一个例子,输出一个模型的杨氏模量,其中两种材质被指定给不同的元素。在</p>
<p><a href="https://i.stack.imgur.com/bkk7V.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/bkk7V.png" alt="enter image description here"/></a></p>