在 abaqus 中为几个 odb 沿路径提取应力

问题描述

我在 abaqus 中建模了 5 个模型。现在我想通过Abaqus python脚本打开odbs并在不同路径中提取数据。但是我不能一起打开odb。怎么写才能把所有的odbs一起打开?我可以创建路径,但是如何从我的 5 个模型的相同路径中提取应力?提前致谢。

import visualization
from abaqus import *
from odbaccess import openOdb
#-----------------------------
l1 = [200.0,200.0]  
height = [1000.0] 
l2 = [200.0,200.0]  
T1 = [20.0,25.0]   
delta_t= [20.0,25.0]
multiplied_list = [element * 4 for element in delta_t]
partition_datum_plane_XY = [750.0,1080.0,1250.0,1786.0]  
#------------------------------

# list of ODB-Files
odb_names = ['Para_Analysis_H_1000_W_200_t1_40_T1_20.odb','Para_Analysis_H_1000_W_200_t1_50_T1_30.odb','Para_Analysis_H_1000_W_200_t1_30_T1_15.odb']  # Dummy list 
path='./'
odbs = [1]*len(odb_names); 
vips = [1]*len(odb_names); 
for s,odb_name in enumerate(odb_names):    
    print('\n\nlooping for %s ODB...'%odb_names)     
    vips[s] = session.Viewport(name='Girder Viewport_%d'%(s+1))     
    odbs[s] = session.openOdb(name=odb_name)

    path=session.Path(name='Path-1',type=POINT_LIST,expression=((l1[i],T1[i],partition_datum_plane_XY[0]),(l1[i],partition_datum_plane_XY[1]),t1[i],multiplied_list[i]+partition_datum_plane_XY[1]),partition_datum_plane_XY[2])))
    
    pth=session.path['Path-1']
    vips[s].setValues(displayedobject=odbs[s])
    newXYData=session.XYDataFromPath(name=xyName,path=pth,includeIntersections=TRUE,shape=UNDEFORMED,labelType=TRUE_disTANCE,step=1,frame=1,variable=(('S',INTEGRATION_POINT,((COMPONENT,'S11' ),)),))
    session.writeXYReport(fileName='%s.txt'%name,xyData=(newXYData,))  

解决方法

Abaqus 将某些特定类型的对象存储在 Repository 中。因此,无论何时创建这些对象,该对象的名称都必须是唯一的。 Abaqus 对象示例,xy plotviewportspathsstepsmodels 等。

其次,要使用abaqus特定的常量,如DEFORMED、UNDEFORMED(capital variables),you have to importabaqusConstants`模块。

我只是查看了您的代码并做了一些更改。

import odbAccess
from abaqus import *
from abaqusConstants import *
from viewerModules import *
from driverUtils import executeOnCaeStartup

#Variables
l1 = [200.0,200.0,200.0]  #Bottom flange length
height = [1000.0,1000.0,1000.0] #Total height
X_coord=0.0
Y_coord=0.0
Z_coord=0.0

# odb_names --> list of ODB names for which to access the data from
odb_names = ['Para_Analysis_H_1000_W_200_t1_40_T1_20.odb','Para_Analysis_H_1000_W_200_t1_50_T1_30.odb','Para_Analysis_H_1000_W_200_t1_30_T1_15.odb']
viewp = session.currentViewportName
viewport = session.viewports[viewp]
viewport.makeCurrent()
viewport.maximize()

# Creating the paths - You can change the expressions for the pah.
# These paths are specific to session and NOT to ODB. Hence,if you created once,# you can use it for any number of ODBs. Path name must be UNIQUE.
for i in range(len(l1)):
    session.Path(name='Path-1-Bottom-Upper-Side_%d'%(i+1),type=POINT_LIST,expression=
    ((l1[i],Y_coord,Z_coord),(l1[i]/2,))

    # session.Path(name='Path-1',expression=((l1[i],T1[i],partition_datum_plane_XY[0]),#     (l1[i],partition_datum_plane_XY[1]),(l1[i],t1[i],multiplied_list[i]+partition_datum_plane_XY[1]),partition_datum_plane_XY[2])))

# Dummy list with length of odb_names list. In this we can store the ODB objects
odbs = [1]*len(odb_names);  count_plots = 0
for s,odb_name in enumerate(odb_names):
    print('\n\nlooping for %s ODB...'%odb_name)
    # Opening the ODB
    odbs[s] = session.openOdb(name=odb_name)

    # Setting the ODB to the viewport in DEFORMED state
    viewport.setValues(displayedObject=odbs[s])
    viewport.odbDisplay.display.setValues(plotState=(DEFORMED,))
    # Setting S11 component of stress tot he viewport
    viewport.odbDisplay.setPrimaryVariable(variableLabel='S',outputPosition=INTEGRATION_POINT,refinement=(COMPONENT,'S11'))
    #--------------------------------------------------------------------
    for i in range(len(l1)):
        count_plots = count_plots + 1
        print('Creating plots | %d'%count_plots)
        # Accessing the path created before
        pth = session.paths['Path-node_%d'%(i+1)]
        # Creating the xy plot.
        xyp = session.XYPlot('XYPlot-S11-%d'%(count_plots))
        chartName = xyp.charts.keys()[0]
        chart = xyp.charts[chartName]
        xy1 = xyPlot.XYDataFromPath(name='xy_data_%d'%(count_plots),path=pth,includeIntersections=True,pathStyle=PATH_POINTS,shape=UNDEFORMED,labelType=TRUE_DISTANCE_Z)

        #Plot curve
        c1 = session.Curve(xyData=xy1)
        chart.setValues(curvesToPlot=(c1,),)
        viewport.setValues(displayedObject=xyp)

看到你的代码后,我觉得你有很多关于 Abaqus Python 脚本的东西要学习(如果我错了,请原谅我)。首先,您可以阅读Abaqus Scripting User's Guide,稍后您可以探索Abaqus Scripting Reference Guide