Msc.Marc的python开发#1

有限元仿真模拟 专栏收录该内容
2 篇文章 0 订阅

Msc.Marc的python开发#1

Msc.Marc 是一款较为实用的有限元计算软件,但是本身自带的Mentat 前处理可谓十分不好用。当然我们可以选择Msc 公司推出的Patran 前处理程序,不过毕竟还是有一定学习曲线要求的,我暂时不太想换。那么怎么提高现有的蹩脚Mentat的建模效率呢?

其实Mentat 自带的procedure文件可以用来记录一些基本的大量重复的工作。但是在procedure 文件中不能有复杂的选择或循环等结构出现,这限制了procedure文件的功力。

Marc的开发人员早就考虑了这一点,同其他大型软件一样,Marc 早就留出了python 接口,方便我们用python进行批处理工作。

前期配置

我用的是Marc2015 + Visual studio 2012 + Intel visual fortran 2013 的配置
之所以用IVF,是因为我所用的一个子程序需要用Fortran开发,接入到Marc 提供的Ubeam 接口中。

PC上的python本来是3.8的,紧跟时代,各种包装备齐全,然而Marc的python接口自带python.exe,还是2.X版本的(具体什么版本我也没细看)导致装在PC上的python 没法用,各种包也没用。急得我在Marc 的核心python接口模块 py_mentat 所在位置安装了包,然而因为版本兼容问题,bug 不断。我只好暂时舍弃习惯的包,轻装上阵,只用python本体。好在目前接触的问题还比较简单,python本体就能解决了。

核心思想

Marc的python接口的核心思想其实很简单,那就是 一个换了python皮的procedure 文件 。或者说,把需要人工输入的命令汇集到python源文件中,并通过命令行和Marc进行交互,向Marc下各种命令,并获得Marc 的数据库中的各种数据。

核心交互函数及数据库函数

核心交互函数:

  • py_send() #向Marc 发送命令的函数,参数一般是以 * 开头的字符串,代表不同的操作。例如:
    • py_send("*new_mater standard *mater_option general:state:solid *mater_option general:skip_structural:off")
    • py_send("*mater_name %s" % name)
    • py_send("*mater_param general:mass_density 2.5e-9")
    • py_send("*mater_option structural:type:elast_plast_ortho")
    • py_send("*mater_option structural:type:hypo_elast")
    • py_send("*mater_option structural:hypoelastic_method:ubeam")
    • py_send("*mater_option structural:damping:on")
    • py_send("*mater_param structural:rayleigh_damping_stiff_mult 0.0136764")
      上面的代码是建立一种材料的必要操作指令,包括建立新材料,设置类型是standard,输入材料名字,设置密度,设置对称性,弹性行为,接入ubeam子程序接口,打开阻尼开关,设置阻尼系数。你可能会问,Marc 指令千千万万条,我怎么记住每个指令对应的代码呢?很简单,要想这些指令,可在先Marc 上用鼠标操作一遍,然后到procedure 文件里找到对应的指令即可。
  • py_get_int() 和py_get_float() #这两个函数用来从Marc的数据库中抽取数据。括号中为提取参数,例如
    • n = py_get_int(“nelements()”) #获取模型中的单元总数
    • node1.x=py_get_float(“node_x(%d)”%node1.ID) #获取指定节点的整体x坐标

数据库函数:

  • nnodes( ) #Number of nodes in database
  • node_id(ARG1) #ID of ARG1-th node in database
  • max_node_id( ) #Largest node ID in database
  • node_x(arg1) #Global X-coordinate of node arg1
  • node_y(arg1) #Global Y-coordinate of node arg1
  • node_z(arg1) #Global Z-coordinate of node arg1
  • nelements( ) Number of elements in database
  • element_id(ARG1) ID of ARG1-th element in database
  • max_element_id( ) Largest element id in database
  • element_node_id(arg1,ARG2) ID of ARG2-th node of element arg1

更多的函数可以参考 Marc®Python 2015:Tutorial and Reference Manual

应用实例

下面的代码实现的功能是:从一个csv文件中读入截面的属性,并为每个材料起名字,在Mentat 中按顺序建立这些材料,并赋予相应的属性。然后根据一定的规则把材料和单元对应起来

from py_mentat import *
# import the py_mentat module, which is foundamental 
class beam(object):
    def __init__(self, string):
        data = string.split(',')
        self.Nfloor = int(data[0])
        self.Nbeam = int(data[1])
        self.name = 'F'+data[0]+'L'+data[1]
