Code_Aster comm命令文件結構與說明(by Yang 2017.3.30)

對於code_aster這樣一款來自法國的開源軟件,很多時候它的幫助文檔是用法語書寫的,有些時候所能獲得的英語文檔也是由機器翻譯的,因此相對ABAQUS這些成熟商業軟件而言,code_aster的相關資料查閱起來要困難一些。因此更加有必要經常性的總結已經查閱並理解過的資料,從而減輕後來者的負擔。因此本文歸納總結了code_aster求解中必須也是最爲重要的comm文件的相關資料。
1. comm文件概述
comm文件是aster用於控制求解器工作的命令文檔,Code_Aster中提供了名爲Eficas的窗口工具用於輔助生成comm文件,提供包括語法錯誤檢查和關鍵字查閱在內的輔助功能。通過Salome-Aster中Aster模塊下Tool菜單中的Run Eficas選項可以打開這一編輯器。但是一旦我們在comm文件中使用了python(其實是使用code_aster的類Python語言),那麼Eficas將不能再提供編輯支持。當然對於剛剛接觸有限元分析,或者剛剛接觸code aster的人來說,Eficas在前期的學習中可以提供很大的幫助。但是在後期需要做深入開發的時候,它可能並不是一個好的選擇,但是它的關鍵詞查閱功能依然可以提供很多幫助。

從某種意義上說,comm文件其實就是一個另類的“python文件”,只不過它擴展了code_aster中各種具備有限元特色的庫,同時語法格式上與標準python也有所出入,但是理解comm文件和python腳本的共性對於後期實現有限元建模分析的深度開發是很有必要的。值得一提的是,comm文件內不要求任何強制的縮進,事實上comm文件使用的並不是標準意義上的python語法,在書寫命令時,命令(command)或者對象 (concept)必須在一行的開頭且之前不可以有空格。但是大多數時候comm文件的語法與Python是非常相似的,比如和Python語言一樣,comm文件是對大小寫敏感的,這一點上和ABAQUS的inp文件或者ANSYS的APDL文件不區分大小寫是不同的。

總體上說comm文件是由一條條獨立的命令組成的,其中以#開頭來標識的是註釋行,求解器跳過不執行。因此在討論文件的整體結構之前,有必要了解每條獨立的命令的結構與實現功能。但在此之前,需要介紹一下aster中一個重要的基本概念:concept,它類似於Python中變量或者對象的概念,是由用戶自己創建的,可以被修改或是擴展,也可以被引用。由於comm中的命令是順序執行的sequential),因此在調用一個concept之前請一定要確保它已經在這之前被創建了。新的對象(concept)或變量是通過在 “=” 的左邊書寫來定義的,‘=’符號的左右是可以有空格的。

