使用python脚本在abaqus中提取节点集坐标

问题描述

我想使用 python 脚本提取节点集坐标。我尝试了两种不同的方法: 第一个来自 odb 文件

import sys
from odbaccess import *
from abaqus import *
from abaqusConstants import *
import __main__

odb = openOdb('C:/Temp/Job-1.odb')
set = odb.rootAssembly.instances['part-1'].nodeSets['Set-1']

numNodes = len(set.nodes)
partlabel=[];
partxcord=[];
partycord=[];
partzcord=[];
for curNode in a.nodes:
    partlabel.append(curNode.label)
    partxcord.append(curNode.coordinates[0])
    partycord.append(curNode.coordinates[1])
    partzcord.append(curNode.coordinates[2])

显示错误是:keyerror:Set-1。 知道当我为实例节点的坐标定义相同的语法时,它可以正常工作。

myInstance = odb.rootAssembly.instances['part-1']

第二种方法是使用 Mdb 命令:

 set = mdb.models['Model-1'].rootAssembly.instances['part-1'].sets[Set-1]

它也不起作用,错误是:Model-1

如果你能帮我解决这个问题,我将不胜感激

解决方法

我使用这两个函数在矩形样本上生成一组已知坐标为 X 的节点(您可以根据节点的坐标更改 if 条件):

def Functions_Set_Face_AC(Face,Name_Face):
       
    modelName1='Model-1'
    mdb.models[modelName1].rootAssembly.Set(faces=Face,name=Name_Face)
    mdb.models[modelName1].rootAssembly.Set(name=Name_Face,nodes=mdb.models[modelName1].rootAssembly.sets[Name_Face].nodes)

    


def Node_Set_X(X,modelName,instanceName):
     """ABAQUS_Fucntion: Set
     defines a set of nodes at the front surface of the specimen
     
     input:
         X: Level of the surface
         (Depending of your coordinate system,it may change. But it should be 
         in direction of the thichness).
         modelName: name of the model
         instanceName: name of the instance
                   """     

         
     X=round(X,6); 
      
     FRONT=[]; 
     for i in mdb.models[modelName].rootAssembly.instances[instanceName].faces:
         a=i.pointOn[0]    
    
         if a[0]== X:
             FRONT=FRONT+[mdb.models[modelName].rootAssembly.instances[instanceName].faces.findAt(((a[0],a[1],a[2]),))]
 
    #Assign set
     Functions_Set_Face_AC(FRONT,'FRONT_X')

然后,在 odb 文件中,您可以使用以下两个函数提取这些节点的坐标以及位移(或任何其他输出): 第二个函数将结果保存到一个 csv 文件中。 (记得提取odb中点坐标的步骤中要激活COORD)

# =============================================================================
# Matrix form 
# =============================================================================

def Give_FieldVariable_matrixform(COORD1,COORD2,COORD3,U1,U2,U3):
    """Give the field varialbe in the form of [[c1,c2,c3,u1,u2,u3],...] 
    
    input:
        COORD1,COORD3: nodal coordinates
        U1,U3: the interested field variable at nodes
        
    Output:
        U: a matrix includes coordinate and field variable
        
    Note:
        this function helps to save this nodal information into a csv file."""
    U=[]    
    for i in range(0,len(COORD1)):
        
        # coordinate
        c1 = COORD1[i][1][1]
        c2 = COORD2[i][1][1]
        c3 = COORD3[i][1][1]
        
        # Field variable
        u1 = U1[i][1][1]
        u2 = U2[i][1][1]
        u3 = U3[i][1][1]
                
        U.append([c1,u3])
        
    return U


# =============================================================================
# Save to a csv file 
# =============================================================================
    
def Extract_FieldVariable_odb(OdbFile,SetName,csvFile):
    """
    This function saves the nodal displacement field of a given set.
    
    Input:
        OdbFile: The odb file (string) eg.: 'Job-1.odb'
        SetName: the name of your set (string)
        csvFile: csv file name (string).
    
    Output:
        A csv file including nodal coordinate and dispalcement in a form of:
            x,y,z,U3
        will be saved in your Work directory
            
    Note:       
        *** You should first open the visualization ***
         ***   You should active CCORD in step ***
            

    """
    
    
    myOdb = openOdb(path = OdbFile)
    nodes=myOdb.rootAssembly.nodeSets[SetName]
    framelen=len(myOdb.steps['Step-1'].frames)


    U1_Fr=session.xyDataListFromField(odb=myOdb,outputPosition=NODAL,variable=(('U',NODAL,((COMPONENT,'U1'),)),),nodeSets=(SetName,))
    U2_Fr=session.xyDataListFromField(odb=myOdb,'U2'),))
    U3_Fr=session.xyDataListFromField(odb=myOdb,'U3'),))
    
    COORD1_Fr=session.xyDataListFromField(odb=myOdb,variable=(('COORD','COOR1'),))
    COORD2_Fr=session.xyDataListFromField(odb=myOdb,'COOR2'),))
    COORD3_Fr=session.xyDataListFromField(odb=myOdb,'COOR3'),))


    Total = Give_FieldVariable_matrixform(COORD1_Fr,COORD2_Fr,COORD3_Fr,U1_Fr,U2_Fr,U3_Fr)
    
    
    np.savetxt(csvFile,Total,delimiter=",")

希望对你有帮助。

,

这可能有点晚了,但无论如何!

在 Abaqus 中,您可以在 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <input type="radio" name="radio_btn" id="radio_1" value="val1"> <input type="radio" name="radio_btn" id="radio_2" value="val2"> <input type="radio" name="radio_btn" id="radio_3" value="val3"> <input type="button" value="Check" onclick="check_radio()"> <script> function check_radio() { switch (document.querySelector('input[name="radio_btn"]:checked').value) { case 'val1': console.log('val1 given'); break; case 'val2': console.log('val2 given'); break; case 'val3': console.log('val3 given'); break; } } </script> </body> </html> 级和 Part 级创建集合。并且您无法从 Instance 级别访问 Part 级别集,反之亦然。
因此,我认为,Instance 节点集必须存在于 'Set-1' 级别而不是 Part 级别。这就是您无法从 Instance 级别访问它的原因。

因此,要访问 Instance 级别集,您可以使用:Part

仅供参考,您可以通过以下方式检查集合是否处于 odb.rootAssembly.nodeSets['Set-1'] 级和 Part 级:
从输入文件中读取:

  1. Instance --> 实例级别设置
  2. *Nset,nset=Set-1,instance=Part-1-1 --> 部分级别设置

在 Abaqus 中打开 ODB:检查 *Nset,nset=Set-1 中的集合

  1. Display group --> 部件级别设置
  2. 'Set-1' --> 实例级别设置
,

感谢您的回答。

SatishThorat,我成功访问了 odb 文件并读取了使用此命令创建的节点集中的输出字段:

  nodeset='SET-2'
  mySet = odb.rootAssembly.nodeSets[nodeset]

仅供参考,脚本python中集合的名称应该写成大写字母“SET-2”。

如果节点集是在Part级别创建的,可以使用这个命令:

  nodeset='NODESET-2'
  mySet = odb.rootAssembly.instances['PART-1-1'].nodeSets[nodeset]

我试过这个命令,但没有用:

  nodeset='NODESET-2'
  mySet = odb.parts['PART-1-1'].nodeSets[nodeset]

非常感谢。