class column(object):
    def __init__(self, string):
        data = string.split(',')
        self.Nfloor = int(data[0])
        self.Ncolu = int(data[1])
        self.name = 'F'+data[0]+'C'+data[1]

class node(object):
    ID=0
    x=0.0
    y=0.0
    z=0.0

def add_matl(name):

    py_send("*new_mater standard *mater_option general:state:solid *mater_option general:skip_structural:off")
    py_send("*mater_name %s" % name)
    py_send("*mater_param general:mass_density 2.5e-9")
    py_send("*mater_option structural:type:elast_plast_ortho")
    py_send("*mater_option structural:type:hypo_elast")
    py_send("*mater_option structural:hypoelastic_method:ubeam")
    py_send("*mater_option structural:damping:on")
    py_send("*mater_param structural:rayleigh_damping_stiff_mult 0.0136764")
    return
def beam_add(beams):
    # add elements for all materials
    # take-in parameter:beams, a list containing all the beam elements in order
    node_beams = {} # beam dictionary takes 'FXLX' as key
    for i in range(len(beams)):
        node_beams[beams[i].name]=[]
    py_send("*renumber_all")
    n = py_get_int("nelements()")
    for i in range(1,n+1):
    # acquire the ID of the nodes linked by one element, and do this procedure for each element
        node1=node()
        node1.ID=py_get_int("element_node_id(%d,%d)"%(i,1))
        node2=node()
        node2.ID=py_get_int("element_node_id(%d,%d)"%(i,2))

        node1.x=py_get_float("node_x(%d)"%node1.ID)
        node1.y=py_get_float("node_y(%d)"%node1.ID)
        node1.z=py_get_float("node_z (%d)"%node1.ID)

        node2.x=py_get_float("node_x(%d)"%node2.ID)
        node2.y=py_get_float("node_y(%d)"%node2.ID)
        node2.z=py_get_float("node_z (%d)"%node2.ID)

        if (node1.z ==node2.z):# it's a beam
            Nfloor = int(node1.z/4000)
            if(node1.x==node2.x):
                Nbeam = 4 + int(node1.x/5000) + int((node1.y+node2.y)/10000)*7
            else:
                Nbeam = 1 + int(node1.y/5000)*7 + int((node1.x+node2.x)/10000)
            name="F%dL%d"%(Nfloor,Nbeam)
            node_beams[name].append(i)
    
    for key in node_beams:
        py_send("*edit_mater %s"%key)
        py_send("*add_mater_elements")
        for j in range(len(node_beams[key])):
            str = "%d " % node_beams[key][j]
            py_send(str)
        py_send(" # ")
    return
def colu_add(columns):
    # add elements for all materials
    # take-in parameter:columns, a list containing all the column elements in order
    node_columns = {} # beam dictionary takes 'FXCX' as key
    for i in range(len(columns)):
        node_columns[columns[i].name]=[]
    py_send("*renumber_all")
    n = py_get_int("nelements()")
    for i in range(1,n+1):
        node1=node()
        node1.ID=py_get_int("element_node_id(%d,%d)"%(i,1))
        node2=node()
        node2.ID=py_get_int("element_node_id(%d,%d)"%(i,2))

        node1.x=py_get_float("node_x(%d)"%node1.ID)
        node1.y=py_get_float("node_y(%d)"%node1.ID)
        node1.z=py_get_float("node_z (%d)"%node1.ID)

        node2.x=py_get_float("node_x(%d)"%node2.ID)
        node2.y=py_get_float("node_y(%d)"%node2.ID)
        node2.z=py_get_float("node_z (%d)"%node2.ID)

        if ((node1.x==node2.x)and(node1.y == node2.y)):# it's a column
            Nfloor = int((node1.z+node2.z)/8000)+1
            Ncolu = int(node1.x/5000)+4*int(node1.y/5000)+1
            name="F%dC%d"%(Nfloor,Ncolu)
            node_columns[name].append(i)
    
    for key in node_columns:
        py_send("*edit_mater %s"%key)
        py_send("*add_mater_elements")
        for j in range(len(node_columns[key])):
            str = "%d " % node_columns[key][j]
            py_send(str)
        py_send(" # ")
    return
