首页/文章/ 详情

【技术分享】FLAC3D模型一键旋转!

8小时前浏览3


【技术分享】FLAC3D模型一键旋转!

在岩土工程数值模拟中,我们经常需要调整模型方位。今天分享一个实现FLAC3D模型旋转的黑科技!同时采用Python和Fish脚本实现。

应用场景

  • 地质模型坐标校正
  • 不同坐标系下的结果对比
  • 多工况方向性分析

旋转操作

假定旋转的基点为(    ,    ),逆时针旋转角度为theta(单位为°),二维旋转变换的数学表达式:

 
 

对应代码

Fish操作代码如下:

fish define rot_pt_angle(pt, theta)

angle_radians = math.degrad * theta

loop foreach local gp gp.list

x = gp.pos.y(gp)

y = gp.pos.x(gp)

x_rotated =(x-pt(1))*math.cos(angle_radians)-(y-pt(2))*math.sin(angle_radians)+pt(1)

y_rotated =(x-pt(1))*math.sin(angle_radians)+(y-pt(2))*math.cos(angle_radians)+pt(2)

gp.pos.x(gp) = x_rotated

gp.pos.y(gp) = y_rotated

endloop

end

Python操作代码如下:

import itasca as it

import math

it.command("python-reset-state false")

def rot_pt_angle(pt, theta):

angle_radians = math.radians(theta)

for gp in it.gridpoint.list():

x = gp.pos_x()

y = gp.pos_y()

x_rotated = (x-pt[0]) * math.cos(angle_radians) - (y-pt[1]) * math.sin(angle_radians) + pt[0]

y_rotated = (x -pt[0]) * math.sin(angle_radians) + (y-pt[1]) * math.cos(angle_radians) + pt[1]

gp.set_pos_x(x_rotated)

gp.set_pos_y(y_rotated )

return 0

旋转模型前后展示:

   
   


来源:数字孪生与工程计算
python岩土FLAC3D
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-06-07
最近编辑:8小时前
Rockman
博士 | 副教授 十年饮冰
获赞 11粉丝 50文章 20课程 0
点赞
收藏
作者推荐

【仿真技术】简单的极限平衡计算的编程实现

引言笔者从教时间不长,只有三四年,每一次教学都能从中获取很多新的发现。正如徐芝纶老先生所言“学无止境、教亦无止境”。极限平衡是土力学中计算边坡安全系数最常用的方法,笔者在教学过程中给学生编写了一个简单的极限平衡计算程序,程序非常简单,只有几十行。后面有时间的话会加入图形界面进行进一步完善。计算采用最经典的瑞典条方法,具体原理公式如下: 图1 瑞典条方法计算基本原理算例介绍如下图所示有一个均值边坡,尺寸如下图。假定土体的重度为23.5kN,土体的黏聚力25kPa,内摩擦角30°,假定圆弧的圆心坐标为(10,40),半径为30m,试计算该滑弧对应的安全系数。 程序实现本程序在几何图形计算中使用了shapely库,shapely是一个python包,用于设置平面特征的理论分析和操作(通过python的 ctypes 模块)来自著名和广泛部署的地理类库的功能。本程序可以为三个部分:1. 计算滑坡体的几何信息:采用圆心和半径绘制圆,然后将这个圆与边坡多边形相切,交集部分即为滑坡体,代码如下:polygon = Polygon([[0, 0], [50, 0], [50, 40], [40, 40], [10,10],[0,10], [0, 0]])circle = Point(center[0], center[1]).buffer(radius)pintersect = polygon.intersection(circle) 2. 将滑坡体分条:我们提供的思路是将滑坡体x方向的最大和最小值找出来,然后绘制一系列不同x坐标的竖线,通过计算竖线与滑坡体的交点,得到每一个滑块的信息。具体代码如下:''' get the x coordinates limit the pintersect '''xlimit = pintersect.bounds[0], pintersect.bounds[2]ylimit = pintersect.bounds[1], pintersect.bounds[3]'''slice the pinterset into 10 slices '''slice_num = 20xstep = (xlimit[1] - xlimit[0])/slice_num''' get the slices using intersction'''slice_points = []for i in range(slice_num+1): line_tmp = LineString([(xlimit[0]+xstep*i, ylimit[0]), (xlimit[0]+xstep*i, ylimit[1])]) pts = pintersect.intersection(line_tmp) slice_points.append(pts.xy) 3. 计算该滑面对应的安全系数:这一块稍微麻烦,需要把每一个滑块上的物理量算出来,然后用公式(1)计算边坡的安全系数,这一块代码略长一点,有兴趣的同学可以自己看代码。最终实现的效果如下所示,边坡的安全系数Fos = 1.13。其实这个程序的计算代码并不长,但是把计算过程绘制出来还是毕竟麻烦的,采用了Matplotlib图形库,有心的朋友可以仔细看看代码呀。 图2 程序初步运行结果END来源:数字孪生与工程计算

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