iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Software Development

或躍在淵的CAE: 讓咱們用Python會一會ANSA + LS-DYNA系列 第 12

[Day12] - Box Drop Project精進計畫(4) - 建立creators

  • 分享至 

  • xImage
  •  

做了這麼多準備工夫,今天終於可以開始來寫creators.py的幾個function。一旦有了各種creator後,我們的code就會精簡許多,減少很多boilerplate的typing。

creator function最終都需透過base.CreateEntity來建立Entity,所以pattern都很相似,目標是找出各functiondeckelement_typefields

create_node

deck使用我們一貫的short circuit技巧,如果沒指定則設為constants.LSDYNA
element_type則引用schemas.py中的LSDYNAType.NODE
最後將給定的fields與上述的deckelement_type一併置入base.CreateEntity,並return

# creators.py
def create_node(fields, deck=None):
    deck = deck or constants.LSDYNA
    type_ = LSDYNAType.NODE
    return base.CreateEntity(deck, type_, fields)

create_shell

此處element_type我們使用LSDYNAType.SHELL,ANSA會自動認為我們想建立一個QUAD4 element,在我們當前的使用情況不會有問題。我們會在之後使用base.ImportV1時,試著修正這個問題。

# creators.py
def create_shell(fields, deck=None):
    deck = deck or constants.LSDYNA
    type_ = LSDYNAType.SHELL
    return base.CreateEntity(deck, type_, fields)

create_mat

create_mat的步驟稍微多一點,我們慢慢來看。

  • element_type,我們使用short circuit的技巧,將其預設為常用的MAT1材料卡。
  • 使用者給定的fields,我們這邊取名叫vals,如果沒有給定的話,則設為一個空的dict
  • 如果沒有給定name的話,使用我們先前建立的get_one_material_name來自動建立材料名。
  • 建立一個force_valdict, 將DEFINED設為YES,這樣我們就不用在輸出的時候,再調整每個材料的visibility
  • 接著將namevalsforce_vals組合成fields。此處需留意組合的順序,由於name其實是可以放在vals內由使用者給定,所以我們將vals放在第二位。如果有給定的話,則會使用給定的名字蓋過第一位的name。另外,由於我們想強迫所有材料都是預設會輸出的,所以要擺在最後一位,這樣即使使用者在vals中指定DEFINENO,也會被第三位的force_vals蓋過去。
  • 最後將deckelement_typefields一併置入base.CreateEntity,並return
# creators.py
def create_mat(mat_type=None, name=None, vals=None, deck=None):
    deck = deck or constants.LSDYNA
    type_ = mat_type or MatType.MAT1_MAT_ELASTIC
    name = name or get_one_material_name()
    vals = vals or {}
    force_vals = {'DEFINED': 'YES'}
    fields = {**{'Name': name},
              **vals,
              **force_vals}
    return base.CreateEntity(deck, type_, fields)

create_sec

create_sec的邏輯與create_mat類似,只是使用create_sec可以同時建立materialproperty

值得一提的是,這邊我們使用get_mat_prop_id來取得一個id,可以同時給materialproperty使用。

# creators.py
def create_sec(sec_type=None,
               mat_type=None,
               name=None,
               vals=None,
               matvals=None,
               deck=None):
    deck = deck or constants.LSDYNA
    type_ = sec_type or SecType.SECTION_SHELL
    name = name or get_one_section_name()
    vals = vals or {}
    matvals = matvals or {}

    used_mat_prop_id = get_mat_prop_id()
    matvals = {**{'MID': used_mat_prop_id}, **matvals}
    mat = create_mat(mat_type=mat_type, vals=matvals)

    force_vals = {'DEFINED': 'YES'}
    fields = {**{
        'Name': name,
        'PID': used_mat_prop_id,
        'MID': used_mat_prop_id},
        **vals,
        **force_vals}
    return base.CreateEntity(deck, type_, fields)

create_set

create_set的前半部建立了一個空的set Entity,如果有指定想放入set內的entities的話,我們使用base.AddToSet將其加入,最後回傳這個set Entity

# creators.py
def create_set(entities=None, name=None, deck=None):
    deck = deck or constants.LSDYNA
    type_ = LSDYNAType.SET
    name = name or get_one_set_name()
    fields = {'Name': name}
    set_entity = base.CreateEntity(deck, type_, fields)
    if entities is not None:
        base.AddToSet(set_entity, entities)
    return set_entity

create_contact

create_contactcontact_type預設為常用的AUTOMATIC_SURFACE_TO_SURFACE。至於sstypmstyp則可透過schemas中的ContactType來調整。

# creators.py
def create_contact(ssid: int,
                   msid: int,
                   sstyp: str,
                   mstyp: str,
                   contact_type=None,
                   name=None,
                   vals=None,
                   deck=None):
    deck = deck or constants.LSDYNA
    type_ = LSDYNAType.CONTACT
    contact_type = contact_type or ContactTypeName.AUTOMATIC_SURFACE_TO_SURFACE.value
    name = name or get_one_contact_name()
    vals = vals or {}
    fields = {**{'Name': name,
                 'TYPE': contact_type,
                 'SSID': ssid,
                 'MSID': msid,
                 'SSTYP': sstyp,
                 'MSTYP': mstyp},
              **vals}
    return base.CreateEntity(deck, type_, fields)

備註

相關creator function代換後的結果,請參考本日的box_drop.py

Code

本日程式碼傳送門


上一篇
[Day11] - Box Drop Project精進計畫(3) - 建立各Entity的id系統
下一篇
[Day13] - Box Drop Project精進計畫(5) - Plate
系列文
或躍在淵的CAE: 讓咱們用Python會一會ANSA + LS-DYNA30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言