def main():
    beams = []
    with open('E:\\02_research\\06_firstblood\\01_model_PKPM\\ExportExcel\\section_beam.csv') as file:
        for content in file:
            list = content.split(',')
            if list[0] == 'Nfloor':
                continue
            new_beam = beam(content)
            beams.append(new_beam)
        file.close()
    for i in range(len(beams)):
        add_matl(beams[i].name)
    beam_add(beams)
    columns = []
    with open('E:\\02_research\\06_firstblood\\01_model_PKPM\\ExportExcel\\section_colu.csv') as file:
        for content in file:
            list = content.split(',')
            if list[0] == 'Nfloor':
                continue
            new_column = column(content)
            columns.append(new_column)
    for i in range(len(columns)):
        add_matl(columns[i].name)
    colu_add(columns)


    return


if __name__ == '__main__':
    py_connect("", 40007)
    main()
    py_disconnect()

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

一共十五章,PDF格式…… 1 目录 第一章介绍 MENTAT与MARC程序的关系 MENTAT的文档 MENTAT的安装目录 MENTAT程序的屏幕布局 MENTAT与用户的通讯 MENTAT菜单光钮的分类 第二章网格生成 与有限元分析相关的常用词 与几何实体相关的常用词 网格生成方法1(网格的直接定义) 格栅的显示 格栅尺寸的显示 节点的生成 单元生成法 节点位置的修正 单元的删除 2 节点的删除 全部网格删除 网格生成方法2(由几何实体转化为网格) 控制点的生成 线的生成 CUBIC SPLINE(三次样条曲线)的生成 POLY LINE(多折线)的生成 Bezier 曲线的生成 圆弧、圆的生成 其它曲线 面的生成 四边形的生成 Bezier 曲面的生成 DRIVEN SURFACE(驱动面)的生成 RULER SUREACE(直纹曲面)的生成 SPHERE(球面)的生成 CYLINDER(圆柱、圆锥)面的生成 SWEPT SURFACE(扫描面)的生成 NURB SURFACE (NURB 曲面)的生成 3 实体的生成 几何实体与网格的转换 操作示范 单元表的指定方法 网格生成方法3(从几何实体自动生成网格) 其它前处理功能 ATTACH CHANGE CLASS CHECK CONVERT DUPLICATE EXPAND MOVE RELAX RENUMBER REVOLVE SOLIDS STRETCH SUBDIVIDE 4 SWEEP SYMMETRY 简例 (例题1)单元的直接定义 (例题2)几何实体转化为网格 (例题3)OVERLAY 网格划分 (例题4)ADVANCING FRONT 自动网格划分 第三章边界条件的定义(BOUNDARY CONDITIONS) BOUNDRAY CONDITIONS的 子菜单 MECHANICAL 边界条件名的定义 热传导边界条件的定义 TRANSFORMS(局部坐标系的定义) 边界条件定义举例(应力分析) 第四章初始条件的定义(INITIAL CONDITIONS) INITIAL CONDITIONS的子菜单 MECHANICAL(应力分析) 5 初始条件的定义 THERMAL (热传导分析) 第五章材料特性的定义 材料特性名的定义 MENTAT定义的材料特性 MECHANICAL MATERIAL OTHER MATERIAL(其它材料类型) 与材料特性相关的其它定义 材料常数的定义方法 材料特性定义举例 第六章选择功能(SELECT) 第七章表格功能的使用(TABLE) 第八章几何特性的定义(GEOMETRIC PROPERTIES) 3D单元几何特性的定义 轴对称单元几何特性的定义 平面单元几何特性的定义 接触/摩擦单元几何特性的定义 6 热传导单元的几何特性定义 几何特性定义举例(应力分析) 第九章接触条件的定义(CONTACT) 接触体的生成 CONTACT BODIES CONTACT TABLE CONTACT AREAS 第十章载荷工况的定义 分析类型的选择 LOAD CASE的定义 热传导分析时载荷工况的定义 第十一章定义作业参数并提交运行 JOBS PROCESSOR LOAD CASES ANALYSIS DIMENSION ANALYSIS OPTIONS CREEP TIME MODAL SOLUTION METHOD 7 DYNAMIC OPERATOR DYNAMIC HARMONIC VISCOELASTICITY JOB RESULTS INITIAL LOADS JOB PARAMETERS CONTACT CONTROL SOIL CONTROL ADAPTIVE MESHING CRITERIA ADDITIONAL PRINT ELEMENT TYPE RUN JOB JOBS操作举例 第十二章后处理(RESULTS) FILE SCALAR DEFORMED SHARP PLOT STYLE 8 PATH PLOT HISTORY PLOT ANIMATE ISOLATE ELEMS 第十三章静态菜单命令 静态菜单命令介绍 FILES菜单 PLOT菜单 VIEW菜单 第十四章练习 第十五章MENTAT的其它界面 MENTAT调用的外部程序 MARC Jobs 图形输出界面
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值