iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0

建立Entity

ANSA建立Entityfunctionbase.CreateEntity,一般需要三個參數,deckelement_typefields

deck是solver的種類,typeint,可以從constants模組中取得,例如LS-DYNA為constants.LSDYNA,Nastran則為costants.NASTRAN

element_typecard的種類,typestr。不同的solver可能會用不同的名稱來描述同一種element_type。例如: shell在Nastran這個deck下稱為SHELL,但在LS-DYNA則稱為ELEMENT_SHELL。如果剛開始接觸ANSA,不太確定element_type的字串時,可以透過GUI的介面確認。

fields是描述這個Entity的內容,typedict。每一種Entity有不同種類的fields,要想知道該Entity有哪些fields的話,可以透過Entity.card_fields這個function來取得。

舉例來說,這裡我們建立一個座標為(1,2,3)node Entity

from ansa import base, constants


def create_node1():
    deck = constants.LSDYNA
    type_ = 'NODE'
    fields = {'X': 1, 'Y': 2, 'Z': 3}
    node = base.CreateEntity(deck, type_, fields)
    card_fields = node.card_fields(deck)
    print(f'create_node1: {node=}')
    print(f'{card_fields=}')

首先我們從ANSA中import baseconstants兩個模組,接著照順序定義上述三個參數。

  • deckconstants.LSDYNA
  • element_type(變數名為type_)為NODE
  • fields{'X': 1, 'Y': 2, 'Z': 3}

查看輸出,發現可順利產生一個id1node Entity

create_node1: node=<Entity: 0x7f67563b6000: type: 1101(1101,N_GRID) id:-1>

藉由node.card_fields則可以觀察這個node Entity所擁有的card_fields。如果想同時建立node Entity並指定其id的話,必須於呼叫base.CreateEntity時,將加入NID這個欄位到上述的fields內。

card_fields=['TYPE', 'NID', 'X', 'Y', 'Z', 'TC', 'RC', 'Name', 'FROZEN_ID', 'FROZEN_DELETE', 'DEFINED', 'AUXILIARY', 'Comment', 'MBContainer', 'MBContainers']

Entity建立失敗的時候,base.CreateEntity會回傳None

def create_node2():
    deck = constants.LSDYNA
    type_ = 'NODE'
    wrong_fields = {'X': 1, 'Y': 2, 'z': 3}  # 'z' should be 'Z'
    node = base.CreateEntity(deck, type_, wrong_fields)
    print(f'create_node2: {node=}')

其輸出為:

create_node2: node=None

當需要更多的資訊來debug,可以給定debug=constants.REPORT_ALL

def create_node3():
    deck = constants.LSDYNA
    type_ = 'NODE'
    wrong_fields = {'X': 1, 'Y': 2, 'z': 3}  # 'z' should be 'Z'
    node = base.CreateEntity(deck, type_, wrong_fields,
                             debug=constants.REPORT_ALL)
    print(f'create_node3: {node=}')

此時base.CreateEntity會回傳一個具有兩個元素的tuple,第一個元素是回傳值,第二個元素是含有錯誤訊息的dict(如果沒有錯誤訊息,則會是一個空的dict)。

create_node3: node=(None, {'z': {'type': 'error', 'message': 'Field not found!'}})

最後,當遇到無法使用base.CreateEntity來建立想要Entity的時候,通常代表該種Entity有特殊的create function

container內的partgroup,需使用base.NewPartbase.NewGroup來建立;load curve需使用base.CreateLoadCurve來建立。

刪除Entity

ANSA內刪除Entityfunctionbase.DeleteEntity,一般只需要一個變數,單個Entity或是一個包含多個Entitylist

def delete_node():
    deck = constants.LSDYNA
    node1 = base.CreateEntity(deck, 'NODE', {'X': 0, 'Y': 0, 'Z': 0})
    node2 = base.CreateEntity(deck, 'NODE', {'X': 10, 'Y': 0, 'Z': 0})
    node3 = base.CreateEntity(deck, 'NODE', {'X': 10, 'Y': 10, 'Z': 0})

    del_node1 = base.DeleteEntity(node1)
    print(f'{del_node1=}')

    del_node2_3 = base.DeleteEntity([node2, node3])
    print(f'{del_node2_3=}')

如果全部給定的Entity都成功刪除,會回傳0,否則則回傳1

del_node1=0
del_node2_3=0

如同建立Entity時一樣,偶爾會遇到無法刪除的Entity,此時需要到base模組裡找找,是不是該Entity有特殊的刪除function,如base.DeletePartbase.DeleteCurves等。

Code

本日程式碼傳送門


上一篇
[Day02] - ANSA API行前準備
下一篇
[Day04] - 取得Entity及Entities
系列文
或躍在淵的CAE: 讓咱們用Python會一會ANSA + LS-DYNA30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言