python中如何調(diào)用ansys
python調(diào)用ansys
最近做了一個(gè)小項(xiàng)目,用python代碼進(jìn)行ansys的二次開(kāi)發(fā),重點(diǎn)是如何使用python調(diào)用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)
當(dāng)然了,這么長(zhǎng)的一串代碼肯定不是人手打的,因?yàn)槿庋鄯直娌怀鰜?lái)的空格實(shí)在太多了。
具體命令在這里,看圖
點(diǎn)擊tool的Display Command Line
復(fù)制路徑,最后一行
但是,直接的復(fù)制寫進(jìn)代碼是沒(méi)有用的,因?yàn)镻ython識(shí)別不了空格,以及轉(zhuǎn)義字符造成的誤解,具體怎么改正可以看上述代碼。
我在調(diào)試代碼中還遇到了ansys lock的問(wèn)題,如圖:
原因就是調(diào)試代碼同時(shí)運(yùn)行了多個(gè)MAPDL文件且input file都是同一個(gè),導(dǎo)致了ansys lock,因?yàn)榭梢钥吹矫看芜\(yùn)行代碼都會(huì)產(chǎn)生一堆.log,.bat,.err文件,一般這些文件不會(huì)影響代碼的運(yùn)行,但是下圖的.lock文件會(huì)是個(gè)bug,刪除運(yùn)行產(chǎn)生的不相干文件就可以了
利用python運(yùn)行Ansys Apdl
版本要求
按照官網(wǎng)要求,ANSYS 2021以上,python 3.63.8,以下默認(rèn)用戶電腦已經(jīng)安裝ansys2021,python3.63.8,解釋器建議選用pycharm
pymapdl安裝流程
安裝pymapdl包(目前ansys-mapdl-core包只支持這幾個(gè)版本),通過(guò)清華鏡像安裝,能夠得到完整的包,否則由于下載超時(shí)會(huì)中斷,且無(wú)法下載到最新的pymapdl-corba模塊導(dǎo)致無(wú)法實(shí)現(xiàn)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
測(cè)試pymapdl是否安裝成功
from ansys.mapdl.core import launch_mapdl mapdl = launch_mapdl() print(mapdl)
若成功,則會(huì)顯示ansys版本以及mapdl版本
初始設(shè)置和本地啟動(dòng)mapdl
import os from ansys.mapdl.core import launch_mapdl path = os.getcwd() mapdl = launch_mapdl(run_location=path+'\working', exec_file=r"D:\setup_position_1\ansys2021r1\ANSYS Inc\v211\ansys\bin\winx64\ANSYS211.exe",additional_switches="-smp") print(mapdl)
啟動(dòng)失敗原因:
- pymapdl工作目錄應(yīng)在當(dāng)前python工作目錄下,可以按照如上代碼設(shè)定 run_location=path+‘\working’
- 若找不到系統(tǒng)中安裝的mapdl,則可以指定ansys路徑
- 當(dāng)遇到許可證問(wèn)題,如mapdl超時(shí)等問(wèn)題時(shí),使用語(yǔ)句:additional_switches=“-smp”
- 推薦使用版本為ansys2021 r1(本人目前使用沒(méi)有問(wèn)題的版本)
PyMAPDL語(yǔ)法
pymapdl語(yǔ)法于ansys apdl語(yǔ)法基本一致,詳情可參考二者的官方文檔,以下給出一些示例:
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.et(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
工具庫(kù)
本批處理程序文件移動(dòng)采用python os,glob以及shutil包,誤差分析方法采用二范數(shù)誤差分析:
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): ? ? ? ? ? ? ? ? ? ? ? # 移動(dòng)函數(shù) ? ? if not os.path.isfile(srcfile): ? ? ? ? print ("%s not exist!"%(srcfile)) ? ? else: ? ? ? ? fpath,fname=os.path.split(srcfile) ? ? ? ? ? ? # 分離文件名和路徑 ? ? ? ? if not os.path.exists(dstpath): ? ? ? ? ? ? os.makedirs(dstpath) ? ? ? ? ? ? ? ? ? ? ? # 創(chuàng)建路徑 ? ? ? ? shutil.move(srcfile, dstpath + str(file_num)+'-'+fname) ? ? ? ? ?# 移動(dòng)文件 ? ? ? ? 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_collect = ''.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(data[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 = [] # 每一個(gè)元素代表一個(gè)文件的結(jié)果 ? ? 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包來(lái)調(diào)用第三方exe程序,示例如下:
import subprocess command= " AcoFEM.exe AcoHarmicINFEM AcoHarmicINFEM.cfg 0 0 0" p = subprocess.Popen(command, shell=True) p.communicate()
需要注意:
- exe文件放在python的工作根目錄下是最穩(wěn)定的,其余文件按照編程時(shí)與exe文件的目錄關(guān)系進(jìn)行擺放
- 盡量減少程序中的窗口輸出,如大量的節(jié)點(diǎn)信息在屏幕上輸出,這會(huì)導(dǎo)致鎖死
- 顯示cmd窗口結(jié)果盡量使用p.communicate()而不是p.wait()防止輸出鎖死計(jì)算停止
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
講解Python3中NumPy數(shù)組尋找特定元素下標(biāo)的兩種方法
這篇文章主要介紹了講解Python3中NumPy數(shù)組尋找特定元素下標(biāo)的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python控制臺(tái)輸出俄羅斯方塊移動(dòng)和旋轉(zhuǎn)功能
這篇文章主要介紹了Python控制臺(tái)輸出俄羅斯方塊移動(dòng)和旋轉(zhuǎn)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04在notepad++中實(shí)現(xiàn)直接運(yùn)行python代碼
今天小編就為大家分享一篇在notepad++中實(shí)現(xiàn)直接運(yùn)行python代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12使用Python進(jìn)行新浪微博的mid和url互相轉(zhuǎn)換實(shí)例(10進(jìn)制和62進(jìn)制互算)
我們?cè)谑褂眯吕宋⒉〢PI時(shí),有時(shí)需要得到一個(gè)微博的url,但是如statuses/public_timeline等接口中取得的微博status的字段中并沒(méi)有包含2014-04-04python中執(zhí)行shell命令的幾個(gè)方法小結(jié)
這篇文章主要介紹了python中執(zhí)行shell命令的幾個(gè)方法,本文一共給出3種方法實(shí)現(xiàn)執(zhí)行shell命令,需要的朋友可以參考下2014-09-09Python內(nèi)置類型性能分析過(guò)程實(shí)例
這篇文章主要介紹了Python內(nèi)置類型性能分析過(guò)程實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01