使用python進行ABAQUS的二次開發的簡要說明(by Young 2017.06.27)

(所有用詞以英文爲準,翻譯僅供參考)

一、abaqus二次開發總述:

首先最重要的知識點需要明確,abaqus在求解核心(Solver/ Kernel)和圖形用戶界面(GUI)之間使用的交互語言天然就是python,因此使用python進行abaqus二次開發是十分自然的選擇(當然你也可以用C++,但是鑑於python所擁有的各類開源庫函數的優勢,python應當是二次開發的首選)。abaqus已經使用python寫好了很多用於計算、建模、GUI等操作的模塊,因此二次開發的重點在於靈活調用這些模塊,完成自己的設計計算需求。所以原則上,所有能通過abaqus/CAE交互完成的操作,使用腳本都可以實現。並且由於Python提供的豐富的函數資源庫,會使得很多複雜的建模的過程更加參數化,更加可控,有時候甚至更加簡單。

其次二次開發的學習要點在於勤查手冊,其中Abaqus Scripting User's Manual和Abaqus Scripting User's Reference Manual是查閱的重點,其中後者是abaqus中各個object內置方法,路徑,輸入參數等的詳細說明。

最後關於調用腳本的幾種用法說明:

(1)直接在命令行調用

    調用腳本並打開cae界面: abaqus cae script=myscript.py

    調用用於可視化操作腳本,打開顯示界面(注意:此時只有visualization模塊被激活): abaqus cae viewer=myscript.py

    調用腳本在命令行執行,同時不打開GUI界面,但會進入python交互界面:abaqus cae noGUI=myscript.py

(2)在abaqus的GUI界面調用

    按照Main Menu: File->Run Script,選擇需要調用的腳本文件,abaqus會進行執行

(3)在abaqus的命令行交互界面調用(command line interface,CLI)

    在abaqus的GUI界面打開之後,窗口的最下方會有命令輸入的位置,在這裏也可以調用python腳本,執行方法是鍵入命令:

    

execfile('myscript.py')

abaqus的python腳本其實和其他應用場景下的python腳本沒有太多區別,只不過有很多abaqus已經開發好的對象庫可供使用,其學習過程和學習任何其他python庫都是一致的。因此這條在寫python代碼時的規律對於理解abaqus腳本中的各種現象同樣很有幫助:一切皆對象(當然這也是python語言美感的來源之一)。

這裏篇幅有限,無法展開介紹python編程,因此只明確python中的幾個基本概念:

對象(object): 將具有特定數據結構與組織形式的數據和在數據上所定義的操作全部封裝到一起的封裝體稱爲對象;

成員(member):對象內所定義的數據;

方法(method):在對象內定義的對於數據的操作;

構造函數(constructor):一類特殊的方法,用於創建新的對象;

類(class):創建對象的模板,本質也是一種對象,但是更強調它的模板性;

模塊(module):已經寫好的類,對象,方法或者函數等等的集合,通過一系列操作完成某種特定的功能,module的作用在於方便代碼複用,例如from abaqus import * 這個語句就是導入了abaqus這個模塊,使得其中功能可以被腳本引用;

字典(dictionary):python中的一種數據類型,無序排列的(key,value)的pair的集合,在abaqus的腳本開發中是十分重要的概念。

 

二、abaqus python腳本構成簡述:

儘管整體上看,abaqus的python腳本沒有什麼特殊之處,但是畢竟作爲在abaqus環境下使用的腳本,還是有一些特殊之處是值得一提的。

首先介紹abaqus python腳本中幾個比較重要的基本概念:

數據庫(database):負責存儲模型的各種信息,本質上是一類特殊的對象,也可以理解成帶有強烈abaqus特徵的對象,比較典型的database就是mdb;

容器(Repository):負責同一類型的對象的存儲,可以視爲python中的字典,只不過這個字典專門用於存儲某一類對象,比如mdb.models中存儲了當前環境下所建立的所有模型對象,通過對象的鍵值,可以實現對於特定對象的調用;

聲明使用(Access):通過在腳本開頭聲明導入某類模塊,從而獲得該模塊中對象、成員和方法的使用權(實際上新的session被打開時,所有模塊都被裝載了,大部分聲明是爲了可讀性與完備性,但有一些聲明是不可以缺少的,後文會提到)

