【仿真技术】使用Fish实现FLAC3D计算结果快速导入TECPLOT
在之前的一篇文章中,我们介绍了如何使用Python编程语言将FLAC3D计算结果快速导入TECPLOT软件。公 众 号链接如下:【仿真技术】使用Python实现FLAC3D计算结果快速导入TECPLOTFish语言简介今天,我们将继续探讨将FLAC3D计算结果快速导入TECPLOT软件,但这次我们将使用一种专为FLAC3D而设计的编程语言——Fish。Fish是一种脚本编程语言,它针对FLAC3D软件进行了优化,使得处理和操作FLAC3D模型和数据变得更加便捷。如果您之前已经阅读了我们的文章,您会发现本质上代码的功能是相同的,只是编程语言不同。编程语言:Fish适用软件版本:FLAC3D7.0和TECPLOT2017注:本文代码是在前人基础上进一步编写的 使用方法本节基于以FLAC3D使用手册中 “Simple Slope in Hoek-Brown Material”为例,展示使用Fish编程语言来实现将FLAC3D计算结果导入TECPLOT的功能。根据官方提供的代码,模型计算结果如下: 打开FLAC3D7.0_TO_Tecplot2017.dat并直接运行,获得“0502-KL1-1-XSGK+DZ.dat”文件。打开TECPLOT,点击File-Load Data,载入“0502-KL1-1-XSGK+DZ.dat”文件,即可实现将FLAC3D计算结果导入TECPLOT。 代码详解 代码逻辑与PYTHON篇的代码基本一致,因此只介绍关键步骤。第一步:统计单元数量、创建TECPLOT文件并写入头部信息首先,我们需要创建一个TECPLOT文件,并设置文件的基本信息。以下是使用Fish语言编写代码:fish define ini_mesh2tec global IO_READ = 0 global IO_WRITE = 1 global IO_FISH = 0 global IO_ASCII = 1 global N_RECORD = 10 ;;;;;;;;;;;;;;;;The figure count of each line global ZONE_NGP = zone.gp.num(zone.head) array buf(1) global tec_file = '0502-KL1-1-XSGK+DZ.dat';; Edit the tec_range to set plot range command model range create 'tec_range' endcommandend@ini_mesh2tec;; Get number of zones to plotfish define get_nzoneglobal p_zglobal n_zoneglobal plotitglobal numzones n_zone = 0 numzones = 0 p_z = zone.head loop while p_z # null numzones = numzones + 1 plot_test if plotit = 1 then n_zone = n_zone + 1 endif p_z = zone.next(p_z) endloopend@get_nzone;; Write Tecplot File Headfish define write_head global n_zone buf(1) = 'TITLE = "FLAC3D to Tecplot 10"\n' buf(1) = buf(1) + 'VARIABLES = "X(m)" \n"Y(m)" \n"Z(m)" \n' buf(1) = buf(1) + '"DISP(mm)" \n"XDISP(mm)" \n"YDISP(mm)" \n"ZDISP(mm)" \n' buf(1) = buf(1) + '"SIG1(MPa)" \n"SIG2(MPa)" \n"SIG3(MPa)" \n' buf(1) = buf(1) + '"SXX(MPa)" \n"SYY(MPa)" \n"SZZ(MPa)" \n' buf(1) = buf(1) + '"SXY(MPa)" \n"SYZ(MPa)" \n"SZX(MPa)" \n' buf(1) = buf(1) + 'ZONE T="GLOBAL" \n' buf(1) = buf(1) + ' N=' + string(gp.num) + ',' buf(1) = buf(1) + ' E=' + string(n_zone) + ',' buf(1) = buf(1) + ' ZONETYPE=FEBrick \n' buf(1) = buf(1) + ' DATAPACKING=BLOCK \n' buf(1) = buf(1) + ' VARLOCATION=([8-16]=CELLCENTERED) \n' buf(1) = buf(1) + ' DT=(SINGLE SINGLE SINGLE' buf(1) = buf(1) + ' SINGLE SINGLE SINGLE SINGLE' buf(1) = buf(1) + ' SINGLE SINGLE SINGLE' buf(1) = buf(1) + ' SINGLE SINGLE SINGLE' buf(1) = buf(1) + ' SINGLE SINGLE SINGLE )' status = file.write(buf,1)end 第二步:写入节点坐标信息FLAC3D模型的节点坐标信息是构成模型的基础数据之一。我们需要将这些节点信息(例如节点坐标和位移)写入TECPLOT文件。相关代码如下:fish define write_gp_info global p_gp global info_flag global gp_disp1 p_gp = gp.head loop while p_gp # null buf(1) = '' loop i(1,N_RECORD) if p_gp # null then caseof info_flag case 0 buf(1) = buf(1) + string(gp.pos.x(p_gp)) + ' ' case 1 buf(1) = buf(1) + string(gp.pos.y(p_gp)) + ' ' case 2 buf(1) = buf(1) + string(gp.pos.z(p_gp)) + ' ' case 4 get_gp_disp_Y buf(1) = buf(1) + string(gp_disp1*1000) + ' ' case 8 buf(1) = buf(1) + string(gp.disp.x(p_gp)*1000) + ' ' case 16 buf(1) = buf(1) + string(gp.disp.y(p_gp)*1000) + ' ' case 32 buf(1) = buf(1) + string(gp.disp.z(p_gp)*1000) + ' ' endcase p_gp = gp.next(p_gp) endif endloop status = file.write(buf,1) endloopend 第三步:写入单元信息FLAC3D模型由各种类型的单元组成。我们需要将这些单元的信息(例如应力和单元的连接性)写入TECPLOT文件。要注意的是代码中使用了zone.code()函数,在FLAC3D中(0 = 砖形,1 = 楔形,2 = 金字塔形,3 = dbrick,4 = 四面体)。获取主应力的代码如下:fish define write_zone_info global p_z global info_flag global plotit p_z = zone.head loop while p_z # null buf(1) = '' loop i(1,N_RECORD) if p_z # null then plot_test if plotit = 1 then caseof info_flag case 0 buf(1) = buf(1) + string(zone.stress.prin.x(p_z)*0.000001) + ' ' case 1 buf(1) = buf(1) + string(zone.stress.prin.y(p_z)*0.000001) + ' ' case 2 buf(1) = buf(1) + string(zone.stress.prin.z(p_z)*0.000001) + ' ' case 4 buf(1) = buf(1) + string(zone.stress.xx(p_z)*0.000001) + ' ' case 8 buf(1) = buf(1) + string(zone.stress.yy(p_z)*0.000001) + ' ' case 16 buf(1) = buf(1) + string(zone.stress.zz(p_z)*0.000001) + ' ' case 32 buf(1) = buf(1) + string(zone.stress.xy(p_z)*0.000001) + ' ' case 64 buf(1) = buf(1) + string(zone.stress.yz(p_z)*0.000001) + ' ' case 128 buf(1) = buf(1) + string(zone.stress.xz(p_z)*0.000001) + ' ' endcase endif p_z = zone.next(p_z) endif endloop status = file.write(buf,1) endloopend 通过上述三步,我们能够将FLAC3D计算结果中的模型数据以Tecplot格式写入文件。这样一来,我们就可以方便地在TECPLOT软件中加载和分析FLAC3D的计算结果,进行进一步的可视化和后处理。END来源:数字孪生与工程计算