【问题标题】:Inconsistent output from Abaqus ODB using Python scripting使用 Python 脚本的 Abaqus ODB 输出不一致
【发布时间】:2018-03-05 12:38:36
【问题描述】:

我正在使用 python 脚本从 Abaqus FE 模型中提取和发布处理结果,但在处理 odb 文件中的数据时遇到不一致。下面给出一个例子。

odbObj = session.openOdb(name=JobName+'.odb', readOnly=True)
step = odbObj.steps['LC5']
set = odbObj.rootAssembly.instances['DETAILEDTOPPLATE-1#TOPPLATE-1'].nodeSets['FD3_N1A']

>>> print 
step.frames[1].fieldOutputs['S'].getSubset(region=set,position=
   ELEMENT_NODAL,elementType='S8R').bulkDataBlocks[0].data
[[  1.29479978e-42  -2.41047720e+07   0.00000000e+00   3.10530625e+05]
 [ -1.08975990e+07  -2.39987960e+07   0.00000000e+00   3.74051719e+05]
 [ -1.10543630e+07  -2.40516500e+07   0.00000000e+00   3.66518000e+05]
 [ -1.10951790e+07  -2.41662480e+07   0.00000000e+00   3.20761438e+05]]
>>> print
step.frames[1].fieldOutputs['S'].getSubset(region=set,position=
   ELEMENT_NODAL,elementType='S8R').bulkDataBlocks[0].data
[[  4.87651866e-43  -2.41047720e+07   0.00000000e+00   3.10530625e+05]
 [ -1.08975990e+07  -2.39987960e+07   0.00000000e+00   3.74051719e+05]
 [ -1.10543630e+07  -2.40516500e+07   0.00000000e+00   3.66518000e+05]
 [ -1.10951790e+07  -2.41662480e+07   0.00000000e+00   3.20761438e+05]]
>>> print 
step.frames[1].fieldOutputs['S'].getSubset(region=set,position=
   ELEMENT_NODAL,elementType='S8R').bulkDataBlocks[0].data
[[  5.60519386e-45   5.60519386e-45   2.38220739e-44   1.92838405e+31]
 [  5.42138869e-11   1.77519978e+28   1.25672711e-14   3.72739562e+05]
 [ -1.10543630e+07  -2.40516500e+07   0.00000000e+00   3.66518000e+05]
 [ -1.10951790e+07  -2.41662480e+07   0.00000000e+00   3.20761438e+05]]
>>> print step.frames[1].fieldOutputs['S'].getSubset(region=set,position=
ELEMENT_NODAL,elementType='S8R').bulkDataBlocks[0].data
[[  2.24207754e-44   5.60519386e-45   0.00000000e+00   3.10530625e+05]
 [ -1.08975990e+07  -2.39987960e+07   0.00000000e+00   3.74051719e+05]
 [ -1.10543630e+07  -2.40516500e+07   0.00000000e+00   3.66518000e+05]
 [ -1.10951790e+07  -2.41662480e+07   0.00000000e+00   3.20761438e+05]]

从上面可以看出,即使调用完全相同,数组也不一致,因此数据应该相同。我可以理解并接受非常小的数字会有所不同,但所有数字的大小都会发生变化。

我希望有人可以帮助解决这个问题或提供解决方法。

提前致谢。

基于 cmets 的附加信息。

提出了两种解决方法(下面显示的示例是与上面不同的数据集)。方法1)解决了问题。

1) tmp=x.bulkDataBlocks 完成这项工作

tmp=step.frames[1].fieldOutputs['S'].getSubset(
   region=set,position=ELEMENT_NODAL,elementType='S8R').bulkDataBlocks
print tmp[0].data
[[-20119512.     -7074813.5           0.     -2039073.375]
 [-20130472.     -7037518.            0.     -1930314.125]
 [-20122654.     -6948099.            0.     -2073283.625]
 [-20107980.     -6968545.5           0.     -1941211.375]]
