abaqus脚本

这个专题主要记录自己使用abaqus过程中(尤其是结合python做二次开发和脚本自动化方面)的一些技术点记录。

1. 自动提交运算

如果只是修改部分计算参数,可以先生成一个inp文件,然后对inp文件进行修改,得到新的算例配置inp,再利用python脚本提交运算。

如这里有一个算例:要计算一个弹性梁再不同载荷作用下的变形,载荷施加在自由端,每个算例载荷大小不同。可以使用下面的脚本:

import os
import subprocess

import numpy as np

def create_input_file(dir_path, load_list):
    input_file = "Job-1.inp"
    output_file_name = dir_path + "/" + "Job-1.inp"
    start = 158702
    end = 158710
    new_lines = [
        "*Cload\n",
        "_PickedSet7, 1, {:.6f}\n".format(load_list[0]),
        "_PickedSet7, 2, {:.6f}\n".format(load_list[1]),
        "_PickedSet7, 3, {:.6f}\n".format(load_list[2]),
        "** Name: Load-2   Type: Momen\n",
        "*Cload\n",
        "_PickedSet8, 4, {:.6f}\n".format(load_list[3]),
        "_PickedSet8, 5, {:.6f}\n".format(load_list[4]),
        "_PickedSet8, 6, {:.6f}\n".format(load_list[5]),
    ]
    with open(input_file, "r") as fin, open(output_file_name, "w") as fout:
        for i, line in enumerate(fin, 1):
            if i >= start and i <= end:
                fout.write(new_lines[i - start])
            elif i < start or i > end:
                fout.write(line)
    return output_file_name

def submit_job(inputFileName, numCpus=1):
    abaqus_path = r"D:\program_files\abaqus2022\Commands\abaqus.bat"

    # 提交作业
    jobName = "Job-1"

    # 指定工作目录
    dir_path, inpu_file = inputFileName.split("/")

    # 切换到指定目录
    cpus = 12
    command = abaqus_path + " job=Job-1 input=Job-1.inp cpus={} int ask=off".format(
        cpus
    )

    try:
        result = subprocess.run(
            command, shell=True, check=True, capture_output=True, text=True
        )
        print("complete done!")
        print(result.stdout)
    except subprocess.CalledProcessError as e:
        print("field: ", e)
        print("error: ", e.stderr)

这样就可以自动提交运算。

2、 截面转角自动读取

有了批量计算结果,每个结果保存为一个odb文件,需要借助python脚本批量对结果文件进行处理。

我需要读取梁自由断面的转角,编写如下脚本实现(再小变形下,满足平截面假定,界面上的任何一个点的转角可以表征这个截面的转角):

import os

import numpy as np
from abaqusConstants import *
from odbAccess import openOdb
from scipy.spatial import KDTree


def extract_node_rotations(node_labels, odb_path="Job-1.odb", step_name="Step-1"):
    odb = openOdb("Job-1.odb")
    step = odb.steps[step_name]
    last_frame = step.frames[-1]
    rotations_field = last_frame.fieldOutputs["UR"]

    result = []
    for node_label in node_labels:
        for value in rotations_field.values:
            if value.nodeLabel == node_label:
                result.extend(list(value.data))
                break
        else:
            result.extend([None, None, None])  # 如果没找到节点

    odb.close()
    return result

还遇到一个需求:读取指定节点的应变。

这个问题困扰了我很久,因为abaqus应变值保存在积分点,而不是节点。怎么实现?我找到一个比较笨的方法:先利用abaqus的场输出功能写出所有节点的应变(给函数可以自动将积分点的应变插值到节点),然后解析节点应变,找到自己需要的节点编号对应的应变。如果需要给出坐标来选点,可以在导出节点坐标,这样得到节点坐标、节点应变的表格,再利用坐标插值,可以得到具体坐标点的应变值。因为一点应变是6个自由变量的张量,可以对该张量的每个元进行循环处理。

导出节点应变的脚本如下:

def write_nodal_strain(fname, odb_path):
    import visualization
    from abaqus import session

    session.mdbData.summary()
    o1 = session.openOdb(name=odb_path)
    session.viewports["Viewport: 1"].setValues(displayedObject=o1)
    odb = session.odbs[odb_path]
    session.writeFieldReport(
        fileName=fname,
        append=ON,
        sortItem="Node Label",
        odb=odb,
        step=0,
        frame=1,
        outputPosition=NODAL,
        variable=(
            (
                "E",
                INTEGRATION_POINT,
                (
                    (COMPONENT, "E11"),
                    (COMPONENT, "E22"),
                    (COMPONENT, "E33"),
                    (COMPONENT, "E12"),
                    (COMPONENT, "E13"),
                    (COMPONENT, "E23"),
                ),
            ),
        ),
        stepFrame=SPECIFY,
    )

导出节点坐标的函数类似。插值函数可以使用scipy.inter类实现。

posted @ 2025-11-16 09:58  catfluid  阅读(0)  评论(0)    收藏  举报