flac3d7.0主应力方向导出与可视化:使用fish导出单元体数据并用matlab绘制塑性区图
flac3d7.0主应力方向的导出并绘图 使用fish将单元体的三个主应力方向数据导出并使用matlab绘图可只对部分区域(如塑性区)的数据进行绘图在岩土工程数值模拟后处理中三维主应力方向可视化是个挺有意思的活。今天咱们直接上手实操用FLAC3D7.0的Fish语言配合Matlab整一套主应力方向可视化方案。别担心复杂咱们从最土的txt文件操作开始。先整一段Fish脚本把主应力方向导出来。注意FLAC3D里的应力方向是全局坐标系下的记得坐标系转换这事咱们后面再说。关键代码长这样def export_principals array array.create(3) io.open(principals.txt,1,1) loop foreach local zp zone_pointer if zone.model(zp) ! null ;跳过空单元 zone.stress(zp,array) ;获取主应力值 dir1 zone.stress.dir(zp,1) ;第一主应力方向向量 dir2 zone.stress.dir(zp,2) dir3 zone.stress.dir(zp,3) pos zone.pos(zp) ;单元中心坐标 io.out(string.pos(pos) ... string.stress(array) ... string(dir1) string(dir2) string(dir3)) endif end_loop io.close end export_principals这段脚本的核心在于用zone.stress.dir掏单元的主应力方向向量。注意这里用了string.pos和string.stress直接把坐标和应力转成字符串比挨个拼数字清爽多了。输出格式大概是x y z σ1 σ2 σ3 dir1x dir1y dir1_z...这种结构。flac3d7.0主应力方向的导出并绘图 使用fish将单元体的三个主应力方向数据导出并使用matlab绘图可只对部分区域(如塑性区)的数据进行绘图导出来的txt文件大概长这样3.5 2.0 1.5 -12.3e3 -5.6e3 -2.1e3 0.707 0.0 -0.707 ...接下来上Matlab处理。建议先搞个数据预处理器毕竟动辄几十万单元的数据直接怼进内存会卡到怀疑人生function [data] loadPrincipals(filepath, scale) raw textscan(fopen(filepath),%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f); coords [raw{1:3}]; % 坐标xyz sigma [raw{4:6}]; % 主应力值 dirs [raw{7:15}]; % 三个方向向量 % 向量归一化处理可选 for i 1:3 vec dirs(:,(i-1)*31:i*3); norms sqrt(sum(vec.^2,2)); dirs(:,(i-1)*31:i*3) vec ./ norms; end % 根据主应力筛选数据比如塑性区 plastic sigma(:,1) 0.7*max(sigma(:,1)); % 伪代码按实际条件修改 data struct(coords,coords(plastic,:), dirs,dirs(plastic,:), ... sigma,sigma(plastic,:)); end这里有个骚操作——用reshape处理方向向量矩阵。比如要把9列的方向数据转成三维矩阵dirTensor reshape(data.dirs, [], 3, 3); % 变成n×3×3的张量 sigma1_dir squeeze(dirTensor(:,1,:)); % 第一主应力方向矩阵绘图部分推荐用quiver3但直接全量绘制会变成刺猬图。咱们加点采样策略function plotPrincipals(data, sampleRatio) rng(0); % 固定随机种子 idx rand(size(data.coords,1),1) sampleRatio; figure(Position,[200 200 1200 800]) hold on % 绘制三个主应力方向 quiver3(data.coords(idx,1), data.coords(idx,2), data.coords(idx,3),... data.dirs(idx,1), data.dirs(idx,2), data.dirs(idx,3),... Color,r,LineWidth,1.2) quiver3(data.coords(idx,1), data.coords(idx,2), data.coords(idx,3),... data.dirs(idx,4), data.dirs(idx,5), data.dirs(idx,6),... Color,g,LineWidth,1.0) quiver3(data.coords(idx,1), data.coords(idx,2), data.coords(idx,3),... data.dirs(idx,7), data.dirs(idx,8), data.dirs(idx,9),... Color,b,LineWidth,0.8) % 调整视觉效果 axis equal vis3d camproj perspective camlight headlight material shiny view(45,30) set(gca,Color,[0.2 0.2 0.2]) end想突出显示最大主应力方向的话可以用箭头长度反映应力大小。加个缩放系数scaleFactor 0.5 * (data.sigma(:,1) - min(data.sigma(:,1))) / ... (max(data.sigma(:,1)) - min(data.sigma(:,1))); quiver3(..., AutoScaleFactor, scaleFactor)遇到过实际案例某边坡模型导出的方向向量在坡脚处呈现放射状分布通过颜色映射发现最大主应力方向与滑裂面走向高度吻合。这种直观验证比纯看数字报表爽快多了。最后提醒几个坑FLAC3D的方向向量是右手系Matlab的坐标系注意别搞反了大模型务必做数据抽样否则显卡风扇会抗议建议用parfor加速数据处理特别是上百万单元时可用cone代替箭头三维效果更明显用matlab的coneplot函数
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2486904.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!