程序 峰谷值 提取_ABAQUS:Python后处理—用excel提取位移、体积、应变等变化(一)...
00
實例模型
一個金屬長方體,我們需要對其做拉伸的加載約束示意圖如圖1,并在完成后采用Python命令流讀取參考點的位移、體積、應變隨加載時間的變化情況。
圖1 金屬長方體約束加載示意圖?
01
Python庫導入聲明
對于圖上的命令流,我們分為幾部分拆開研究,首先是下面第一部分需要在Abaqus導入相關Python庫的代碼,比如matplotlib庫、numpy庫、xlwt庫和math庫。
#! /user/bin/python# -*- coding:UTF-8 -*-import matplotlib.pyplot as pltimport numpy as npfrom visualization import *from odbAccess import *import xlwtimport math第3行導入Python經常用于繪圖的matplotlib庫;
第4行導入Python處理數組矩陣的numpy庫;
第5行和第6行用于導入Abaqus的后處理功能,即visualization和odbAccess;
第7行用于導入Python與excel進行交互的xlwt庫;
第8行用于導入Python的math庫。
在利用Python生成excel數據之前,先采用一個getInputs函數(代碼如下)生成圖2所示的對話框與用戶進行交互,需要用戶在在其中輸入模型的名字(model name),部件例子的名字(instance name)以及后處理odb的名字(odbname)。這樣做有個好處,每次都可以根據不同模型、不同部件實例和相應的后處理odb名字進行相應結果提取。
modelName,instanceName,odbname= getInputs(??fields=(('Model?Name:',?'Test'),('Instance?Name:',?'Part-2-1'),('odbname:',?'TEST.odb')), label='Enter information', dialog)圖2?getInputs函數生成的對話框
02
計算初始邊長
在計算體積和各邊應變之前,需要計算長方體不同邊長即長、寬、高的初始長度。代碼如下:
node?=?mdb.models[modelName].rootAssembly.instances[instanceName].nodesXmin = 9999Xmax = -9999Ymin = 9999Ymax = -9999Zmin = 9999Zmax = -9999for i in range(len(node)): x = node[i].coordinates[0] y = node[i].coordinates[1] z = node[i].coordinates[2] if Xmin > x: Xmin = x elif Xmax < x:????????Xmax?=?x???????? if Ymin > y: Ymin = y elif Ymax < y:????????Ymax?=?y???????? if Zmin > z: Zmin = z continue if Zmax < z: Zmax = z continueprint 'Xmin,Xmax,Ymin,Ymax,Zmin,Zmax=',(Xmin, Xmax, Ymin, Ymax, Zmin, Zmax)CubeWidth=abs(Xmax-Xmin)???#?the?length?of?model?along?x directionCubeHeight=abs(Ymax-Ymin) # the length of model along y directionCubeLength=abs(Zmax-Zmin) # the length of model along z direction第1行基于之前輸入的modelname,instancename來調用部件實例(instance)的節點。
第8行for i in range(len(node)):表示對每個節點進行循環,每次循環中都要提取該節點的x,y,z坐標信息。
Xmin,Xmax為通過循環找出X方向的最小、最大X坐標,Ymin、Ymax以及Zmin、Zmax都同理。計算這部分的代碼可能大家表面無法直接看懂理解,我舉一個例子好了。
例子:對于第12行到第15行,比如當i=0時,隨便提取了第1個節點的x,y,z信息(0,0.1,0.2),由于Xmin=9999>x=0,所以x=0賦予Xmin;同樣的,當i=1時,又隨便提取模型的一個節點(0.05,0.1,0.2),由于現在Xmin=0當i=2時,隨便提取一個節點(0.07,0.1,0.2),注意到此時,Xmin=0而Xmin不變;而如果i循環到節點 (0.1,0.1,0.2),注意到此時,Xmin=0,而Xmin不變;由于x=0是模型x方向的最小值,x=0.1是模型x方向的最大值,因此如果當i循環到又一個節點(0.06,0.1,0.2),此時,Xmin=0x=0.06,則Xmin和Xmax則處于不變,因為x在這兩者之間,因此通過以上程序就可以找出模型在x方向的最大值和最小值(結果見圖3),然后最大值減去最小值則得到了模型沿x方向的長度。同樣的方式得到模型沿y方向和z方向的長度。
圖3?查看Xmin、Xmax、Ymin、Ymax、Zmin、Zmax
另一方面,我們可以如圖4進行相應驗證,我們先查看下模型在x方向的寬度,在Abaqus中的query中選取distance,然后選中模型中的兩個點,可以看到這兩個點的坐標是point1(0,0.1,0.2),point2(0.1,0.1,0.2),則兩點之間在x方向的距離為0.1,即為模型的寬度(模型沿x方向的長度)。Abaqus模型計算的結果與之前程序計算的結果相互驗證了。
圖4?查看模型在x方向的寬度
03
用python將位移導入excel
odb=openOdb(path=odbname)wbkName='NodalDisplacement'wbk1=xlwt.Workbook()sheet=wbk1.add_sheet('Sheet1')RefPointSet=odb.rootAssembly.nodeSets['U-XYZ']frameRepository=odb.steps['Step-1'].framesfor i in range(3): sheet.write(0,i,('U'+str(i+1)+'(U-XYZ)'))第1行表示打開odb計算結果文件。
第2行表示生成的excel文件名為NodalDisplacement。
第3行和第4行表示添加Sheet1工作表。
第5行建立節點SetU-XYZ,方便后續對該Set進行位移提取。
第6行表示Step-1里的幀(frames)對象。
第7行和第8行通過循環在excel第1行第i列(也就是代碼中的0,i),寫入U1(U-XYZ),U2(U-XYZ),U3(U-XYZ),如圖5所示,其中Python編程用+可以實現字符連綴,str(i)可以將數字變量i改為字符i。
第一行是統計frames的幀數。
第2行到第4行基于numpy定義三個數組存儲三個方向的位移,并事先賦予初值零。
第5行設置一個變量,方便用于控制輸出到excel里數的精度。
第6行到第15行就是通過for循環,一幀一幀地輸出U-XYZ這個點Set的三個方向的位移值,并存儲到excel。U-XYZ這個點Set如圖5所示。
圖5?U-XYZ點Set
對于第7行表示提取該幀的位移U的場變量并賦值給U,然后在第8行采用getSubset基于U提取RefPointSet區域的位移值。
圖6在ABAQUS命令行接口(基于Python的Abaqus靜力分析操作實例)表示的應該是最后一次循環后各變量的值,可以看出RefU表示的nodeSets['U-XYZ']的位移值,圖6中顯示為一個索引;而RefUValues則表示該節點集中每個節點的位移值,體現在values中;而values[0]表示第一個節點的位移值,由于存在三個方向的位移,U1,U2,U3,則后續通過data[0],data[1],以及data[2]分別表示三個方向的位移值。
圖6 運行相關結果查看(通過ABAQUS命令行接口)
特別的,由于U-XYZ只有一個點存在于Set中,如果我們在這里用values[1],看會出現什么樣的效果?如圖7。可以明顯看到Sequence index out of range表示超出了范圍,因為RefUValues[1]表示提取第二個節點,但我們這里只有一個節點存在于U-XYZ點Set中,所以出現了范圍超過的報錯提示。
圖7 可以存在RefUValues[1]嗎?(通過ABAQUS命令行接口)
需要說一下的,如果大家覺得ABAQUS命令行接口的查看范圍太窄,可以往上拉動窗口,這樣就可以看到更多的代碼,如圖8所示,但與之相反的就是模型就會顯得很小,與我們一般的常規abaqus操作有點相反。
圖8?ABAQUS命令行接口顯示更多的內容
再對代碼中的Python round函數做個說明,通過下面的例子我們可以看到round函數是四舍五入函數,一般為四舍五入后為整數,round(a,b)中的a為需要進行四舍五入的數,而b為需要保留的小數位數,如圖9所示。
圖9 關于Python round 函數的例子
最后就是第17行代碼,這個代碼也很重要,不輸入這個代碼就不會生成excel表,一般生成excel位置為設置好的工作目錄(比如D:\temp),生成好的excel如圖10所示。而excel總共有625行,說明一共有625幀,也就是上述代碼的變量iframes為625。
圖10 生成的NodalDisplacement.xls的excel文件
04
結果驗證
將上述excel表格中的結果繪制成曲線,即U-XYZ點三個方向的位移隨幀數變化的曲線,如圖11所示。根據圖12,再結合odb文件中的變形圖(第623幀)可以判斷U-XYZ點在后期的X(U1)為負,Y(U2)為正,Z(U3)為正,與圖11曲線是一致的。
圖11?U-XYZ點三個方向的位移隨幀數變化的曲線
圖12?模型后處理結果圖(第623幀)
最后再與在Abaqus里進行GUI(即點點點)對U-XYZ三個方向位移處理的結果圖進行對比,即通過XY Data對U-XYZ三個方向的位移進行輸出繪圖,注意到坐標軸為時間,與Python后處理圖11的幀數是一一對應的。可以知道,Python后處理結果與ABAQUS的GUI操作得到的結果幾乎完全一致。
圖13?Abaqus里進行GUI操作的后處理結果(關于U-XYZ三方向位移)
該模型關于體積、應變、應力等方面(包括場輸出和歷史輸出)的Python導入excel的后處理留在下期,敬請關注。
——to be continued
往期推薦:
Python二次開發ABAQUS的重要性
用Python向ABAQUS輸入溫度變化荷載
用Python從Abaqus導出txt、dat數據
基于Python向Abaqus導入txt、dat數據
總之,有限元數值模擬和編程開發需要不斷學習各種模型和程序代碼中的長處,將其融會貫通用于解決自己目前面臨的研究問題中來。
總結
以上是生活随笔為你收集整理的程序 峰谷值 提取_ABAQUS:Python后处理—用excel提取位移、体积、应变等变化(一)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 32位 shell.efi x86_Li
- 下一篇: python 字典查询比列表快_Pyth