当前位置: 首页 > 工具软件 > Code_Aster > 使用案例 >

Code_Aster comm命令文件结构与说明(by Yang 2017.3.30)

阳光辉
2023-12-01
对于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 ,
 类似资料: