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:定义具体的单元,节点,载荷,材料信息。
2.Gmsh划分网格并导出BDF文件
将Gmsh导出为特定的文件,使用“option”控制,支持很多格式,“31”标定BDF。
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,1
LOAD,501,1.0,1.0,1
$Fixed Nodes:
SPC1,1,123456,2 3
SPC1,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 101
CEND
TITLE =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 Subcase
BEGIN BULK
Nastran求解结果:
参考:
Gmsh 文档
Nastran Quick Reference Guide
文章来源:有限元仿真技术交流平台