开发者

python中如何调用ansys

目录
  • python调用ansys
  • 利用python运行Ansys Apdl
    • 版本要求
    • pymapdl安装流程
    • 初始设置和本地启动mapdl
    • PyMAPDL语法
    • 工具库
    • 与window的交互接口
  • 总结

    python调用ansys

    最近做了一个小项目,用python代码进行ansys的二次开发,重点是如何使用python调用ansys.代码如下:

    import os
    path = 'E:/test'
    os.chdir(path)
    ansys = r'"D:\"Program Files\ANSYS Inc"\v211\ansys\bin\winx64\MAPDL.exe""  -p ansys -dis -mpi INTELMPI -np 2 -lch -dir "E:\test" -j "test" -s read -l en-us -b -i "E:\test\1model.txt" -o "E:\test\Output\file.out""'
    os.system(ansys)
    

    当然了,这么长的一串代码肯定不是人手打的,因为肉眼分辨不出来的空格实在太多了。

    具体命令在这里,看图

    python中如何调用ansys

    点击tool的Display Command Line

    python中如何调用ansys

    复制路径,最后一行

    python中如何调用ansys

    但是,直接的复制写进代码是没有用的,因为Python识别不了空格,以及转义字符造成的误解,具体怎么改正可以看上述代码。

    我在调试代码中还遇到了ansys lock的问题,如图:

    python中如何调用ansys

    原因就是调试代码同时运行了多个MAPDL文件且input file都是同一个,导致了ansys lock,因为可以看到每次运行代码都会产生一堆.log,.BAT,.err文件,一般这些文件不会影响代码的运行,但是下图的.lock文件会是个bug,删除运行产生的不相干文件就可以了

    python中如何调用ansys

    利用python运行Ansys Apdl

    版本要求

    按照官网要求,ANSYS 2021以上,python 3.63.8,以下默认用户电脑已经安装ansys2021,python3.63.8,解释器建议选用pycharm

    pymapdl安装流程

    安装pymapdl包(目前ansys-mapdl-core包只支持这几个版本),通过清华镜像安装,能够得到完整的包,否则由于下载超时会中断,且无法下载到最新的pymapdl-corba模块导致无法实现python连接mapdl

    pip install ansys-mapdl-core -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install ansys-mapdl-reader -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install ansys.api.mapdl.v0 -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install protobuf -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install grpcio -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install grpcio-tools -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install pyaedt -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install ansys-dpf-core -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install ansys-dpf-post -i https://pypi.tuna.tsinghua.edu.cn/simple

    测试pymapdl是否安装成功

    from ansys.mapdl.core import launch_mapdl
    mapdl = launch_mapdl()
    print(mapdl)
    
    

    若成功,则会显示ansys版本以及mapdl版本

    初始设置和本地启动mapdl

    import os
    from ansys.mapdl.core import launch_mapdl
    path = os.getcwd()
    mapdl = launch_mapdl(run_location=pathandroid+'\working', exec_file=r"D:\setup_position_1\ansys2021r1\ANSYS Inc\v211\ansys\bin\winx64\ANSYS211.exe",additional_switches="-smp")
    print(mapdl)

    启动失败原因:

    • pymapdl工作目录应在当前python工作目录下,可以按照如上代码设定 run_location=path+‘\working’
    • 若找不到系统中安装的mapdl,则可以指定ansys路径
    • 当遇到许可证问题,如mapdl超时等问题时,使用语句:additional_switches=“-smp”
    • 推荐使用版本为ansys2021 r1(本人目前使用没有问题的版本)

    PyMAPDL语法

    pymapdl语法于ansys apdl语法基本一致,详情可参考二者的官方文档,以下给出一些示例:

    mapdl.clear()
    # define element and material
    mapdl.prep7()
    mapdl.units("SI") # SI - International system (m, kg, s, K).
    
    # define a ET30 and ET130 element type
    mapdl.et(1, "FLUID30", kop2=1)
    mapdl.eandroidt(2, "FLUID130", kop1=1)
    
    # Define a material (nominal steel in SI)
    mapdl.mp("SONC", 1, 1500) # sonc in m/s
    mapdl.mp("DENS", 1, 1000) # Density in kg/m3
    mapdl.mp("SONC", 2, 1500) # sonc in m/s
    mapdl.mp("DENS", 2, 1000) # Density in kg/m3

    工具库

    本批处理程序文件移动采用python os,glob以及shutil包,误差分析方法采用二范数误差分析:

    import os
    import shutil
    
    def mkdir(path):
      path 编程客栈= path.strip()
      path = path.strip("\\")
      isExists = os.path.exists(path)
      if not isExists:
        os.makedirs(path)
    
    def clearfolder(path):
      path = path.strip()
      path = path.strip("\\")
      isExists = os.path.exists(path)
      if isExists:
        shutil.rmtree(path)
        mkdir(path)
    
    def mycopyfile(srcfile, dstpath, file_num,filenamelist):            # 移动函数
      if not os.path.isfile(srcfile):
        print开发者_Go培训 ("%s not exist!"%(srcfile))
      else:
        fpath,fname=os.path.split(srcfile)       # 分离文件名和路径
        if not os.path.exists(dstpath):
          os.makedirs(dstpath)            # 创建路径
        shutil.move(srcfile, dstpath + str(file_num)+'-'+fname)     # 移动文件
        print ("copy %s -> %s"%(srcfile, dstpath +str(file_num)+'-'+ fname))
        filenamelist.append(dstpath + str(file_num)+'-'+fname)
    
    def filename_to_list(filepath):
      file_name_list = list() # 新建列表
      for i in os.listdir(filepath): # 获取filePath路径下所有文件名
        data_cphpollect = ''.join(i) # 文件名字符串格式
        file_name_list.append(filepath+data_collect) # 将文件名作为列表元素填入
      return (file_name_list) # 返回列表
    
    def read_ansys_result(filepath, nodenum):
      ansysdata = []
      f = open(filepath, "r")
      data = f.readline()
      data = f.readline()
      for i in range(1, nodenum+1):
        data = f.readline()
        data = data.strip().split()
    
        ansysdata.append([float(data[1]), float(data[2]), float(data[3])])
    
      return ansysdata
    
    def read_my_result(filepath, nodenum):
      mydata = []
      f = open(filepath, "r")
      data = f.readline()
      data = f.readline()
      data = f.readline()
      for i in range(1, nodenum+1):
        data = f.readline()
        data = data.strip().split()
        mydata.append([float(data[3]), float(data[4]), float(dahttp://www.devze.comta[5])])
      return mydata
    
    def cal_2Norm_Err_ofMesh(caldata,thedata):
      nodenum = len(caldata)
      a = 0
      b = 0
      c = 0
      d = 0
      e = 0
      f = 0
      for i in range(nodenum):
        a += pow(caldata[i][0] - thedata[i][0], 2)
        b += pow(caldata[i][1] - thedata[i][1], 2)
        c += pow(a,2)+pow(b, 2)
        d += pow(thedata[i][0], 2)
        e += pow(thedata[i][1], 2)
        f += pow(thedata[i][2], 2)
      a = pow(a, 0.5)
      b = pow(b, 0.5)
      c = pow(c, 0.5)
      d = pow(d, 0.5)
      e = pow(e, 0.5)
      f = pow(f, 0.5)
      realerr = a/d
      imagerr = b/e
      amperr = c/f
      err_list = str(realerr)+" "+str(imagerr)+" "+str(amperr)
      return err_list
    
    def write_2Norm_Err_ofMesh(outputfile, ansysnamelist, mynamelist, thenamelist, fileinfolist):
      ansys_res_data = [] # 每一个元素代表一个文件的结果
      my_res_data = []
      the_res_data = []
      for i in ansysnamelist:
    
        print(i)
      for i in range(len(ansysnamelist)):
        ansys_res_data.append( read_ansys_result(ansysnamelist[i], fileinfolist[i][2]))
        my_res_data.append(read_my_result(mynamelist[i], fileinfolist[i][2]))
        the_res_data.append(read_my_result(thenamelist[i], fileinfolist[i][2]))
    
      f = open(outputfile,"w",encoding='GBK')
      f.write("Title=\"different mesh num err\"\n")
    
      f.write("variables=\"mesh_number\",\"real_err(%)\",\"imag_err(%)\",\"amp_err(%)\"\n")
      f.write("zone t=\"ansys-theroy\"\n")
      f.write("i="+str(len(ansysnamelist))+",f=point\n")
      for i in range(len(ansysnamelist)):
        ans_the=cal_2Norm_Err_ofMesh(ansys_res_data[i],the_res_data[i])
        f.write(str(fileinfolist[i][1])+" "+ans_the+"\n")
    
      f.write("zone t=\"my-theroy\"\n")
      f.write("i="+str(len(ansysnamelist))+",f=point\n")
      for i in range(len(ansysnamelist)):
        my_the = cal_2Norm_Err_ofMesh(my_res_data[i], the_res_data[i])
        f.write(str(fileinfolist[i][1]) + " " + my_the + "\n")

    与window的交互接口

    使用isubprocess包来调用第三方exe程序,示例如下:

    import subprocess
    command= " AcoFEM.exe AcoHarmicINFEM AcoHarmicINFEM.cfg 0 0 0"
    p = subprocess.Popen(command, shell=True)
    p.communicate()

    需要注意:

    • exe文件放在python的工作根目录下是最稳定的,其余文件按照编程时与exe文件的目录关系进行摆放
    • 尽量减少程序中的窗口输出,如大量的节点信息在屏幕上输出,这会导致锁死
    • 显示cmd窗口结果尽量使用p.communicate()而不是p.wait()防止输出锁死计算停止

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