路徑(Path):調用某個特定方法的具體語句實現,比如這裏mdb.models[name].parts[name].DatumAxisByCylFace就說明了使用DatumAxisByCylFace這個方法的完整路徑,需要從mdb這個數據庫出發,索引到叫name的model對象,在這個model對象下索引叫name的part對象,這個part對象裏面定義了一個方法叫DatumAxisByCylFace。當然同一個方法的路徑可以有很多,這一點應當與python語言內在的繼承性有關,相似的對象(類)繼承自同一個父類,那麼不同對象下具有同樣的方法其實並不奇怪;

參數(Argument):對象的方法在使用時所需要的輸入參數;

2.1. 所有的腳本都必須保證以下面兩個語句開頭:

 

from abaqus import *
from abaqusConstants import *

第一個語句保證腳本可以使用abaqus中基本的object,同時保證腳本可以使用默認的模型數據庫(mdb),在abaqus中以mdb標識;

第二個語句保證Abaqus中定義的各個符號常量可以被腳本正確獲取;

當然如果有涉及結果文件後處理還需要:

 

from odbAccess import *

如果涉及可視化操作則需要:

 

from visualization import *

2.2. 隨後腳本會導入需要使用的具體的各個模塊,例如:

 

import sketch
import part
import assembly
import material
import visualization

這一步的操作是爲了保證所需要使用的對象的成員(Members)和方法(Methods)可以被腳本所使用,以material爲例:

 

import material
mdb.models[name].materials[name]

 

這裏插一句,對於多數已經適應了面向過程編程的人而言,在使用面嚮對象語言時常常會有看不到賦值操作的慌張。因爲乍看起來那個語句沒有輸出,但顯然如果真的沒有任何“輸出”那必然是無效的編程語句,因此會感到十分困惑和迷茫。所以這裏需要強調的是,在面嚮對象語言中,對象(Object)是數據(Member)和在數據上定義的操作方法(Methods)的集合體,所以當我們使用一個對象的方法時,它所對應的數據成員有可能已經得到了修改,因此我們並不需要額外的賦值操作,對數據的操作(包括賦值)已經在對象的方法裏預先定義好了,而這也是爲什麼人們覺得面向對象的封裝性更好的原因。

這裏給出一個材料定義的例子:

 

mdb.models[crash].Material[steel]
mdb.models[crash].materials[steel].Elastic(table=((30000000.0, 0.3), ))
elasticityType = mdb.models[crash].materials[steel].elastic.type

通過觀察,其實我們已經能發現一個小規律,那就是在abaqus中,同樣名稱的單詞(如這裏的material),當它首字母大寫(通常作爲單數)出現時一般是構造函數(Constructor),而當它全小寫(通常作爲複數)出現時,它一般是類似字典的容器(abaqus裏叫做

repository),它們之間的聯繫在於那個構造函數是用於構造這個容器中所儲存的對象的。在這樣認識的基礎上,可以很容易避開操作中的一個易錯點,那就是什麼時候該用什麼類型的括號。顯然構造函數後面需要的是輸入參數(arguments),因此是圓括號,而字典類數據庫後面需要的是指示符(index),因此是方括號。

需要注意的是:同樣的構造函數,在使用的時候可以有不同的路徑(path),如建立Datum的構造函數:

 

mdb.models[name].parts[name].DatumAxisByCylFace
mdb.models[name].rootAssembly.DatumAxisByCylFace

因此同樣的構造函數會有各種各樣的調用路徑,只要這個方法確實是構造函數,那麼關於它路徑的描述就會在Abaqus Scripting User's Reference Manual中被列出。

2.3.1. 在這之後,對於不是用於後處理的腳本,通常需要建立一個新的模型:


myModel = mdb.Model(name = 'Model A') 

簡單解釋下這個語句的含義,首先python語言中一切皆對象,不論abaqus管一個對象叫object還是叫database都不能改變其內在的object(對象)屬性,之所以會有不同名稱,是因爲在使用過程中強調的側重有所不同。所以用python語言來解釋就是利用mdb這個對象(abaqus裏叫database或者Python裏其實應該是一個class)的其中一個Model方法(更確切的說,在這裏是一個構造函數,constructor),建立了一個新的對象,並將這個對象賦值給了名爲myModel的變量,而在方法Model中,需要的輸入參數之一是模型名稱name,該參數被賦值爲‘Model A’。同樣的操作在abaqus裏解釋起來也可以換一種描述,那就是:我們建立了一個名稱爲‘Model A’的新模型,將它存儲在mdb這個database裏,並且將這個新模型的引用交給了變量myModel。

在這裏有必要明確一下兩種會引起混淆的引用手段:

myPart = myModel.Part(name='Part A', dimensionality=THREE_D, type=DEFORMABLE_BODY)

 


