在之前的一篇文章中,我们介绍了如何使用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_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'
endcommand
end
@ini_mesh2tec
;; Get number of zones to plot
fish define get_nzone
global p_z
global n_zone
global plotit
global numzones
n_zone = 0
numzones = 0
p_z = zone.head
loop while p_z
numzones = numzones + 1
plot_test
if plotit = 1 then
n_zone = n_zone + 1
endif
p_z = zone.next(p_z)
endloop
end
@get_nzone
;; Write Tecplot File Head
fish 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
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)
endloop
end
第三步:写入单元信息
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
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)
endloop
end
通过上述三步,我们能够将FLAC3D计算结果中的模型数据以Tecplot格式写入文件。这样一来,我们就可以方便地在TECPLOT软件中加载和分析FLAC3D的计算结果,进行进一步的可视化和后处理。