ABAQUS二次開發(fā)教程.doc
《ABAQUS二次開發(fā)教程.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《ABAQUS二次開發(fā)教程.doc(18頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
ABAQUS(Python語言)二次開發(fā)教程 ABAQUS(Python語言)二次開發(fā) 人生苦短,我用Python 作者:Fan Shengbao Python2.7 2017年12月 16 目 錄 第一章 Python程序基本語法 1 1.1 Python語法結(jié)構(gòu) 1 1.2 Python元組 1 1.3 Python列表 1 1.4 Python字典 2 1.5 Python集合 3 1.6 Python字符串 3 1.7 Python分支語句 4 1.8 Python循環(huán)語句 5 1.8.1 for循環(huán) 5 1.8.2 while循環(huán) 5 1.9 Python定義函數(shù) 5 1.10 Python模塊 6 1.11 Python包 7 1.12 Python文件和目錄 7 1.12.1 目錄操作 7 1.12.2 文件操作 7 1.13 Python異常處理 8 第二章 ABAQUS/Python二次開發(fā) 9 2.1 ABAQUS執(zhí)行Python程序 9 2.2 編寫ABAQUS/Python程序 10 2.3 ABAQUS錄制Python程序 10 2.4 ABAQUS/Python對(duì)象介紹 11 2.4.1 session對(duì)象 11 2.4.2 mdb對(duì)象 11 2.4.3 odb對(duì)象 13 2.5 ABAQUS完整二次開發(fā)示例 14 2.6 ABAQUS二次開發(fā)常用函數(shù) 16 2.6.1 Part模塊常用函數(shù) 16 ABAQUS(Python語言)二次開發(fā)教程 第一章 Python程序基本語法 1.1 Python語法結(jié)構(gòu) Python語言以縮進(jìn)來約束每個(gè)程序塊,編寫程序時(shí)要特別注意每一行的縮進(jìn)量,同一層次的語句應(yīng)具有相同的縮進(jìn)量。下面是一段Python程序示例: #-*- coding:utf-8 -*- for i in range(1,10): for j in range(1,i+1): print str(j)+x+str(i)+ = +str(i*j), print 該段程序主要功能是實(shí)現(xiàn)乘法口訣表輸出打印,其中“#-*- coding:utf-8 -*-”是約定文檔的編碼方式。程序主體部分由兩個(gè)嵌套的for循環(huán)語句組成,可以看到每一個(gè)for循環(huán)塊的內(nèi)部都具有相同的縮進(jìn)量。程序輸出結(jié)果如下: 1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81 Python程序中一行中“#”號(hào)后面的內(nèi)容為注釋,“#”號(hào)只支持單行注釋,多行注釋可使用“’’’ … ‘’’”注釋符。 Abaqus6.14 Python 1.2 Python元組 Python中的元組(tuple)相當(dāng)于C語言中的數(shù)組簡(jiǎn)化版,其內(nèi)容和長(zhǎng)度均不可變,只能對(duì)其內(nèi)容進(jìn)行訪問。 tt1 = (1,2,3,4,5) print tt1[1] 程序執(zhí)行結(jié)果: 2 1.3 Python列表 Python中的列表(list)相當(dāng)于C語言中的數(shù)組,但比C語言中的數(shù)組使用起來更加方便靈活。其長(zhǎng)度和內(nèi)容均可修改,列表是編程時(shí)使用較多的結(jié)構(gòu)。 list1 = [1,2,3,4,5] print list1[1] list1[1] = 5 print list1 list1.append(6) print list1 程序執(zhí)行結(jié)果: 2 [1, 5, 3, 4, 5] [1, 5, 3, 4, 5, 6] Python列表常用操作方法: 表 11 Python列表常用操作方法 操作方法 功能 list1.append() list1.append(1) 在列表末尾追加元素 list1.extend() list1.extend([7,8,9]) 合并兩個(gè)列表 list1.insert() list1.insert(2, ’1’) 在列表指定位置插入元素 list1.pop() list1.pop(n) 輸出并刪除指定位置的元素,不指定n值時(shí)則彈出末尾元素 list1.index() list1.index(5) 在列表中搜索該元素第一次出現(xiàn)的位置 list1.count() list1.count(1) 在列表中搜索該元素出現(xiàn)的次數(shù) list1.reverse() list1.reverse() 反轉(zhuǎn)列表排序,也可使用list1[::-1] list1.sort() list1.sort() 對(duì)列表進(jìn)行排序 對(duì)列表進(jìn)行切片操作(元組也能進(jìn)行相應(yīng)的操作): list1 = [1,2,3,a,b,5] print list1[2:4] print list1[2:] print list1[1::2] print list1[:-2] 輸出結(jié)果: [3, a] [3, a, b, 5] [2, a, 5] [1, 2, 3, a] 1.4 Python字典 Python中的字典(dict)對(duì)于存儲(chǔ)數(shù)據(jù)非常有用,其存儲(chǔ)的數(shù)據(jù)是無序的,每一個(gè)鍵對(duì)應(yīng)著一個(gè)鍵值,是一種映射型數(shù)據(jù)類型。 dict1 = {author:Fan Shengbao,software:Abaqus} dict1[data] = 2017 #添加一個(gè)字典元素 print dict1[software] #打印‘software’鍵的鍵值 print dict1.keys() #打印所有鍵 print dict1.values() #打印所有的鍵值 print dict1.items() #打印所有鍵及其鍵值 程序輸出結(jié)果: Abaqus [software, Data, author] [Abaqus, 2017, Fan Shengbao] [(software,Abaqus),(Data,2017),(author,Fan Shengbao)] 從打印的結(jié)果可以看出,字典的存儲(chǔ)是無順序的。獲取字典鍵值需通過鍵來訪問,鍵是唯一的,多個(gè)鍵可以對(duì)應(yīng)相同的內(nèi)容。 1.5 Python集合 Python中集合(set)的概念來源于數(shù)學(xué)在的集合,集合中的每個(gè)元素都是唯一存在,多次添加同一元素只存在一個(gè)。集合區(qū)別于列表和元組,其不能通過下表進(jìn)行訪問,但可以將其轉(zhuǎn)換位列表后再進(jìn)行其他操作。 set1 = set(abcde) print set1 set1.add(f) #添加’f’元素 set1.add(b) #添加’b’元素 print set1 print list(set1) 輸出結(jié)果: set([a, c, b, e, d]) set([a, c, b, e, d, f]) [a, c, b, e, d, f] Python中集合常見操作方法: 表12 Python中集合常見操作方法 操作方法 功能 list1 – list2 list1與list2的差集 list1 & list2 list1與list2的交集 list1 | list2 list1與list2的并集 list1.add() list1.add(‘a(chǎn)’)向list1中添加一個(gè)元素 list1.updata() list1.updata([1,2,3])向list1中添加多個(gè)元素 list1.remove() list1.remove(‘a(chǎn)’)移除list1中的’a’元素 1.6 Python字符串 Python中的字符串是一種只能訪問的數(shù)據(jù)類型,定義之后不能對(duì)其內(nèi)容進(jìn)行修改,否則程序?qū)伋霎惓!? str1 = Abaqus 6.14 Python print str1[0:6] print str1.center(30,-) 程序運(yùn)行結(jié)果: Abaqus ------Abaqus 6.14 Python------ Python字符串常見操作方法: 表13 Python字符串常見操作方法 操作方法 功能 str1.find() str1.find(substr,start,end) 從str1中搜索substr,不指定start和end時(shí)指搜索整個(gè)字符串,可以只單獨(dú)指定start str1.count() str1.count(substr,start,end) 獲取字符出現(xiàn)次數(shù) str1.startswith() str1.startswith(str) 是否以str開始 str1.endswith() str1.endswith(str) 是否以str結(jié)尾 str1.center() str1.center(n,char) 以str1為中心獲取n個(gè)字符,不夠部分使用char填充 str1.ljust() str1.ljust(n,char) 以str1為左對(duì)齊獲取n個(gè)字符,不夠部分使用char填充 str1.rjust() str1.rjust(n,char) 以str1為右對(duì)齊獲取n個(gè)字符,不夠部分使用char填充 str1.upper() 將str1全部轉(zhuǎn)換為大寫 str1.lower() 將str1全部轉(zhuǎn)換為小寫 str1.replace() str1.replace(old,new,count) count為替換次數(shù),若省略只替換一次 str1.strip() str1.strip(char) 去除str1前后的char,若省略則去除前后空格 str1.split() str1.split(sep,maxcount) 以sep分割字符串,maxcount為最大分割次數(shù)(可省略),省略sep則使用空格進(jìn)行分割 1.7 Python分支語句 if分支語句有以下三種基本形式,可根據(jù)不同情況選用不同的形式,使用時(shí)需替換pass占位語句: 形式一 形式二 形式三 if condition: pass if condition: pass else: pass if condition1: pass elif condition2: pass else: pass 1.8 Python循環(huán)語句 Python編程語言只包含兩種循環(huán)結(jié)構(gòu),分別是for循環(huán)和while循環(huán)。for循環(huán)要比while循環(huán)使用更加頻繁。 1.8.1 for循環(huán) 1) for循環(huán)主體結(jié)構(gòu): for i in range(1,10): pass else: pass 其中pass為占位符,else可省略,else只有在for循環(huán)不是由break中斷的情況下才會(huì)執(zhí)行else下的語句。 2) for循環(huán)可遍歷元組、列表和字符串: for i in [1,2,3,4,5]: print i 3) for具有一些比較高級(jí)的迭代功能(比普通循環(huán)更加高效,執(zhí)行速度更快): print [i*i for i in range(10)] print [(i,j) for i in range(3) for j in range(3) if i!= j] 程序執(zhí)行結(jié)果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)] 1.8.2 while循環(huán) while循環(huán)主體結(jié)構(gòu): i = 0 while i<10: pass i += 1 else: pass 1.9 Python定義函數(shù) Python語言定義函數(shù)采用def進(jìn)行聲明,函數(shù)體需進(jìn)行統(tǒng)一縮進(jìn)。Python函數(shù)常用的有兩種:參數(shù)有默認(rèn)值的函數(shù)和參數(shù)無默認(rèn)值的函數(shù),函數(shù)參數(shù)某一個(gè)帶默認(rèn)參數(shù)時(shí),其后的參數(shù)也需帶默認(rèn)值。 #參數(shù)無默認(rèn)值 def FunName1(arg1,arg2): return arg1+arg2 #給參數(shù)指定默認(rèn)值 def FunName2(arg1,arg2=1): return arg1+arg2 #函數(shù)調(diào)用 print FunName1(1,2) #返回3 print FunName2(1) #返回2 print FunName2(1,2) #返回3 Python語言也有一些自帶的函數(shù): 表 14 Python自帶函數(shù) 函數(shù)名 功能 abs() abs(-1) 求一個(gè)數(shù)的絕對(duì)值 sum() sum([1,2,3]) 求一個(gè)列表的和,等于6.0 max() max([1,2,3]) 求一個(gè)列表的最大值,等于3 min() min([1,2,3]) 求一個(gè)列表的最小值,等于1 range() range(start,end,step) 產(chǎn)生一個(gè)列表包含start,但不包含end,增量為step(可省略) xrange() xrange(start,end,step) 和range()函數(shù)一樣,但其初始時(shí)只生成一部分,一般用在循環(huán)次數(shù)較多的情況下,能夠減少循環(huán)時(shí)間。 type() type(var) 檢測(cè)變量或內(nèi)容的類型 input() input() 接受一個(gè)輸入,ABAQUS軟件中Python的默認(rèn)輸入函數(shù)有兩個(gè):一個(gè)為單輸入函數(shù)getInput(title,default);另一個(gè)為多輸入函數(shù)getInputs(((title1,default1),( title2,default2),…)),其中title和default為字符串,且default可省略。 len() len(…) 參數(shù)可以是元組、列表或字符串,功能是檢測(cè)其長(zhǎng)度 all() all(…) 檢測(cè)參數(shù),都不為0或‘’,返回True,否則返回False any() any(…) 檢測(cè)參數(shù),任一不為0或‘’,返回True,否則返回False 注:表中只列舉了部分直接訪問的函數(shù),Python標(biāo)準(zhǔn)庫中包含著許多函數(shù),如math庫。 1.10 Python模塊 Python模塊就是一個(gè)py文件,文件中可包含變量、函數(shù)和類??稍诹硪粋€(gè)py文件中導(dǎo)入該模塊,調(diào)用其中的函數(shù)。 導(dǎo)入模塊的方法: ①import ModelName ②from ModelName import FunName 導(dǎo)入自建模塊時(shí),需注意Python的搜索路徑,只有將模塊放入搜索路徑中,才能通過以上方法導(dǎo)入Python模塊。可通過以下代碼查看當(dāng)前Python編輯器的搜索路徑和添加目錄到Python的搜索路徑: import sys print sys.path #打印Python的搜索路徑 sys.path.append(D:\\...) #將“D:\\...”添加到搜索路徑中 1.11 Python包 Python包由一個(gè)初始化文件“__init__.py”及一個(gè)或多個(gè)函數(shù)文件(模塊文件)組成,將這些python文件放入同一個(gè)文件夾下就構(gòu)成了一個(gè)Python包。包中的“__init__.py”文件用來申明包中包含的模塊文件。如圖所示為一個(gè)包的文件構(gòu)成: 圖1.1 Python包文件構(gòu)成 __init__.py文件包含的內(nèi)容如下: __author__ = "Fan Shengbao" __all__ = [openOdbFile,getMaxStress,getMaxDisplacement] 其他文件中均包含著對(duì)應(yīng)的函數(shù) 導(dǎo)入模塊的方法(包文件夾需放入Python的搜索路徑之下): ①單個(gè)函數(shù)導(dǎo)入:from PythonPackageName import getMaxStress ②一次全部導(dǎo)入:from PythonPackageName import * 1.12 Python文件和目錄 1.12.1 目錄操作 獲取當(dāng)前工作目錄和更改當(dāng)前工作目錄: import os print os.getcwd() #獲取當(dāng)前工作目錄 os.chdir(D:\\) #更改當(dāng)前工作目錄 獲取指定目錄下的某種類型文件,可以使用一個(gè)Python的標(biāo)準(zhǔn)庫glob,代碼實(shí)例如下: import glob print glob.glob(D:\\*.odb) #獲取所有的odb文件 print glob.glob(D:\\name.*) #所有以name為名的文件 1.12.2 文件操作 打開和關(guān)閉文件: file = open(D:\\1.txt) #打開文件,也可指定打開方式(r、w等) file.close() #關(guān)閉文件 讀寫文件內(nèi)容: 通常讀文件時(shí)使用一條語句讀取全部?jī)?nèi)容,并將每一行內(nèi)容獨(dú)立存入列表中,具體示例代碼如下: f = open(D:\\1.txt).read().split(\n).strip() 也可以使用下表所示的讀寫文件函數(shù)進(jìn)行讀寫操作,Python還有其他的一些讀寫操作函數(shù)未列舉在表中。 表15 文件讀寫函數(shù) 函數(shù) 功能 read() 一次性讀取全部?jī)?nèi)容 readline() 每次讀取一行內(nèi)容 readlines(num) 每次讀取num行內(nèi)容 write() 寫文件,參數(shù)為一個(gè)字符串,可包含換行符 writelines() 寫多行,參數(shù)為一個(gè)列表,換行添加‘\n’ 1.13 Python異常處理 Python異常處理能夠規(guī)避程序執(zhí)行錯(cuò)誤,當(dāng)程序出錯(cuò)時(shí)能夠進(jìn)行相應(yīng)的處理或者直接忽略錯(cuò)誤繼續(xù)執(zhí)行程序。 異常處理結(jié)構(gòu)(pass可以替換為相應(yīng)的代碼): try: pass except ErrorType: pass finally: pass 將可能出錯(cuò)的代碼放入try代碼行下面,except后接指定的錯(cuò)誤類型或不指定(接受所有錯(cuò)誤),當(dāng)指定錯(cuò)誤發(fā)生時(shí),程序執(zhí)行except下的程序,最后執(zhí)行finally下的程序。 第二章 ABAQUS/Python二次開發(fā) 2.1 ABAQUS執(zhí)行Python程序 ABAQUS執(zhí)行Python程序的方法可以找百度,下圖為ABAQUS軟件自帶的編譯器PDE,可用于調(diào)試Python程序,支持?jǐn)帱c(diǎn)調(diào)試。 圖 2.1 ABAQUS軟件PDE編輯器 常用的ABAQUS軟件執(zhí)行Python方法: ① File—>Run Script…再選擇需要運(yùn)行的Python程序文件 ② 直接在宏程序里面編寫程序,再調(diào)用宏管理器(File—>Macro Manager…)執(zhí)行程序 ③ 只寫幾行代碼的話,可以到ABAQUS軟件底部的kernel command line interface中編寫 圖2.2 kernel command line interface窗口 2.2 編寫ABAQUS/Python程序 下面是一個(gè)ABAQUS/Python程序的簡(jiǎn)單例子:該段程序生成如圖所示的三維模型,并導(dǎo)入到裝配模塊中。 #-*- coding:utf-8 -*- from abaqus import * #導(dǎo)入Abaqus常量模塊 from abaqusConstants import * #導(dǎo)入Abaqus中常用的模塊,例如step,material…… from caeModules import * #新建一個(gè)Model并命名為Model-1 model1 = mdb.Model(name=Model-1) #創(chuàng)建一個(gè)三維可變形實(shí)體,并命名為Part-1 part1 = model1.Part(name=Part-1,dimensionality=THREE_D, type=DEFORMABLE_BODY) #創(chuàng)建一個(gè)名為Sketch-1的草圖 skt = model1.ConstrainedSketch(name=Sketch-1,sheetSize=100) #在創(chuàng)建的草圖中繪制一個(gè)矩形 skt.rectangle(point1=(-50,-50),point2=(50,50)) #在草圖中心繪制一個(gè)R=25的圓 skt. CircleByCenterPerimeter(center=(0,0),point1=(25,0)) #對(duì)草圖skt進(jìn)行拉伸,指定深度為50 part1.BaseSolidExtrude(sketch=skt,depth=50) asm = model1.rootAssembly #訪問裝配模塊 #將新建的part1添加到裝配中 asm.Instance(name=Part-1-1,part=part1,dependent=ON) 2.3 ABAQUS錄制Python程序 使用宏管理器可以將對(duì)ABAQUS的操作錄制成Python程序,通過宏錄制可縮短程序開發(fā)時(shí)間,方便對(duì)ABAQUS軟件進(jìn)行二次開發(fā)。稍加修改錄制后的程序,就能得到想要的效果。 下圖為ABAQUS軟件的宏管理器(File—>Macro Manager…): 圖2.3 ABAQUS軟件宏管理器 點(diǎn)擊Create…能夠?qū)BAQUS軟件的操作進(jìn)行錄制,生成Python代碼并添加到宏管理器中,某些情況下需對(duì)程序進(jìn)行一定的編輯才能重復(fù)出錄制的操作,直接運(yùn)行可能得不到與之前操作一樣的結(jié)果或者程序直接報(bào)錯(cuò)。 2.4 ABAQUS/Python對(duì)象介紹 2.4.1 session對(duì)象 session模塊主要用來控制窗口顯示屬性,例如新建多個(gè)窗口、設(shè)置窗口大小、調(diào)整當(dāng)前顯示窗口和打開odb文件等。錄制程序時(shí)會(huì)出現(xiàn)多行以session開頭的語句,但其中大部分記錄的是我們調(diào)整視圖的操作,例如轉(zhuǎn)動(dòng)或平移一下模型,編輯時(shí)可刪除這些語句。 獲取當(dāng)前顯示的窗口名稱: viewportName = session.currentViewportName 獲取當(dāng)前顯示的窗口的model名稱: viewportName = session.currentViewportName modelName=session.viewports[viewportName].displayedObject.modelName 新建一個(gè)窗口: session.Viewport(name = Viewport: 2) 2.4.2 mdb對(duì)象 mdb對(duì)象是ABAQUS前處理中最為重要的一個(gè)對(duì)象,是一個(gè)頂層對(duì)象,下面包含著豐富的子對(duì)象和方法。 表 21 mdb對(duì)象信息 成員類型 名稱 功能 構(gòu)造函數(shù) Mdb() 生成一個(gè)新的模型數(shù)據(jù)庫 成員函數(shù) openMdb() 新建一個(gè)cae文件,參數(shù)為cae文件完整路徑 mdb.close() 關(guān)閉當(dāng)前cae文件,并不保存 mdb.save() 保存當(dāng)前cae文件 mdb.saveAs() 另存為cae文件,參數(shù)為另存cae文件的完整路徑 mdb.Model() 生成一個(gè)model,參數(shù)為model名 …… …… 成員變量 mdb.jobs() 當(dāng)前模型創(chuàng)建的所有job mdb.models() 當(dāng)前模型所有的model …… …… 每個(gè)cae文件包含一個(gè)或多個(gè)Model,大部分前處理信息均包含在每個(gè)Model下面,通過mdb.models[modelName]可單獨(dú)訪問每個(gè)Model下的數(shù)據(jù)。通過每個(gè)Model可繼續(xù)訪問之下的part、material和rootAssembly等。 圖 2.4 Model下的部分對(duì)象 Python在前處理中,可以用來建立復(fù)雜的三維模型,下面程序建立了一個(gè)三維函數(shù)曲面圖,數(shù)學(xué)公式如式2.1所示,代碼如下: (2.1) #程序開始 #-*- coding:utf-8 -*- from abaqus import * from abaqusConstants import * from caeModules import * import math part1 = mdb.models[Model-1].Part(name=Part-1, dimensionality=THREE_D,type=DEFORMABLE_BODY) point_U = [] point_Utemp = None point_V = [] point_Vtemp = [] for i in range(-100,100): point_V.append([]) for i in xrange(-100,100): point_U = [] for j in xrange(-100,100): x = 0.025*i y = 0.025*j coord = (x,y,3*x*math.exp(-x**2-y**2)) point_U.append(coord) point_V[j+100].append(coord) part1.WireSpline(points=point_U, mergeType=MERGE, meshable=ON, smoothClosedSpline=ON) for i in point_V: part1.WireSpline(points=i, mergeType=MERGE, meshable=ON, smoothClosedSpline=ON) part2 = mdb.models[Model-1].Part(name=Part-2, dimensionality=THREE_D,type=DEFORMABLE_BODY) edges = [] for i in point_V: part2.WireSpline(points=i, mergeType=MERGE, meshable=ON, smoothClosedSpline=ON) for i in point_V: edges.append((part2.edges.findAt(i[0]),)) part2.ShellLoft(loftsections=(edges), startCondition=NONE, endCondition=NONE) asm = mdb.models[Model-1].rootAssembly asm.Instance(name=Part-1-1,part=part1,dependent=ON) asm.Instance(name=Part-2-1,part=part2,dependent=ON) session.viewports[Viewport: 1].setValues(displayedObject=asm) 該程序生成兩個(gè)三維模型,如圖所示: 圖2.5 線框模型 圖2.6 曲面模型 2.4.3 odb對(duì)象 odb對(duì)象和mdb對(duì)象有很多的相似性,包含的對(duì)象和訪問方式也幾近相同。下面代碼可用于讀取指定odb文件的最后分析步的最大應(yīng)力并打印顯示出來: def readMaxStress(myViewport, jobName): path = os.getcwd() o1 = session.openOdb(name=path+\\+jobName+.odb) myViewport.setValues(displayedObject=o1) myViewport.odbDisplay.setPrimaryVariable(variableLabel=S, outputPosition=INTEGRATION_POINT, refinement=( INVARIANT, Mises), ) myViewport.odbDisplay.display.setValues(plotState=( UNDEFORMED, )) myViewport.odbDisplay.display.setValues(plotState=( CONTOURS_ON_DEF, )) print myViewport.odbDisplay.contourOptions.autoMaxValue 2.5 ABAQUS完整二次開發(fā)示例 該段程序?qū)崿F(xiàn)了平板拉伸應(yīng)力分析,完成了從建模、添加邊界條件載荷、監(jiān)控計(jì)算狀態(tài)和應(yīng)力自動(dòng)讀取完整分析過程。 #-*- coding:utf-8 -*- from abaqus import * from abaqusConstants import * from caeModules import * import os import __main__ def PlateTensile(h,w,r,t,f): #檢測(cè)輸入是否正確 if r>=h/2.0: print "Error: Radius > Height" return False if r>=w/2.0: print "Error: Radius > width" return False if r<=0 or t <= 0 or f == 0: print "ERROR!!!" return False #創(chuàng)建名為‘Model-1’的模型對(duì)象 model = mdb.Model(name = Model-1) part = model.Part(name=Part-1,dimensionality=THREE_D, type=DEFORMABLE_BODY) asm = model.rootAssembly skt1 = model.ConstrainedSketch(name=Skt1,sheetSize=200) skt1.rectangle(point1=(-w/2.0,-h/2.0),point2=(w/2.0,h/2.0)) skt1.CircleByCenterPerimeter(center=(0,0),point1=(r,0)) part.BaseShell(sketch = skt1) session.viewports[Viewport: 1].setValues(displayedObject=part) model.Material(name=Material-1) model.materials[Material-1].Elastic(table=((210000.0, 0.3),)) model.HomogeneousShellSection(name=Section-1,preIntegrate=OFF, material=Material-1, thicknessType=UNIFORM,thickness=t, thicknessField=, idealization=NO_IDEALIZATION, poissonDefinition=DEFAULT, thicknessModulus=None, temperature=GRADIENT,useDensity=OFF, integrationRule=SIMPSON, numIntPts=5) f1 = part.faces region = regionToolset.Region(faces=f1) part.SectionAssignment(region=region, sectionName=Section-1, offset=0.0, offsetType=MIDDLE_SURFACE, offsetField=, thicknessAssignment=FROM_SECTION) asm.Instance(name=Part-1-1, part=part, dependent=ON) model.StaticStep(name=Step-1, previous=Initial) s1 = asm.instances[Part-1-1].edges edges1 = s1.findAt(((w/2.0,0,0),)) edges2 = s1.findAt(((-w/2.0,0,0),)) rp1 = asm.ReferencePoint(point=(w/2.0,0,0)) region1 = regionToolset.Region(edges=edges1) region2=regionToolset.Region(referencePoints=( asm.referencePoints[rp1.id],)) #參考點(diǎn)和邊進(jìn)行耦合操作 model.Coupling(name=Constraint-1, controlPoint=region2, surface=region1, influenceRadius=WHOLE_SURFACE, couplingType=KINEMATIC,localCsys=None, u1=ON, u2=ON, u3=ON, ur1=ON, ur2=ON, ur3=ON) model.ConcentratedForce(name=Load-1, createStepName=Step-1, region=region2, cf1=f, distributionType=UNIFORM, field=, localCsys=None) model.EncastreBC(name=BC-1, createStepName=Initial, region=regionToolset.Region(edges=edges2), localCsys=None) part.setMeshControls(regions=f1, elemShape=QUAD) part.seedPart(size=(w+h)/200.0,deviationFactor=0.1, minSizeFactor=0.1) part.generateMesh() jobName = Test-1 mdb.Job(name=jobName, model=Model-1, description=, type=ANALYSIS, atTime=None, waitMinutes=0, waitHours=0, queue=None, memory=90, memoryUnits=PERCENTAGE, getMemoryFromAnalysis=True, explicitPrecision=SINGLE, nodalOutputPrecision=SINGLE,echoPrint=OFF, modelPrint=OFF, contactPrint=OFF, historyPrint=OFF, userSubroutine=,scratch=, resultsFormat=ODB, multiprocessingMode=DEFAULT, numCpus=1, numGPUs=0) from jobMessage import JOB_ABORTED,JOB_COMPLETED,JOB_SUBMITTED #讀取最大應(yīng)力值并打印 def readMaxStress(userData): path = os.getcwd() o1 = session.openOdb(name=path+\\+jobName+.odb) userData.setValues(displayedObject=o1) userData.odbDisplay.setPrimaryVariable(variableLabel=S, outputPosition=INTEGRATION_POINT, refinement=( INVARIANT, Mises), ) userData.odbDisplay.display.setValues(plotState=( UNDEFORMED, )) userData.odbDisplay.display.setValues(plotState=( CONTOURS_ON_DEF, )) print userData.odbDisplay.contourOptions.autoMaxValue myViewport = session.viewports[Viewport: 1] def dealResult(jobName,messageType,data,userData): if messageType==JOB_ABORTED: print ERROR!.center(100,-) if messageType==JOB_COMPLETED: print COMPLETED.center(100,-) readMaxStress(userData) monitorManager.removeMessageCallback(jobName=jobName, messageType=ANY_MESSAGE_TYPE, callback=dealResult,userData=myViewport) #設(shè)置監(jiān)控job是否計(jì)算完成 monitorManager.addMessageCallback(jobName=jobName, messageType=ANY_MESSAGE_TYPE, callback=dealResult,userData=myViewport) #提交job進(jìn)行計(jì)算 mdb.jobs[jobName].submit(consistencyChecking=OFF) if __name__ == "__main__": PlateTensile(50,100,10,1,100) 2.6 ABAQUS二次開發(fā)常用函數(shù) 2.6.1 Part模塊常用函數(shù) 1). 訪問已有的Part路徑:mdb.models[ModelName].parts[PartName] 2). 創(chuàng)建一個(gè)新的Part: mdb.models[ModelName].Parts[name=PartName,dimensionality=dimensionality,type=partType] ① 必須指定參數(shù): name:為Part的名字; dimensionality:為THREE_D、TWO_D_PLANAR或AXISYMMETRIC. type:為DEFORMABLE_BODY、EULERIAN、DISCRETE_RIGID_SURFACE或ANALYTIC_RIGID_SURFACE; ② 可選參數(shù): twist:一個(gè)布爾值,只有在軸對(duì)稱可變形體下才需指定,其默認(rèn)值為OFF。 3) 從已有的Part中復(fù)制一個(gè)Part: mdb.models[ModelName].Part(name=PartName,objectToCopy=part) ① 必須指定參數(shù): name:指定復(fù)制后Part的名字; objectToCopy:指定一個(gè)已有的Part對(duì)象; ② 可選參數(shù) scale:縮放因子,默認(rèn)值為1; mirrorPlane:可能值為XYPLANE、XZPLANE或YZPLANE。也可指定一個(gè)鏡像平面,如果指定平面,則參數(shù)compressFeatureList將自動(dòng)設(shè)置為ON。其默認(rèn)值為NONE; compressFeatureList:如果設(shè)置為ON,則會(huì)丟失原來的Part中的datum點(diǎn)和set集,默認(rèn)值為OFF; separate:是否分離不相連的cell進(jìn)入多個(gè)Part,默認(rèn)值為OFF。 4) 未完待續(xù)………- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- ABAQUS 二次開發(fā) 教程
鏈接地址:http://www.820124.com/p-6594070.html