comm文件中可以有兩種命令形式:
(1)可以創建新的concept的命令:那麼在第一個等號左邊的是一個新建的concept名,concept是code_aster中十分重要的基本元素,它可以作爲其他命令的輸入。事實上在一個comm文件中,大多數命令都是爲了生成這樣或者那樣的concept,下面以一個定義材料的命令給出這類命令的一個例子:
STEEL = DEFI_MATERIAU (ELAS = _F (E=2.05E11, NU=0.3) )
其中:
STEEL 是由用戶決定的concept名稱(name of concept
DEFI_MATERIAU是命令的主體(command
ELAS 是子項關鍵字的標明(factor keyword),需要與_F 聯合使用,_F可以標明此處是
一個factor keyword
E,NU屬於縮略關鍵字(simple keyword),是子項關鍵字的具體定義內容
2.05E11,0.3則是縮略關鍵字(simple keyword)的具體數值(argument of
simple keyword
(2)不新建concept的命令:不產生新的concept,但是可能利用之前已經建立的concept實現某些特定功能的命令,比如下面這條用於打印求解結果的命令,顯然我們不需要定義一個新concept,只需要告訴aster那個結果需要打印就好,換言之只需要調用已經定義的concept:
IMPR_RESU( RESU = _F ( RESULTAT = RESU ) )
IMPR_RESU是命令的主體(command
前一個RESU 是子項關鍵字的標明(factor keyword),要與_F 聯合使用,通過_F標明
此處是一個factor keyword
RESULTAT 屬於縮略關鍵字(simple keyword),是子項關鍵字的具體定義內容
後一個RESU則是縮略關鍵字(simple keyword)的具體值(argument of
simple keyword),此處其實是一個在求解中定義的用於記錄結果的concept

之前提及的對concept的擴展或者重定義也是十分重要的概念,它的重點在於reuse關鍵字(注意是小寫)的使用,舉例如下:
#read the mesh file in med format first
MESH = LIRE_MAILLAGE ( FORMAT = 'MED' )
#extend this concept by defining new group on this mesh
MESH = DEFI_GROUP( reuse = MESH,
MAILLAGE = MESH,
CREA_GROUP_NO = _F( GROUP_MA = 'upper' ) )
在這裏,一個MESH的concept首先被LIRE_MAILLAGE所創建,隨後在DEFI_GROUP中通過reuse關鍵字得到了擴展與修改。

2. comm文件結構
在理解了單語句的結構之後,我們再來了解下由一條條單語句構成的comm文件的結構和對應模塊的功能。在這裏,我們以一個簡單鋼桁架結構在受集中力和質量載荷的工況下的分析文件爲例,分析comm文件的構成,以及各個不同模塊的功能。
注意:本文涉及的所有命令行是從PDF中直接拷貝的,沒有使用Eficas編輯校對過,很有可能存在語法錯誤,只用於理解comm文件結構,如需使用,還請自行校對一下。
2.1 文件開頭
comm文件必須以DEBUT()命令作爲開頭,如下所示
#U4.11.02
DEBUT();
通常說來DEBUT()是不帶參數的,但是在某些複雜的問題裏,DEBUT()可能會攜帶輸入參數,比如說如果需要使用python語言特性,需要在DEBUT命令中寫入PAR_LOT=' NON' 。
2.2 讀取與修改mesh
在讀取mesh文件時,會默認分配Fortran的LU 20 (Logical Unit 20)通道給文件,讀取過程的命令如下所示:(Lire在法語中是read的意思,Mallage=mesh)
#U4.21.01
mesh=LIRE_MALLAGE(
INFO=1,
#INFO_MED=2,
UNITE=20,
FORMAT='MED',
);

通過CREA_GROUP_MA=_F(NOM=’TOUT’,TOUT=’OUI’,), 可以創建一個名爲'TOUT'的group(TOUT在法語中是all的意思,NOM是name,OUI則是yes的意思),這個group含有所有在mesh中的單元。通過CREA_GROUP_NO=_F(TOUT_GROUP_MA=’OUI’,), 可以對每一個單元group創建一個節點group,每個節點組都包含了所屬單元中的所有節點, 並且共享一個group名稱。這一點對於從Gmsh中導入的MED文件來說非常有用,因爲Gmsh中的physical point group會被轉換成單元group,這對於之後在節點上施加邊界條件是十分方便的。
通過CREA_GROUP_NO=_F(GROUP_MA=’mast’,), 我們實現了對於mast這個group類似的操作。 在這條命令下還可以實現很多其他有用的功能,例如各個group間的布爾操作,e.g. UNION,這樣可以大大簡化之後的操作,比如將承受同一類載荷的group並起來形成一個新的group,那麼之後施加載荷就會方便很多。
具體命令如下所示:
#U4.22.01
mesh=DEFI_GROUP(
reuse =mesh ,
MAILLAGE=mesh ,
CREA_GROUP_MA=_F(NOM=’TOUT’ ,TOUT=’OUI’ , ) ,
CREA_GROUP_NO=_F(TOUT_GROUP_MA=’OUI’ , ) ,
) ;
如果comm文件是在ASTK環境下運行的(非Salome環境,有些關鍵字只能在ASTK環境下被識別,這裏可以類比ABAQUS的CAE環境與command環境),我們還可以通過如下命令將修改後的mesh文件保存下來。
具體命令如下所示:
IMPR_RESU(
FORMAT=’MED’ ,
UNITE=71 ,
RESU=_F(MAILLAGE=mesh , ) ,
) ;
2.3 基於讀取的mesh信息構建有限元模型(在U4.41.01中有詳細的描述)
在code aster中MALLAGE是隻有mesh的拓撲結構而沒有其他信息的。因此在comm文件的這個部分,要通過將單元屬性,材料屬性等分配給劃分的網格實現有限元模型的構建。觀察如下代碼:
#U4.41.01
model=AFFE_MODELE(
MAILLAGE=mesh ,
AFFE=(
_F(
GROUP_MA=(’topbeam’ ,’mast’ , ) ,
PHENOMENE=’MECANIQUE’ ,
MODELISATION=’POU_D_T’ ,
) ,
_F(
GROUP_MA=(’massN’ , ) ,
PHENOMENE=’MECANIQUE’ ,
MODELISATION=’DIS_T’ ,
) ,
) ,
) ;
分析這段代碼如下:
通過關鍵字AFFE,我們可以實現對於模型不同group的屬性分配。例如在這個例子裏面,首先我們通過GROUP_MA的定義獲得需要被分配的group組合信息,隨後通過PHENOMENE關鍵字,我們能夠定義單元的物理種類(力學單元,聲學單元,熱學單元,etc),隨後的MODELISATION關鍵字則幫助我們進一步確定了單元的類型,例如DIS_T定義了一個2D的離散單元,只有一個節點,但是可以在之後施加質量載荷。
注意,在這裏我們可以有選擇的將mesh中的某些部件排除在有限元模型之外,這在某些需要初步設計的問題裏將十分有用。
2.4 定義材料
定義有限元模型需要使用的材料參數
#U4.43.01
steel=DEFI_MATERIAU(ELAS=_F(E=210000. ,NU=0 . 3 ,RHO=8e..9 ) , ) ;
2.5 分配材料屬性到單元
將之前定義的材料屬性分配到所對應的單元上
#U4.43.03
material=AFFE_MATERIAU(
MAILLAGE=mesh ,
AFFE=_F(GROUP_MA=(’topbeam’ ,’mast’ , ) , MATER=steel , ) ,
) ;
2.6 分配單元屬性
需要通過定義一個set來實現屬性的分配,關於這一部分在U4.42.01中有非常詳細的描述。這個部分在code_aster中十分tricky,也十分重要,需要仔細閱讀。
首先是如何定義beam的相關參數:
#U4.42.01
elemcar=AFFE_CARA_ELEM(
MODELE=model ,
POUTRE=(
#the vertical members are rectangular section
#(40x20 mm) with a thickness of 1.5 mm
_F(
GROUP_MA=(’mast’ , ) ,
SECTION=’RECTANGLE’ ,
CARA=(’HY’ ,’HZ’ ,’EP’ , ) ,
VALE=(40 , 20 , 1.5 , ) ,
) ,
#same with the horizontal bar
_F(
GROUP_MA=(’topbeam’ , ) , SECTION=’RECTANGLE’ ,
CARA=(’HY’ ,’HZ’ ,’EP’ , ) , VALE=(40 , 20 , 1.5 , ) ,
) ,
#next lines would have produced the same section properties
#_F(
#GROUP_MA=(’topbeam’,),SECTION=’GENERALE’,
#CARA=(#’A’,’IY’,’IZ’,’AY’,’AZ’,’EY’,’EZ’,
#’JX’,’RY’,’RZ’,’RT’,
#),
#VALE=(
#171, 11518, 34908, 1.5, 1.5, 0, 0,
#26700, 20, 10, 12,
#),
#),
) ,
隨後是關於beam的方向的處理
#in the next lines we would give the ’mast’ group
#the same orientation as the top beam
#leave it commented at first
#ORIENTATION=_F(
#GROUP_MA=(’mast’,),
#CARA=’VECT_Y’,
#VALE=(1.0, 0.0, 0.0,),
#),
#and in the next ones we can rotate
#to the ’topbeam’ along its axis,
#leave it commented at first
#ORIENTATION=_F(
#GROUP_MA=(’topbeam’,),
#CARA=’ANGL_VRIL’,
#VALE=90.0,
#),
最後是與質量單元有關的部分
#in the next line we give to the discrete element
#the property of a point mass
#(CARA=’M_T_D_N’), and give it
#the value of 0.01 tonnes e.g. 10 kg
DISCRET=(
_F(GROUP_MA=’massN’ , CARA=’M_T_D_N’ ,VALE = ( . 0 1 ) , ) ,
#following block set stiffness of point element ’massN’
#to null stiffness
#although this is not necessary,
#commenting this block would raise a warning,
#unimportant in this case
_F(
GROUP_MA=(’massN’ , ) ,
CARA=’K_T_D_N’ ,
VALE=(0 , 0 , 0 , ) ,
REPERE=’GLOBAL’ ,
) ,
) ,
) ;
(注意這裏最後的括號 來自於一開始的AFFE_CARA_ELEM命令定義在這裏剛剛結束)
2.7 邊界條件的設定
U4.44.01是有關於邊界條件和載荷施加的部分,對於這一部分也需要認真對待。
#U4.44.01
ground=AFFE_CHAR_MECA(
MODELE=model ,
DDL_IMPO=_F(
GROUP_NO=(’groundS’ ,’groundN’ , ) ,
DX=0 ,DY=0 ,DZ=0 ,DRX=0 ,DRY=0 ,DRZ=0 ,
) ,
) ;
這裏是有關於邊界條件施加的部分。所有的邊界條件和載荷應該按照邏輯結構儘可能的分開,這樣可以使comm文件的結構更加清晰,也更加利於維護修改。在關鍵字文件中,DDL是法語中DOF的縮寫。
2.8 載荷的施加
通過設定重力加速度來施加結構的重力載荷。儘管Pesanteur在法語裏是gravity(重力)的意思,但是事實上這一關鍵字可以用於施加任意方向的加速度場。在接下來的3個set中,分別施加了以下載荷:10m/s^2 的重力加速度所產生的重力載荷,在1/4位置處施加的135N集中載荷,最後針對topbeam的每個節點所施加的一個均布載荷。
selfwght=AFFE_CHAR_MECA(
MODELE=model ,
PESANTEUR =_F(
GRAVITE=10000 ,
DIRECTION=(0 , 0 ,
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章