myPart = mdb.models['Model A'].Part(name='Part A', dimensionality=THREE_D,                              type=DEFORMABLE_BODY)

從功能上來說,兩種引用的效果是相同的,第一種引用是直接引用已經生成的Model對象實例,而第二種引用則是通過在mdb中找models這個字典下對應的‘Model A’的實例,但是這兩者殊途同歸。

2.3.2. 如果已經有了現有的模型,同樣可以通過讀取現有的數據文件來進行二次開發:

這樣就沒有了新建模型的步驟,取而代之的是一個讀取命令:

openMdb(pathName)

通過給出指定路徑abaqus會打開已經建立的database文件(通常默認後綴是.cae),這樣我們可以針對一個已經建立的模型進行二次開發

有些時候,我們如果只有結果文件,則需要使用下面的手段從odb文件出發建立我們需要的模型:

mdb.ModelFromOdbFile(name, odbFileName)

2.4. 在建立了模型之後就是具體的操作細節了:

我們需要做的就是按照abaqus/CAE界面的基本操作流程,在腳本中將各個操作一一實現:

建立幾何模型,創建材料參數,分配單元與材料屬性,定義邊界條件與載荷,劃分網格,提交求解,後處理查看等。

 

三、查閱abaqus中對象方法描述的重要手段:

在實際的模型開發工作中,很多時候我們需要知道我們想要實現的操作在abaqus腳本里究竟如何實現,換句話說,如何才能找到合適的對象(object),合適的方法(method),以及它們所對應的路徑(Path)。其實熟悉python的話就會知道,__methods__,__doc__是python中常用的查看對象(object)具有哪些方法(methods),方法(Methods)如何使用的兩個重要屬性(attributes)。在這裏又一次體現了abaqus交互操作和python的血緣關係。

因此可以通過__method__來查看一個對象所定義的全部方法,如:

 

mdb.__methods__
myOutputFile.__methods__

同樣可以通過__doc__來查看一個對象所定義的某一個方法該如何使用,如:

 

mdb.Model.__doc__
session.Viewport.__doc__

此外還有查閱對象的member列表的方法如下:

objectName.__members__ 

而在abaqus中使用print命令有時候也能查看到member的信息,用法很簡單,範例如下:

print nodes1[0]

輸出結果:

({'coordinates': (680.0, -115.0, -7.03889030395644e-11), 'instanceName': 'model-1', 'label': 11})

範例2:

p=mdb.models['myModel'].parts['myPart']
print p

輸出結果:

({'allInternalSets': 'Repository object', 'allInternalSurfaces': 'Repository object'...}) (結果過長,不完整展示)

可以看到通過print函數,可以極爲方便地獲取到想要了解的對象的member信息。

python裏有時也會用到.__dict__這個屬性,這個屬性在abaqus裏可能不太容易獲得需要的信息,但是在import mesh模塊之後,mesh.__dict__還是有驚喜的。

那麼基於之前的討論,在遇到某個特定操作不知道如何在腳本中實現時,這裏給出一個可供參考的思路:首先確定基本的父級對象,比如想知道如何構造一個具體的材料模型,那父級對象就是mdb.models['myModel'],那麼接下來通過mdb.models['myModel'].__methods__我們可以獲得model對象中定義的所有方法,根據關鍵字我們可以找到Material這個構造函數,隨後我們通過 mdb.models['myModel'].Material('NewMat')來新建一個material對象‘NewMat’,隨後通過mdb.models['myModel'].materials['NewMat'].__methods__我們可以看到剛剛建立的材料對象都有哪些方法可以使用,就能知道具體可以定義那些材料,比如找到了Elastic這個構造函數,那麼再使用mdb.models['myModel'].materials['NewMat'].Elastic.__doc__就能夠知道Elastic這個構造函數的相關操作,如果描述不足的話,我們可以根據所獲得的信息到Reference Manual裏去查找更具體的信息。這樣信息查找的來源可以變得更加豐富。最常見的基礎父級對象是mdb,session還有mesh,從這幾個對象出發,再加上abaqus對於對象和方法的命名很少使用縮寫,同時結合參考手冊,是能夠確定大多數操作所對應的腳本實現語句的。

當然還有另外一種更加直接的思路,如果對GUI界面操作十分熟悉的話,利用GUI操作點選實現想要的功能,然後查閱工作路徑下生成的.rpy或.jnl文件記錄,就能夠獲得相應GUI操作所對應的腳本命令

 

