在之前的一篇文章中,我们介绍了如何使用Python编程语言将FLAC3D计算结果快速导入TECPLOT软件。公 众 号链接如下:
Fish语言简介
今天,我们将继续探讨将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_mesh2tecglobal IO_READ = 0global IO_WRITE = 1global IO_FISH = 0global IO_ASCII = 1global N_RECORD = 10 ;;;;;;;;;;;;;;;;The figure count of each lineglobal 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 rangecommandmodel range create 'tec_range'endcommandend@ini_mesh2tec;; Get number of zones to plotfish define get_nzoneglobal p_zglobal n_zoneglobal plotitglobal numzonesn_zone = 0numzones = 0p_z = zone.headloop while p_znumzones = numzones + 1plot_testif plotit = 1 thenn_zone = n_zone + 1endifp_z = zone.next(p_z)endloopend@get_nzone;; Write Tecplot File Headfish define write_headglobal n_zonebuf(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_infoglobal p_gpglobal info_flagglobal gp_disp1p_gp = gp.headloop while p_gpbuf(1) = ''loop i(1,N_RECORD)if p_gp # null thencaseof info_flagcase 0buf(1) = buf(1) + string(gp.pos.x(p_gp)) + ' 'case 1buf(1) = buf(1) + string(gp.pos.y(p_gp)) + ' 'case 2buf(1) = buf(1) + string(gp.pos.z(p_gp)) + ' 'case 4get_gp_disp_Ybuf(1) = buf(1) + string(gp_disp1*1000) + ' 'case 8buf(1) = buf(1) + string(gp.disp.x(p_gp)*1000) + ' 'case 16buf(1) = buf(1) + string(gp.disp.y(p_gp)*1000) + ' 'case 32buf(1) = buf(1) + string(gp.disp.z(p_gp)*1000) + ' 'endcasep_gp = gp.next(p_gp)endifendloopstatus = file.write(buf,1)endloopend
第三步:写入单元信息
FLAC3D模型由各种类型的单元组成。我们需要将这些单元的信息(例如应力和单元的连接性)写入TECPLOT文件。要注意的是代码中使用了zone.code()函数,在FLAC3D中(0 = 砖形,1 = 楔形,2 = 金字塔形,3 = dbrick,4 = 四面体)。获取主应力的代码如下:
fish define write_zone_infoglobal p_zglobal info_flagglobal plotitp_z = zone.headloop while p_zbuf(1) = ''loop i(1,N_RECORD)if p_z # null thenplot_testif plotit = 1 thencaseof info_flagcase 0buf(1) = buf(1) + string(zone.stress.prin.x(p_z)*0.000001) + ' 'case 1buf(1) = buf(1) + string(zone.stress.prin.y(p_z)*0.000001) + ' 'case 2buf(1) = buf(1) + string(zone.stress.prin.z(p_z)*0.000001) + ' 'case 4buf(1) = buf(1) + string(zone.stress.xx(p_z)*0.000001) + ' 'case 8buf(1) = buf(1) + string(zone.stress.yy(p_z)*0.000001) + ' 'case 16buf(1) = buf(1) + string(zone.stress.zz(p_z)*0.000001) + ' 'case 32buf(1) = buf(1) + string(zone.stress.xy(p_z)*0.000001) + ' 'case 64buf(1) = buf(1) + string(zone.stress.yz(p_z)*0.000001) + ' 'case 128buf(1) = buf(1) + string(zone.stress.xz(p_z)*0.000001) + ' 'endcaseendifp_z = zone.next(p_z)endifendloopstatus = file.write(buf,1)endloopend
通过上述三步,我们能够将FLAC3D计算结果中的模型数据以Tecplot格式写入文件。这样一来,我们就可以方便地在TECPLOT软件中加载和分析FLAC3D的计算结果,进行进一步的可视化和后处理。