iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0

建立Entity

ANSA建立Entity的function是base.CreateEntity,一般需要三個參數,deck、element_type及fields。

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

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

fields是描述這個Entity的內容,type為dict。每一種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 base及constants兩個模組,接著照順序定義上述三個參數。

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

查看輸出,發現可順利產生一個id為1的node 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內的part及group,需使用base.NewPart及base.NewGroup來建立;load curve需使用base.CreateLoadCurve來建立。

刪除Entity

ANSA內刪除Entity的function是base.DeleteEntity,一般只需要一個變數,單個Entity或是一個包含多個Entity的list。

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.DeletePart或base.DeleteCurves等。

Code

本日程式碼傳送門。


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

尚未有邦友留言

立即登入留言