Search code examples
abaqus

how to insert keyword in the step load definition section using python script?


I am using python to insert *Include, Input=file.inp into step load definition section to apply for pressure boundary condition on nodes. Here is my script, however, it is inserted in Part level section. I am wondering how to control the insert position using python. Thanks


def GetKeywordPosition(myModel, blockPrefix, occurrence=1):
    if blockPrefix == '':
        return len(myModel.keywordBlock.sieBlocks)+1
    pos = 0
    foundCount = 0
    for block in myModel.keywordBlock.sieBlocks:
        if string.lower(block[0:len(blockPrefix)])==\
           string.lower(blockPrefix):
            foundCount = foundCount + 1
            if foundCount >= occurrence:
                return pos
        pos=pos+1
    return +1

   position = GetKeywordPosition(myModel, '*step')+24
   myModel.keywordBlock.synchVersions(storeNodesAndElements=False)
   myModel.keywordBlock.insert(position, "\n*INCLUDE, INPUT=file.inp")

Solution

  • You can adapt the re module. This should work

    import re
    
    # Get keywordBlock object
    kw_block = myModel.keywordBlock
    kw_block.synchVersions(storeNodesAndElements=False)
    
    sie_blocks = kw_block.sieBlocks
    
    # Define keywords for the search (don't forget to exclude special symbols with '\')
    kw_list = ['\*Step, name="My Step"']
    
    # Find index
    idx = 0
    for kw in kw_list:
        r = re.compile(kw)
        full_str = filter(r.match, sie_blocks[idx:])[0]
        idx += sie_blocks[idx:].index(full_str)
    

    UPD: Some explanations as requested

    As keywords in the .inp file could be somewhat repetitive, the main idea here is to create a "search route", where the last pattern in the list will correspond to a place where you want to make your modifications (for example, if you want to find the "*End" keyword after a specific "*Instance" keyword).

    So we proceed iteratively through our "search route" == list of search patterns:

    • Compile the regex expression;
    • Find the first appearance of the pattern in the sie_blocks starting from the index idx;
    • Update the idx so the next search is performed from this point.

    Hope this will help