首页/文章/ 详情

【仿真技术】使用Fish实现FLAC3D计算结果快速导入TECPLOT

1年前浏览8313
     

在之前的一篇文章中,我们介绍了如何使用Python编程语言将FLAC3D计算结果快速导入TECPLOT软件。公 众 号链接如下:

【仿真技术】使用Python实现FLAC3D计算结果快速导入TECPLOT


Fish语言简介


今天,我们将继续探讨将FLAC3D计算结果快速导入TECPLOT软件,但这次我们将使用一种专为FLAC3D而设计的编程语言——FishFish是一种脚本编程语言,它针对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

来源:数字孪生与工程计算
TecplotFLAC3D
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-06
最近编辑:1年前
Rockman
博士 | 副教授 十年饮冰
获赞 10粉丝 43文章 16课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