print tmp[0].data
[[-20119512.     -7074813.5           0.     -2039073.375]
 [-20130472.     -7037518.            0.     -1930314.125]
 [-20122654.     -6948099.            0.     -2073283.625]
 [-20107980.     -6968545.5           0.     -1941211.375]]
print tmp[0].data
[[-20119512.     -7074813.5           0.     -2039073.375]
 [-20130472.     -7037518.            0.     -1930314.125]
 [-20122654.     -6948099.            0.     -2073283.625]
 [-20107980.     -6968545.5           0.     -1941211.375]]

2) tmp=np.copy(x.bulkDataBlocks) 这使得更加不一致

tmp=np.copy(step.frames[1].fieldOutputs['S'].getSubset(
   region=set,position=ELEMENT_NODAL,elementType='S8R').bulkDataBlocks)
print tmp[0].data
[[  2.24207754e-44   5.60519386e-45   0.00000000e+00  -1.78478850e+06]
 [ -1.63939740e+07  -7.07835200e+06   0.00000000e+00  -1.76956088e+06]
 [ -1.63960690e+07  -7.07548150e+06   0.00000000e+00  -1.79225850e+06]
 [ -1.63969780e+07  -7.07681000e+06   0.00000000e+00  -1.79695375e+06]]
print tmp[0].data
[[  1.68155816e-44   5.60519386e-45   0.00000000e+00  -1.78478850e+06]
 [ -1.63939740e+07  -7.07835200e+06   0.00000000e+00  -1.76956088e+06]
 [ -1.63960690e+07  -7.07548150e+06   0.00000000e+00  -1.79225850e+06]
 [ -1.63969780e+07  -7.07681000e+06   0.00000000e+00  -1.79695375e+06]]
print tmp[0].data
[[  5.60519386e-45   5.60519386e-45   0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00]]

【问题讨论】:

  • 查看 `fieldobject.values[i].data 会得到什么?
  • 我也直接得到了不一致的结果索引bulkDataBlocks。我的解决方法是设置foo = x.bulkDataBlocks,print foo[0].data 这似乎表明bulkDataBlocks 的_getitem_ 方法在某种程度上是错误的。
  • 使用 foo=x.bulkDataBlocks 的解决方法完成了这项工作,我现在拥有一致的数据。非常感谢丹尼尔 F!
  • 哦,这很清楚。您 np.copy 一个 Abaqus 对象而不是其中的数据。我不知道为什么这甚至可能...尝试 tmp=step.frames[1].fieldOutputs['S'].getSubset(region=set,position=ELEMENT_NODAL,elementType='S8R').bulkDataBlocks tmp_data= np.copy(tmp[0].data) #这就是你的数组。
  • 从C++ docs data 属性fieldBulkData 对象是一个指针。从奇怪的表现来看,这很可能是一个 relative 指针,它没有被python 的本机或numpy 修改的_getitem_ 方法正确处理,但被abaqus 正确处理的sequence 对象的_getitem_ 方法。但是你不能使用那个方法,除非你有一个sequence——如果你尝试直接索引bulkDataBlocks,你使用python的_getitem_。也许?

标签: python abaqus


【解决方案1】:

您可能正在查看外推错误(这可能是由您的网格或分析设置问题引起的)。请注意,ELEMENT_NODAL 数据通常是在每次请求数据时从分析中使用的积分点推断出来的,除非它已明确存储为作业的字段输出。

有关详细信息,请参阅Abaqus Scripting User's Guide(第 10.10.8 节):

如果在指定的 odb_Enum::ELEMENT_NODAL 或 odb_Enum::CENTROID 位置的输出数据库中找不到请求的字段值,则它们是从 odb_Enum::INTEGRATION_POINT 位置的字段数据推断出来的。

【讨论】:

  • 可能是。如果你重复它,你会认为推断是一样的。
  • 这可能是问题所在。我做了一个小测试,只从集成点请求数据,这似乎不是问题。 1e-6 到 1e-50 范围内的非常小的数字仍然会发生变化,但这没关系。正如 agentp 提到的,您会认为在重复呼叫时推断是相同的。我想我会更深入地研究这个问题并返回任何有用的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多