Gmsh与Nastran

Gmsh只能划分网格,并不能直接作为有限元软件的前处理器。Gmsh无法直接设置求解参数,单元属性,边界条件,材料类型等。但是可以在Gmsh的基础做进一步开发,完成以上设置。

Gmsh导出的网格与几何关联,单元的Property编号可以与“几何tag”或“Group tag”一致。通过“Physical Group”将几何编入不同的组,获取特定几何上的单元,节点编号,从而实现求解设置。本文通过修改Gmsh导出的“BDF”文件,实现Nastran静力学求解。

1.BDF文件的结构

可供Nastran计算的BDF文件由5部分组成,前2部分可选,后3部分必须有。其简单介绍:

  • Statement:控制程序的计算参数,如内存设置,数值方法等。

  • File Management:控制文件,执行“restart”

  • Executive Control:设置求解类型,设置最长允许时间

  • Case Control:定义子步,载荷步,选取载荷,约束,输出结果

  • Bulk Data:定义具体的单元,节点,载荷,材料信息。

Gmsh与Nastran的图1

2.Gmsh划分网格并导出BDF文件

将Gmsh导出为特定的文件,使用“option”控制,支持很多格式,“31”标定BDF。

Gmsh与Nastran的图2

将下图所示的几何划分为四边形网格,固定Line 201,Line 205 施加载荷。两个面使用不同的材料。

Gmsh与Nastran的图3

Gmsh的代码如下,注意以下设置:
  • gmsh::model::addPhysicalGroup()

  • gmsh::option::setNumber("Mesh.SaveAll", 0);

  • gmsh::option::setNumber("Mesh.SaveElementTagType", 2);软件默认单元导出后的“Property 编号”采用几何编号,此处改为使用Physical Group的编号。

  • gmsh::model::mesh::getNodesForPhysicalGroup()

  • gmsh::model::removePhysicalGroups(),通过这个命令实现仅导出2维单元。

int main(int argc, char **argv){  gmsh::initialize(argc, argv);
 gmsh::model::add("bdf-Nastran");  double lc = 1.0;  gmsh::model::occ::addPoint(0, 0, 0,lc, 100);  gmsh::model::occ::addPoint(20, 0, 0, lc,101);  gmsh::model::occ::addPoint(20, 10, 0,lc, 102);  gmsh::model::occ::addPoint(0, 10, 0, lc,103);  gmsh::model::occ::addPoint(0, 0, 20, lc, 104);  gmsh::model::occ::addPoint(0, 10, 20, lc, 105);
 gmsh::model::occ::addLine(100, 101, 200);  gmsh::model::occ::addLine(101, 102, 201);//此线段固定  gmsh::model::occ::addLine(102, 103, 202);  gmsh::model::occ::addLine(103, 100, 203);  gmsh::model::occ::addLine(103, 105, 204);  gmsh::model::occ::addLine(105, 104, 205);//此线段加载荷  gmsh::model::occ::addLine(104, 100, 206);
 gmsh::model::occ::addCurveLoop({200,201,202,203}, 300);  gmsh::model::occ::addCurveLoop({ -203,204,205,206 }, 301);
 gmsh::model::occ::addPlaneSurface({300}, 400);  gmsh::model::occ::addPlaneSurface({ 301 }, 401);
 gmsh::model::occ::synchronize();
 gmsh::model::addPhysicalGroup(1, { 201 }, 500, "Fixed Nodes");  gmsh::model::addPhysicalGroup(1, { 205 }, 501, "Load Nodes");  gmsh::model::addPhysicalGroup(2, { 400 }, 502, "Aluminum");  gmsh::model::addPhysicalGroup(2, { 401 }, 503, "Steel");
 gmsh::option::setNumber("Mesh.SaveAll", 0);//仅输出与Group相连的单元,  gmsh::option::setNumber("Mesh.BdfFieldFormat", 1);//0: free, 1: small, 2: large  gmsh::option::setNumber("Mesh.Format", 31);//导出为bdf  gmsh::option::setNumber("Mesh.SaveElementTagType", 2);//1: elementary, 2: physical, 3: partition。Default value: 1  gmsh::option::setNumber("Mesh.Lines", 1);
 gmsh::option::setNumber("Mesh.Algorithm", 11);  gmsh::model::mesh::generate(2);
 std::vector<size_t> fixNodes,loadNodes;  std::vector<double> fixCoors,loadCoors;  gmsh::model::mesh::getNodesForPhysicalGroup(1, 500, fixNodes, fixCoors);//获得fix Nodes 的编号  gmsh::model::mesh::getNodesForPhysicalGroup(1, 501, loadNodes, loadCoors);//获得load Nodes 的编号
 //将节点编号输出到“Nodes.txt”  std::fstream file;  file.open("Nodes.txt", std::ios::app);  file << "Fixed Nodes:\n";  for (int i = 0; i < fixNodes.size(); i++)  file << fixNodes[i] << " ";
 file << "\nLoad Nodes:\n";  for (int i = 0; i < loadNodes.size(); i++)  file << loadNodes[i] << " ";    gmsh::model::removePhysicalGroups({ {1,500},{1,501} });//将Curve的Group删除,仅导出QUAD单元。
 gmsh::write("bdf-Nastran.bdf");  std::set<std::string> args(argv, argv + argc);  if (!args.count("-nopopup")) gmsh::fltk::run();
 gmsh::finalize();  return 0;}