四、abaqus中數據類型都有哪些(Abaqus Scripting User's Manual 5.3節):

4.1. SymbolicConstants (符號常量)

如前所述,from abaqusConstants import * 語句是調用這些常量的前提。這些常量都以全文大寫的形式出現,這些常量會作爲一些方法的輸入參數,或者是爲對象成員賦值時出現。舉例說來,Elastic這個對象的type成員的值就可以是下列這些符號常量:

ISOTROPIC,ORTHOTROPIC, ANISOTROPIC, ENGINEERING_CONSTANTS, LAMINA, TRACTION, 或者COUPLED_TRACTION

當然在需要的時候,甚至可以通過

SymbolicConstant這個構造函數來構造用戶自己的常量

4.2. Booleans(布爾類型變量)

和python中定義的布爾數類型是相同的,分爲True和False兩種取值,但是需要注意的是abaqus還有一類自己定義的布爾值,可以取ON和OFF,使用type函數時,會提示值爲

AbaqusBoolean,這裏需要注意一下。

4.3.

Repositories(容器型變量)

這是abaqus中最爲重要的變量類型,是各種操作得以實現的基礎,它很像python中的字典(dictionary)。舉個例子,

mdb.models就是一個包含所有定義的model的Repository,通過model的名稱(類比字典裏的鍵值),就可以提取出這個名稱對應的模型對象:mdb.models['Model-1']。而進一步,mdb.models['Model-1'].parts則可以引用所有在‘Model-1’之內的part對象。

如果需要查看容器內已經定義的對象名稱和值,通過mdb.models.values()和mdb.models.keys()可以得到容器內已經定義的對象信息。key對應對象名(鍵),value對應對象(值)。這裏操作不僅針對models這個容器有效,換成其他任意的容器,操作都是類似的,比如mdb.models['Model-1'].sketches.keys()可以查看所有創建的Sketch的索引鍵。

 

五、幾何建模操作說明(幾何建模命令的主要集中於37節parts commands和48節sketcher commands)

5.1. abaqus建模時基本幾何元素對象的說明:(Abaqus Scripting User's Reference Manual, Part I 第7章 Basic geometry commands

    5.1.1. Cell/CellArray 對象: 

        體幾何元素,這裏以體幾何元素爲例,着重談一下有Array和沒有Array的區別。Cell 對象指的是一個單獨的體對象,而CellArray對象指的是一羣體對象的序列,它們的引用方法類似但是有所區別,如果是引用Cell對象的話:mdb.models[name].parts[name].cells[i]等可以實現調用,注意這裏明確給出了下標,所以這裏引用的一定是某一個具體的體對象,而Cell Object中定義的方法大多也只能作用於單獨的一個體,如果引用CellArray對象的話,mdb.models[name].parts[name].cells等可以實現調用,注意區別,沒有下標了,所以這是針對體對象所構成的集合對象的引用,而在CellArray下定義的方法自然多是用於處理多個體對象的。

    5.1.2. Edge/EdgeArray 對象:

        一維線幾何元素

    5.1.3. Face/FaceArray 對象:

        二維面幾何元素,這裏以FaceArray對象爲例,介紹一個十分有用的方法,findAt(...) ,這個方法可以根據座標選擇需要執行操作的面對象

    5.1.4. Vertex/VertexArray 對象: 

        零維點區域幾何元素,可以理解爲頂點。

5.2. 在草圖(sketch)中構建幾何對象(48.5節 ConstrainedSketcherOptions object)

 

mdb.models[name].ConstrainedSketch(name='yourName', sheetSize=Value)

可以創建一個新的草圖(Sketch),這個草圖(Sketch)會被儲存在sketches這個repository裏,如要訪問草圖,那麼路徑是mdb.model['name'].sketches['name']。在Sketch中可以創建Arc,Circle,Ellipse,Fillet,Line這些幾何元素,這些幾何元素會以mdb.models[name].sketches[name].geometry[i]的形式儲存在geometry這個repository裏,每一個index都對應一個獨立的幾何對象,並可以對其使用相對應的方法進行操作

草圖繪製中旋轉矩陣(transform matrix)的說明,這個矩陣可以用於描述所要建立的sketch在三維global 座標系下的方向和位置,這個變換矩陣會由兩部分組成,一部分是3X3的旋轉矩陣,還有一部分是描述平移的三維向量。

5.3. 高亮顯示幾何元素操作 (Abaqus Scripting User's Reference Manual, Part I,11.7節 Highlight commands)

這是十分常用的操作,用於高亮選中的幾何元素,判斷是否是自己需要的,在建模、施加載荷中會頻繁用到,其用法十分簡單,直接:highlight(object) 就可以完成,更具體的例子類似這樣:

# Find baseline according to onPoint coordinate
baseline = e.findAt(((x,-y,0.0)),)
highlight(baseline) #You will see the highlighted line in your viewport

 

highlight命令所支持的高亮對象包括:

mdb下:Vertex, Edge, Face, Surface, Cell, Node, Element, Element Face, Element Edge, Feature, Datum, Instance, Set, Load, Boundary condition, Predefined field, Display group, 

odb下: Node, Element, Display Group

如果要取消高亮,那麼對應的命令是unhighlight()

5.4. 關於Sketch平面的幾點說明

sketch平面是建模中常常會使用到的輔助平面,正確理解sketch平面方向的定義過程有助於建模過程的快速實現,下面給出的是一個定義sketch平面的組合語句塊:

 

p = mdb.models['myModel'].parts['myPart'] #取出part信息
d1 = p.datums #取出參考幾何元素容器的信息
#在所要繪製草圖的平面建立一個參考平面
lbs1 = p.DatumPlaneByPrincipalPlane(principalPlane=YZPLANE, offset=500.0) 
#建立一條參考線備用,用於確定sketch平面x軸方向
edge =p.DatumAxisByTwoPoint(point1=(0.0,0.0,-1000.0), point2=(0.0,1000.0,-1000.0)) 
#利用之前的參考信息生成所需sketch平面的轉換矩陣(會考慮旋轉和平移)
t = p.MakeSketchTransform(sketchPlane=d1[lbs1.id], sketchUpEdge=d1[edge.id], 
                       sketchPlaneSide=SIDE1, origin=(500.0, 0.0, 0.0)) 
#使用剛剛新建的轉換矩陣t,完成sketch平面的創建
s = mdb.models['myModel'].ConstrainedSketch(name='__profile__', sheetSize=1000.0,
                                            gridSpacing=20.0, transform=t)

 

關於sketch平面座標系定義的問題這裏值得討論一下:MakeSketchTransform這個constructor中sketchPlane關鍵字負責控制sketch所在的平面,sketchUpEdge負責控制sketch平面的方向,可以與

sketchOrientation參數配合使用,sketchOrientation默認是RIGHT,因此sketchUpEdge可以用於指示x座標軸所指向的方向,從sketch的origin出發指向sketchUpEdge的方向即爲x軸正方向,或者說y軸會與此sketchUpEdge平行。而sketchPlaneSide負責控制參考面法向,其實控制了sketch平面使用左手系還是右手系,x單位向量與y單位向量的叉積與平面法向量方向相同時使用關鍵字SIDE1,與平面法向量反向相反時使用SIDE2。

這個語句組模塊的有用之處在於後續可能涉及sketch的命令:例如常用的CutExtrude等,是需要設置sketchPlane,sketchUpEdge等信息的,因此強烈建立在使用這些命令前先利用MakeSketchTransform建立對應的sketch平面,隨後在CutExtrude這些後續命令中使用完全相同的sketch平面設置,這樣做的好處是可以避免潛在的設置衝突,否則錯誤的排除是十分棘手的,因爲建模問題首先排查的可能是幾何參數衝突。

如果sketch的名稱被命名爲__edit__的情況下,那麼abaqus會將參考幾何和非單位矩陣的轉換矩陣完全拷貝下來,以進行進一步的修改,如果爲其他名稱的話,那麼sketch構造函數會去除reference geometry,重設轉換矩陣,創建一個完全獨立的新sketch。(參見Scripting User's Reference Manual 48.1.2 節關於ConstrainedSketch的描述:If the name of the sketch to be copied to is __edit__, Abaqus creates an exact copy that contains both reference geometry and a nonidentity transform matrix. Otherwise, the Sketch copy constructor strips the reference geometry from the copied sketch and sets the transform matrix to identity, creating a standalone copy.)此外,當使用"__profile__"來命名時,GUI界面是無法查看到所建立的sketch的,使用完後abaqus會自動銷燬。

5.5. 關於顯示的說明:

通過session的viewports數據庫的方法進行顯示設置也是常見的途徑,樣例代碼如下所示:

session.viewports['Viewport: 1'].setValues(displayedObject=p)

其中'Viewport: 1'是默認的viewport名稱,通過setValues的方法可以對顯示做設置,這裏命令的含義是在默認的viewport中顯示對象p。在這裏可以顯示的對象類型包括StubType, Part, ConstrainedSketch, Assembly, XYPlot, oda_ModelIntObj, or BeamProfilePlot。其中Part,ConstrainedSketch和Assembly的顯示在建模過程很有幫助。

 

六、網格劃分操作說明(着重參考Script User's Reference Manual 31節:Mesh commands的部分 

Mesh命令可以用於劃分part instances 和regions,也可以用於分配單元尺寸,單元類型和網格劃分的控制參數。

6.1 撒種子(seed)的相關操作:

seedEdgeByBias(...) 按照一定的比例非均勻的撒種子seedEdgeByNumber(...)按照給定的單元數目均勻的劃分edgeseedEdgeBySize(...)按照單元尺寸均勻的劃分edgeseedPart(...)在給定區域按照單元尺寸爲指定part分配種子位置

代碼示例:

 

mdb.models['myModel'].parts['myPart'].seedPart(size=5.0)
p=mdb.models['myModel'].parts['myPart']

6.2 設置單元的相關操作:(此部分代碼裏的p是從parts裏提取出的一個part object,承接之前代碼案例)

setMeshControls(...) 控制指定區域的mesh參數,代碼示例:

 

p.setMeshControls(regions=pickedRegions, algorithm=MEDIAL_AXIS)

關於單元類型設置,手冊31.3節 ElemType object也可以進行element類型的設置,這裏的設置參數會更加詳細,代碼示例:

 

elemType1 = mesh.ElemType(elemCode=S4R, elemLibrary=STANDARD,                            secondOrderAccuracy=OFF)elemType2 = mesh.ElemType(elemCode=S3, elemLibrary=STANDARD)

setElementType(...) 分配單元類型,將設置好的單元object分配到各個指定區域:

 

p.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2))

6.3 網格生成方式:

網格生成的通常有兩類,top-down和bottom-up兩類。前者的一般步驟是建立幾何體,撒種子,控制劃分參數,劃分網格,generateMesh(...) 是此類生成mesh方法所需要調用的命令,在撒好種子之後,通常用這個方法生成對應的mesh;

示例參考代碼如下:

 

p.generateMesh()

後者,也就是bottom-up的方法,是從低維度的網格元素出發向上構建模型網格,比如針對某些具備對稱性或週期性的網格,通過2D網格生成3D網格,常用的方法有:

generateBottomUpExtrudedMesh(...)使2D網格沿指定向量延伸生成3D網格,generateBottomUpSweptMesh(...)通過2D網格掃略生成3D網格,generateBottomUpRevolvedMesh(...)通過2D網格繞指定旋轉軸旋轉生成3D網格。

 

七、裝配操作說明(着重參考Script User's Reference Manual 6節:Assembly commands的部分 

首先對abaqus內的裝配過程做下簡單說明:裝配涉及的要素主要是Part、Instance、Assembly還有model。Part可以理解爲機械系統的單個零件的模板,instance是零件的實體,Assembly是零件組裝的過程,model是零件組裝出的機械結構,可以是局部結構,也可以是整體結構。很顯然有些零件的複用程度高,就像螺栓螺母等標準件,在之後劃分網格時並不希望對同樣的結構進行多次劃分,而是希望以一次劃分爲模板從而其他標準件的劃分可以跟隨改變,這樣就衍生出了dependent和independent的instance,顧名思義dependent的instance網格劃分是彼此關聯的,independent則彼此獨立。不同的part在創建時都是在各自的座標系裏,彼此不干涉,但是當需要一個整體結構時就需要將part對應的instance進行組裝,使它們能按照預想的方位去組織結構,這個過程就是Assembly,而參與Assembly的只會是instance,而不能是part,否則會引發錯誤。在實際操作中的組裝是有多個層次的,大系統裏可能嵌套小系統,直接組裝大系統會帶來巨大的座標計算的麻煩。這時候我們需要先針對局部系統組裝出一個低級別的model,然後在更高級別的model裏通過之前的低級別model來創建instance,之後調用這個instance在高級別的model裏面完成複雜系統的組裝。但是無論是哪個級別的model,都只能有一個Assembly。這裏先了解下腳本中的Assembly對象,abaqus在Model對象創建時會同時創建一個rootAssembly的成員(member),通常使用的路徑是:

 

import assembly
mdb.models['myModel'].rootAssembly

在裝配問題中,常常會涉及多個座標系的處理,因此在這個部分,新建一個參考座標系會很有幫助:

 

a=mdb.models['myModel'].rootAssembly
a.DatumCsysByDefault(coordSysType=CARTESIAN)

這裏再補充一下part的創建命令:

 

p = mdb.models['myModel'].Part(name='myPart', dimensionality=THREE_D, 
                               type=DEFORMABLE_BODY)

出於裝配的需要,由part出發新建PartInstanc對象也是常用的命令:

 

mdb.models[name].rootAssembly.Instance(name='myInstance',part=p)

這裏展示一個組裝的案例:

 

a=mdb.models['cyclinder_shell_group'].rootAssembly
ins1=a.Instance(name='c1',part=part1)
face1=ins1.faces[0]
ins2=a.Instance(name='c2',part=part2)
face2=ins2.faces[0]
a.Coaxial(movableAxis=face1,fixedAxis=face2,flip=OFF)

這段代碼將兩個圓柱面以同軸的形式加以組裝,要注意組裝時候使用的幾何元素應當來自Instance object,如果來自part會引起錯誤。

 

八、載荷與邊界條件施加說明(着重參考Script User's Reference Manual 9節:Boundary Condition commands的部分 

首先介紹在這個過程中十分有用的一條命令:regionToolset.Region(...),通過這條命令可以選擇指定的元素集合,並在其上施加載荷或邊界條件。不僅如此,在很多其他場合,這條命令也是十分有用的(注:涉及區域選取的命令可以參考45.3節Region Object的部分)。需要注意的是abaqus不會爲region object提供任何的repository,因此在使用時需要注意分配變量保存所創建的region。示例代碼如下:

 

import regionToolset
myRegion = regionToolset.Region(vertices=v[2:4],edges=e[4:5]+e[6:9])

具體可提供的輸入參量可查閱手冊。另外提一下,與region命令相類似的的還有set相關的命令:

 

import part
set = mdb.models['Model-1'].rootAssembly.Set(name='mySet', faces=f[3:4], 
                                             xEdges=e[1:3]) 
                                           

在這個命令裏,一個面被選擇作爲set,但是將構成面的兩條邊排除在了set之外。

有時候也可以是region與set的連用,例如:

eset = a.Set(edges=selected_edges, name='myEdges')
selected_nodes = a.sets['myEdges'].edges[v].getNodes()
nset = a.Set(nodes=selected_nodes, name='myNodes') 
region = a.sets['myNodes']

就施加載荷與邊界條件而言,在選中了所要施加的對象之後,就是調用相應的命令將載荷或是邊界條件施加到相應的位置了,例如位移邊界條件的施加:

mdb.models['Model'].EncastreBC(name=‘L’, createStepName='Step', region=region)

具體的施加方法查閱手冊的相應章節即可獲得。

 

九、任務提交與後處理說明(參考Script User's Reference Manual 26節:Job commands的部分 

首先是新任務的創建命令,可以基於mdb數據庫中已有的信息創建一個新的job用於之後的提交計算,樣例如下:

import job
mdb.Job(name='newJob', model='myModel')

隨後還有涉及到job的提交的相關命令:

 

mdb.jobs['newJob'].submit()
mdb.jobs['newJob'].waitForCompletion()

這裏的兩條命令,第一條用於提交生成的job,第二條用於暫停執行腳本,等待任務求解完成再繼續腳本執行

 

十、繪製顯示的說明(參考Script User's Reference Manual 11.4節 Viewport object、35節Odb Display commands、47節:Session commands以及54節View commands的部分 

大部分的前後處理顯示操作都是與viewport對象相關的。viewport是abaqus用於儲存應用產生的圖像的容器,一個viewport對象中會儲存關於各個對象在當前viewport中如何顯示的各種設置。下面通過示例代碼來展示相關操作的實現:

 

import session
session.Viewport(name='myViewport',origin=(20,20),width=90)
session.viewports['myViewport'].bringToFront()
session.viewports['myViewport'].makeCurrent()
session.viewports['myViewport'].setValues(displayedObject=myPart)

這段代碼的功能包括創建一個新的viewport,將其前置可見,使其成爲當前激活的viewport,最後在其上顯示之前保存的part對象。

odbDisplay的這個部分,主要是用於後處理的顯示,詳細的使用參見手冊。

session command這部分命令所創建的對象並不與模型一起儲存,這些對象的生命週期是與當前session相關的,如果當前session被銷燬的話,那麼所創建的object會跟隨被銷燬。

 

附錄A1  Abaqus GUI Toolkit簡介:

Abaqus GUI Toolkit是abaqus自動化流程處理的工具之一,可以充分擴展Abaqus/CAE的GUI功能,提供更高效的問題解決方法。關於這個部分的學習,主要應當參考Abaqus GUI User's Manual和Abaqus GUI Toolkit Reference Manual,其中第一個manual是工具使用的介紹,第二個manual是相關class和method的詳細記錄。這個模塊的作用在於實現用戶自定義的界面開發,使Abaqus的功能能夠最大化的適應用戶的特定需求。

A1.1 Abaqus爲用戶開放的開發接口介紹:

abaqus在各個層次上都有開放接口給用戶實現定製化開發,對於Abaqus實現用戶定製化設置可以有以下幾種途徑,其功能也各不相同:

(1)User subroutines:可以變更Abaqus/Standard和Abaqus/Explicit計算分析的方式,例如可以使用subroutine自定義材料本構,開發標準庫之外的材料響應。換句話說user subroutine可以進入Abaqus計算求解分析的內核,並被求解器的內核所調用,需要的話可以查閱Abaqus User Subroutines Reference Manual;

(2)Environment files:用於更改Abaqus的默認設置,比如配置用戶熟悉的求解環境等,屬於最表層的個性化定製,程序的主體和界面不會脫離abaqus設計的範疇,可以查閱Abaqus Analysis User’s Manual來獲得更多的信息;

(3)Kernel scripts:用於創建各類新的函數,執行用戶定義的建模和後處理的任務,也就是常說的Abaqus二次開發,整體說來是通過python腳本調用abaqus的各個成熟模塊更高效更有針對性的進行建模、計算求解和後處理,Abaqus Scripting User’s Manual是主要的信息查閱來源 ;

(4)GUI scripts:用於創建新的用戶圖形界面(GUI),圖形界面上實現定製化的開發。

 

A1.2 理解Kernel與GUI的關係

無論如何,有一點需要知道,那就是Abaqus GUI Toolkit的運行是離不開Abaqus/CAE環境的,只有在這個環境下一些底層的功能才能正常使用和工作。因此理解Abaqus/CAE的執行過程是十分有益的。Abaqus/CAE的執行分爲兩個分離的部分:Kernel(內核)和GUI(用戶圖形界面)。Kernel的功能在於訪問Abaqus各個數據庫,通過命令實現數據庫的創建與修改,從而完成計算任務的執行,而GUI的作用在於收集用戶輸入,然後將這些輸入打包成命令流發送給Kernel去執行。從這個角度看,即使沒有GUI界面,計算任務也可以通過Kernel腳本的方式直接實現。因此真正有吸引力的GUI開發是和Kernel腳本分不開的,通過Kernel腳本實現某些特定的功能,然後通過Abaqus GUI Toolkit將各種功能封裝起來實現外層的GUI展現,這樣的定製化開發可以大大降低用戶的使用門檻,極其有功能針對性地進行深度二次開發。

Abaqus GUI Toolkit是FOX GUI Toolkit的擴展,這是用C++完成的GUI實現庫,這些庫裏的類基本都是用於圖形界面的開發。Abaqus GUI Toolkit中會有兩種不同的類名,其中以FX開頭的類就是FOX的標準類,而以AFX開頭的類則屬於經過Abaqus擴展的庫。

所以,Abaqus GUI Toolkit的學習需要python語言的知識,對於Kernel scripts的理解,對面嚮對象語言的理解,最後還需要對於GUI設計有一定的瞭解。

 

 A1.3 Abaqus GUI Toolkit可以實現的功能:

通過這個模塊能實現的功能包括:

(1)創建一個全新的GUI模塊(Module),GUI模塊指的是具有相似功能的組合體,例如Abaqus/CAE裏的Part,Assembly等模塊;

(2)創建一個新的GUI工具集(Toolset),這個和GUI模塊有些類似,所不同的在於工具集可能會被多個模塊共同使用,例如Abaqus/CAE中的Datum工具集;

(3)自定義對話框與執行窗口滿足個性化需求;

(4)有選擇的顯示或隱藏已有的Abaqus模塊或工具集,有選擇的設計菜單欄與各個選項;

(5)或者乾脆在Abaqus/CAE模塊上做簡單修改。

 

A1.4 Abaqus GUI Application的構成要素:

一個Abaqus GUI Application構成要素可能包括一下這些元素:

Widget : 最基本的構成元素,用於收集用戶輸入,比如一個空白的文字域,或者一個勾選框

Layout manager:負責Widget的佈局安排

Dialog boxes:使用Layout manager將Widget組封裝起來,爲某個特定功能提供對應的輸入對話框

Modes:用於控制特定用戶界面的顯示,也負責該界面相關命令的分發

Modules and toolsets:將具有相似功能組裝在一起就構成了模塊與工具集

Applications:負責相對高級的活動實現,例如管理Application所要使用的GUI進程,更新Widget的狀態,負責與桌面窗口管理的交互等等

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章