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.posstring.stress直接把坐标和应力转成字符串,比挨个拼数字清爽多了。输出格式大概是"x y z σ1 σ2 σ3 dir1x dir1y dir1_z..."这种结构。

导出来的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)*3+1:i*3);
        norms = sqrt(sum(vec.^2,2));
        dirs(:,(i-1)*3+1: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)

遇到过实际案例:某边坡模型导出的方向向量在坡脚处呈现放射状分布,通过颜色映射发现最大主应力方向与滑裂面走向高度吻合。这种直观验证比纯看数字报表爽快多了。

最后提醒几个坑:

  1. FLAC3D的方向向量是右手系,Matlab的坐标系注意别搞反了
  2. 大模型务必做数据抽样,否则显卡风扇会抗议
  3. 建议用parfor加速数据处理,特别是上百万单元时
  4. 可用cone代替箭头,三维效果更明显(用matlab的coneplot函数)
Logo

电影级数字人,免显卡端渲染SDK,十行代码即可调用,工业级demo免费开源下载!

更多推荐