Nodes.txt文件中的节点信息:

Fixed Nodes:2 3 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 Load Nodes:5 6 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204

BDF文件太长,此处仅展示与Group设置相关部分,

//两个面上单元,被编号为502,503CQUAD4  1054    502     1192    54      72      1193    CQUAD4  1055    502     1193    72      53      1194    CQUAD4  1056    502     1194    53      3       85      CQUAD4  1057    503     4       118     1195    151     CQUAD4  1058    503     151     1195    1196    162     CQUAD4  1059    503     162     1196    1197    140     CQUAD4  1060    503     140     1197    1198    163

3.添加材料、边界条件、求解

在Gmsh导出的“bdf-Nastran.bdf”加入材料、Property信息:

$ AluminumMAT1,1,72395.,,0.33$ SteelMAT1,2,193060.,,0.3PSHELL,502,1,1.0,1,,1PSHELL,503,2,1.0,2,,2

加入载荷,边界:

SPCADD,500,1LOAD,501,1.0,1.0,1
$Fixed Nodes:SPC1,1,123456,2 3SPC1,1,123456,53,THRU,72
FORCE,1,5,0,10.,1.,0.,0.FORCE,1,6,0,10.,1.,0.,0.FORCE,1,184,0,10.,1.,0.,0.FORCE,1,185,0,10.,1.,0.,0.FORCE,1,186,0,10.,1.,0.,0.FORCE,1,187,0,10.,1.,0.,0.FORCE,1,188,0,10.,1.,0.,0.FORCE,1,189,0,10.,1.,0.,0.FORCE,1,190,0,10.,1.,0.,0.FORCE,1,191,0,10.,1.,0.,0.FORCE,1,192,0,10.,1.,0.,0.FORCE,1,193,0,10.,1.,0.,0.FORCE,1,194,0,10.,1.,0.,0.FORCE,1,195,0,10.,1.,0.,0.FORCE,1,196,0,10.,1.,0.,0.FORCE,1,197,0,10.,1.,0.,0.FORCE,1,198,0,10.,1.,0.,0.FORCE,1,199,0,10.,1.,0.,0.FORCE,1,200,0,10.,1.,0.,0.FORCE,1,201,0,10.,1.,0.,0.FORCE,1,202,0,10.,1.,0.,0.FORCE,1,203,0,10.,1.,0.,0.FORCE,1,204,0,10.,1.,0.,0.

加入求解控制,载荷步选取

SOL 101CENDTITLE =BDF FROM Gmsh
SUBCASE 1   SUBTITLE=Default   SPC = 500   LOAD = 501   DISPLACEMENT(SORT1,REAL)=ALL   SPCFORCES(SORT1,REAL)=ALL   STRAIN(SORT1,REAL,VONMISES,STRCUR,BILIN)=ALL   STRESS(SORT1,REAL,VONMISES,BILIN)=ALL$ Direct Text Input for this SubcaseBEGIN BULK

Nastran求解结果:

Gmsh与Nastran的图4

参考:

  • Gmsh 文档

  • Nastran Quick Reference Guide


文章来源:有限元仿真技术交流平台

默认 最新
当前暂无评论,小编等你评论哦!
点赞 3 评论 收藏
关注