Python—> Nastran
使用PyNastran库对 Patran&Nastran有限元分析软件进行二次开发,可以自动对目标模型进行有限元分析
BDF file
BDF文件是使用Patran对模型进行前处理产生的,包括划网格、定义结构参数、添加约束等操作,
Patran在设置好后进行分析时,还会输出一个bdf文件,然后在cmd中运行nastran xxx.bdf
指令即可调用Nastran进行有限元求解。
- xref:Cross-referencing,可以很方便地追踪对象,如果xref=False,只会返回数据对象的raw data,需要分别对bdf的element和node做索引
1 | # read |
1 | bdf.nodes.items() |
修改材料参数
材料参数的修改比较简单:
直接定位到材料参数所在的line,然后直接替换掉原来的字符即可
1 | bdf_copy = open(bdf_copy_path, 'r+') |
修改几何尺寸
对于简单的结构,例如长方体钢板,通过缩放修改BDF文件中nodes的坐标,就可以实现修改结构的厚度/长度等几何尺寸参数
问题1:只有单个零件的结构比较容易修改,但是如果结构中有许多子结构,在BDF文件中很难区分哪些是子结构1,哪些是子结构2的
😵尝试1:可以给每个子结构设置不同的坐标系coords,(Patran)
1 | eid100 = bdf_xref.elements[100] |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|
GRID | NID | CP | X1 | X2 | X3 | CD | PS | SEID |
😵要不还是学学ABAQUS,看看是否可行。
Results file
结果文件可以在Patran中设置,可以以多种不同的格式输出:
- OP2
- XDB
- HDF5,如果要用其他两种格式,需要取消勾选输出该文件 (可能是软件bug?😂)
- 此外还固定输出f06文件,方便用户查看结果
f06
f06文件中存储的是仿真的结果,可以直接用txt打开查看,从f06中提取modal frequency比较方便
直接根据特定的字符串,定位到模态频率的列表上,然后读取特征频率对应的行
modal frequency
1 | def get_modes(f06_copy_path:str): |
op2
op2与f06的内容相同,只是格式不同,相较于f06解析困难,OP2 非常结构化
op2转f06:test_op2 -f solid_bending.op2
-f
tells us to print outsolid_bending.test_op2.f06
不必重新运行得到f06文件??-c
flag disables double-reading of the OP2
导入需要的包,并读取op2文件
1 | import os |
查看文件内容
1 | print(op2.get_op2_stats()) |
FRF
- freqency为频率的采样点值
- disp_data为每个频率下的位移大小
1 | displacements = op2.displacements[1] |
Example (Steel Plate Structure)
Generate simulation datasets by FE (solidworks & patran & nastran & python)
Model and Simulate to get .bdf
file
- solidworks project Part.SLDPRT, export
.x_t
file - patran 材料属性参数设置+网格划分+约束+负载,并定义好输出的类型(mode shape/FRF…) to get
.bdf
file(其中保存着有限元模型前处理的结果,包括网格节点编号、坐标,材料属性) - run nastran
- input:
.bdf
file 使用python修改bdf中的参数,可以获得多个bdf,然后输入到nastran中进行仿真计算 - output:
.f06
file 包含仿真输出的结果
- input:
修改钢板厚度 Tickness思路:
- 读取所有节点坐标 nodes
- 计算厚度缩放比例
ratio = T / T_origin
,T是需要修改的厚度,T是bdf文件中初始的厚度 - 将nodes坐标沿着厚度反向进行缩放,得到nodes_modify
- 将修改后的nodes坐标写入bdf文件中
- 然后运行nastran根据修改后的bdf文件仿真计算得到f06文件
- 读取f06文件中的结果并保存
main code
1 | def get_output(bdf_path,input_path,nastran_path,save_dir): |
1 | def read_bdf_nodes(bdf_filename:str) -> np.ndarray: |