Извлечь координаты набора узлов в abaqus с помощью скрипта Python

Я хотел бы извлечь координаты набора узлов с помощью скрипта 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]

Это тоже не работает, и ошибка: Модель-1

Буду очень признателен, если вы поможете мне решить эту проблему


person Wahid Tarhouni    schedule 02.04.2021    source источник
comment
keyerror просто означает, что такого ключа нет. В первом случае это означает, что у экземпляра с именем part-1 нет набора с именем Set-1. Кроме того, set - это стандартный метод Python, поэтому не используйте его в качестве имени переменной.   -  person Roman Zhuravlev    schedule 03.04.2021


Ответы (3)


Я использовал эти две функции для создания набора узлов с известной координатой 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. (помните, что вы должны активировать COORD на шаге, чтобы извлечь координаты точек в odb)

# =============================================================================
# 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, COORD2, COORD3: nodal coordinates
        U1, U2, 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, c2, c3, u1, u2, 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, U1, U2, 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, outputPosition=NODAL, variable=(('U',NODAL, ((COMPONENT, 'U2'),  )), ), nodeSets=(SetName, ))
    U3_Fr=session.xyDataListFromField(odb=myOdb, outputPosition=NODAL, variable=(('U',NODAL, ((COMPONENT, 'U3'),  )), ), nodeSets=(SetName, ))
    
    COORD1_Fr=session.xyDataListFromField(odb=myOdb, outputPosition=NODAL, variable=(('COORD',NODAL, ((COMPONENT, 'COOR1'),  )), ), nodeSets=(SetName, ))
    COORD2_Fr=session.xyDataListFromField(odb=myOdb, outputPosition=NODAL, variable=(('COORD',NODAL, ((COMPONENT, 'COOR2'),  )), ), nodeSets=(SetName, ))
    COORD3_Fr=session.xyDataListFromField(odb=myOdb, outputPosition=NODAL, variable=(('COORD',NODAL, ((COMPONENT, 'COOR3'),  )), ), nodeSets=(SetName, ))


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

Надеюсь, это будет вам полезно.

person Mohammadreza Moeini    schedule 20.04.2021
comment
Большое спасибо за все подробности. Мне удалось получить доступ к файлу odb с помощью этой команды: nodeset = 'SET-2' mySet = odb.rootAssembly.nodeSets [nodeset] mySet = odb.rootAssembly.nodeSets [nodeset] - person Wahid Tarhouni; 04.07.2021

Спасибо за ответ.

SatishThorat, мне удалось получить доступ к файлу odb и прочитать поле вывода в наборе узлов, созданном с помощью этой команды:

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

К вашему сведению, имя набора в скрипте python должно быть написано заглавными буквами SET-2.

Если набор узлов создается на уровне детали, вы можете использовать эту команду:

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

Я пробовал использовать эту команду, но это не сработало:

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

Спасибо большое.

person Wahid Tarhouni    schedule 04.07.2021
comment
Я думаю, 'PART-1' - это название детали, а 'PART-1-1' - это имя экземпляра. Следовательно, вы должны использовать 'PART-1'. Однако, как мне кажется, доступ к сетам через деталь невозможен. В качестве альтернативы вы можете проверить мой обновленный / исправленный ответ. - person Satish Thorat; 06.07.2021

Когда вы собираете детали (в модуле сборки), вы фактически собираете экземпляр деталей, а НЕ саму деталь. Однако вы по-прежнему можете получить доступ к информации о деталях, такой как поверхности, наборы, узлы, элементы и т. Д.
Для ODB (база данных вывода):
Вы можете получить доступ к Assembly информации используя: odb.rootAssembly.
и информацию о детали через экземпляр, используя:
odb.rootAssembly.instances['<instance name>'].
и непосредственно информацию о детали, используя: odb.parts['<part name>']

Для MDB (база данных моделей):
Вы можете получить Assembly информацию, используя:
mdb.models['<Model name>'].rootAssembly.
и информацию об экземпляре с помощью:
mdb.models['<Model name>'].rootAssembly.instances['<instance name>']
и непосредственно информацию о детали с помощью:
mdb.models['<Model name>'].parts['<part name>']

Например, доступ к набору элементов из детали и сборки:

# Let's consider, 'ASM_ELSET' is an element set created at the assembly level
# and 'PRT_ELSET' is an element set created at the part 'PART-1'.

# Access assembly level set
aset = odb.rootAssembly.elementSets['ASM_ELSET']

# Access part level set through the instance
pset = odb.rootAssembly.instances['PART-1-1'].elementSets['PRT_ELSET']

Обратите внимание, что 'PART-1-1' - это имя экземпляра для части 'PART-1.

person Satish Thorat    schedule 29.05.2021