使用Tcl/TK在Hypermesh下自动创建网格材料属性

  • Posted on
  • by

使用Hypermesh可以方便地对不同有限元分析软件所创建的模型进行前处理。但是,不同软件的模型在导入/导出的时候可能存在兼容性问题。有限元模型中的网格兼容性相对较好,容易出问题的是单元的材料/属性。比如,使用Hypermesh的Abaqus模板创建的模型,经过Abaqus软件编辑再导入到Hypermesh中之后,网格的材料/属性信息就丢失了。

为了解决这个问题,也提高建模效率,可以考虑模型的网格根据结构及其不同特点分组之后划分单元,材料/属性使用脚本自动创建。类似功能之前已经有文章介绍,Hypermesh的script exchange可能也有类似代码,但是由于script exchange不对普通用户开放,因此我尝试用Hyperworks所支持的Tcl/TK脚本创建了一个。

脚本的主要思路是根据各个已经划分好网格的部件名称,提取其中的材料、厚度信息,创建对应名称的属性并赋予相应的部件。

首先是根据部件的信息判断其材料、属性,再做进一步的处理。为了使用脚本,部件的名称必须按照一定的规则进行命名。实体单元分为两部分,为部件名称和材料;壳单元分为三部分,分别是部件名称、材料和厚度。不同部分之间使用下划线进行分隔。以下为根据部件命名提取名称、材料以及厚度信息的代码片段。

    if { [regexp {(.*)_(.*)} $compname matched name mat] == 1 } {
        if { [regexp {(.*)_(.*)_(.*)} $compname matched name mat thickness] == 1 } {
            if { [regexp {^([0-9]*\.?[0-9])} $thickness matched thick] == 1 } {
                puts "Name = $name ; Mat= $mat; Thickness= $thick"
            } else {
                puts "Incorrect thickness of $compname" 
            } 
        } else {
            puts "Name = $name ; Mat= $mat"
        } 
    } else {
        puts "Incorrect component name $compname"
    } 

其次是根据单元的类型分别构造创建实体单元和壳单元属性的函数。尽管这两个函数其实可以合并为一个,但为了方便维护以及扩展,故将其分别单独编写。这部分代码的主体是创建材料的属性,在创建属性之前需要判断所对应的材料是否已经创建,如果材料已经存在则直接使用,否则调用创建材料的函数。

最后是创建材料的函数。这部分可以基于command.cmf文件的内容进行修改,相关的过程可以参考官方教程。需要注意的时候,使用command.cmf进行修改时,应该把其中的硬代码改为变量。

以上就是使用Tcl/TK创建Hypermesh自动生成、赋予网格属性和材料的思路及主要过程。