跳转至

mfs

class mfs

Properties
Methods

transferPara(d1,d2,gNames,paras)

将指定组的属性由d1转到d2

d1,d2为build对象;gNames组名元胞矩阵;paras:参数元胞矩阵

见user_ClumpParticle2:mfs.transferPara(d,B.d,{'botPlaten','topPlaten','lefPlaten','rigPlaten'},{'aX','aZ'});

[gId1,gId2]=splitGroup(d,gName,type,value)

将组将属性大小分成两部分,并返回两部分的id

d对象;gName组名;type:d.mo中的属性字符串;value切分的值,大等于此值的返回到gId1中

gId返回的两部id

allDisc=grain2Clump2D(grainObj,expandRate,Rrate)

将大颗粒转化为clump

grainObj颗粒的结构体,expandRate:令minR为最小颗粒半径,当半径大于minR*expandRate且小于minR*expandRate^3/2时,转为七单元clump,当半径大于minR*expandRate^3/2时,采用discObj=mfs.denseModel0(Rrate,@mfs.makeDiscV,grainR,ballR1);生成圆盘clump

所有颗粒单元的结构体,包含groupId,以便进一步导入生成clump

见user_ClumpParticle2

porosity=getPorosity(B,zLimit)

计算z方向小于zLimit的孔隙率(利用get2DPorosity或get3DPorosity

B对象,zLimit:Z方向的上限

porosity=get3DPorosity(d,x1,x2,y1,y2,z1,z2)

计算三维sample一定区域内的孔隙率

d对象;x1,x2,y1,y2,z1,z2计算孔隙率的区域

porosity=get2DPorosity(d,x1,x2,z1,z2)

计算二维sample一定区域内的孔隙率,当d.SET.ballArea存在时,使用其计算颗粒面积,反之,则用sample

d对象;x1,x2,z1,z2计算孔隙率的区域

porosity=getBoxPorosity(B,topRate)

获得模型箱下方一定比例区域的孔隙率

B对象;topRate比例,为1时,则计算整个模拟箱

[data,B]=testSpeed(num,balanceCommand,isSingle)

用于测试程序的速度

num:模型在三个方向上的单元个数;balanceCommand平衡命令;isSingle是否单精度

data测试结果,B对象

见user_BoxTestSpeed

porosity=get2DPorosity(d,x1,x2,z1,z2)

计算二维模型的孔隙率

d对象;其它为坐标

孔隙率

porosity=get3DPorosity(d,x1,x2,y1,y2,z1,z2)

计算三维模型的孔隙率

d对象;其它为坐标

孔隙率

porosity=getPorosity(B,zLimit)

计算Box孔隙率(从底部0到zLimit间)

B对象; zLimit:计算Box孔隙率的高度

孔隙率

BoxCompaction

frame=getObjFrame(obj)

获取结构体在六个方向的边界,以及宽长高

模型结构体,包括信息:X, Y, Z, R

结构体frame,包括信息:left, right, front back, bottom, top, width, length, height

sFilter=applyRegionFilter(regionFilter,sX,sY)

应用mfs.image2RegionFilter生成的矩阵来过滤单元,得到单元过滤矩阵

regionFilter:布尔矩阵; sX, sY:单元x, y坐标

单元过滤器

见user_Box3DSlope2

regionFilter=image2RegionFilter(fileName,imH,imW)

根据图片生成imH*imW的布尔矩阵,图中白色为true

fileName: 图片文件名字符串(包含路径); imH, imW: 生成的矩阵的高和宽

区块布尔矩阵

见user_Box3DSlope3

bondFilter=setBondByPolygon(d,PX,PY,PZ,type)

利用多顶点定义的多边形面来切割或胶结模型

d:build对象;pX,pY,pZ,空间多边形的顶点坐标,如[1;2;3],[4;5;6],[7;8;8];type:可为'break'(断开连接),'glue'(胶结连接),'no'不改变d中的连接状态,仅返回bondFilter

对应于nBall的连接矩阵,值为1代表三角面有通过连接

见user_Box3DJointStress

bondFilter=setBondByTriangle(d,pX,pY,pZ,type)

用三个顶点定义的三角面来切割或胶结模型

d:build对象;pX,pY,pZ,空间三角面三个顶点坐标,如[1;2;3;4],[4;5;6;7],[7;8;9;10];type:可为'break'(断开连接),'glue'(胶结连接),'no'不改变d中的连接状态,仅返回bondFilter

对应于nBall的连接矩阵,值为2代表三角面有通过连接

见user_Box3DJointStress,type为'glue'时需再运行d.mo.zeroBalance();

[obj1,obj2]=divideObj(obj,pX,pY,pZ)

用三个顶点定义的三角面来切分结构体,生成两个结构体

obj:初始结构体模型;pX,pY,pZ:三角形坐标数组(列方向数组)

切割出的两个新结构体

ObjOut=rotateCopy(obj,dAngle,num,varargin)

结构体以原点为中心在XY平面上旋转复制

obj:初始结构体模型;dAngle:旋转角度;num:次数;varargin:0或1 个输入参数,字符串,可取'XY','YZ','XZ',无输入参数时在'XY'平面旋转

包括X,Y,Z,R信息的结构体

见user_BoxShear

ringObj=makeRing2(innerR,outerR,ballR0,Rrate)

用等大的单元制作环形

innerR:环内径;outerR:环外径;ballR:单元半径;Rrate:单元间距和直径比

包括X,Y,Z,R信息的结构体

见user_BoxShear

edge=getObjEdge(type,obj1)

获取结构体模型在某一方向的边界

type:字符串,可取‘left’,‘right‘,’front‘,’back‘,’bottom‘,’top‘;obj1:结构体

边界的坐标值

见user_BoxShear

obj1=align2Value(type,obj1,value)

将结构体模型的对齐到某一位置

type:字符串,可取‘left’,‘right‘,’front‘,’back‘,’bottom‘,’top‘;obj1:结构体;value:坐标值

包括X,Y,Z,R信息的结构体

见user_BoxShear

varargout=alignObj(type,varargin)

将多个结构体模型沿某一侧对齐

type:字符串,可取‘left’,‘right‘,’front‘,’back‘,’bottom‘,’top‘;varargin:多个结构体

按顺序返回多个结构体

[obj1,obj2]=mfs.alignObj('left',obj1,obj2);

ringObj=makeRing(innerR,layerNum,minBallR,Rrate)

生成一个二维的环,用于做隧道

innerR:环内径;layerNum:环径向单元个数;minBallR:最小单元半径;Rrate:单元间距和直径比

包括X,Y,Z,R信息的结构体

user_TunnelNew

mixGroupElement(d,gName,randPositionSeed)

将指定组的单元随机互换位置,从而得到新的堆积

d:build对象;gName:组名字符串;randPosition:随机种子数字

user_BoxUniaxialTest

note=balanceForce(d, Amax, num)

平衡模型直至最大加速度小于Amax,或平衡达到num次循环

d:build对象;Amax:最大加速度;num:平衡循环次数,平衡次数为100*num

关于平衡计算的信息字符串

obj1=combineObj(varargin)

将多个结构体合并一个

varargin:用于合并的多个结构体

合并得到的结构体

obj=cutBoxObj(sampleObj, width, length, height)

从样品对象中切取特定长宽高的块体,原点为中心

sampleObj:样品结构体; width,length,height:切取的长宽高

包括X,Y,Z,R信息的结构体

obj=cutSphereObj(sampleObj, radius)

从样品对象中切取特定半径的球,原点为中心

sampleObj:样品结构体; radius:切取的球半径

包括X,Y,Z,R信息的结构体

obj=denseModel(Rrate, F, varargin)

将结构体对象加密重叠

Rrate:单元间距和直径比,生成结构体的函数F,F的输入参数

包括X,Y,Z,R信息的结构体

user_BoxSlope2

obj=expandAlong(obj, dir, dDis, num)

沿正负方向复制扩展结构体中单元,基于expandAlongMax

obj:结构体; dir:方向: dDis:间距; num:次数

扩展得到的结构体

obj=expandAlongMax(obj, dir, dDis, num)

沿正值方向复制扩展结构体中单元

obj:结构体; dir:方向: dDis:间距; num:次数

扩展得到的结构体

obj=filterObj(obj, f)

利用过滤器选择结构体中单元生成新的结构体

obj:单元结构体; f:过滤器布尔矩阵(值为1则选中)

过滤后的结构体

stressSteps=getBoxUniaxialStressSteps(B)

根据B中的材料属性计算力学测试的应力步

B:Box对象

包括弹性、抗拉和抗压试验应力步的结构体

user_BoxMatTraining

filter=getColumnFilter(X, Y, Z, dipD, dipA, radius, height)

切出柱形的单元过滤器

X,Y,Z:坐标; dipD:倾向; dipA:倾角; radius:圆柱半径; height:圆柱高度

过滤器布尔矩阵

objCenter=getObjCenter(obj)

获取对象的中心

obj:模型结构体,包括信息:X, Y, Z, R

包括中心x,y,z信息的结构体

weakFilter=getWeakLayerFilter(X, Y, Z, dipD, dipA, strongT, weakT)

建立强弱互层单元过滤器

X,Y,Z:单元坐标; dipD:倾向; dipA:倾角; strongT:强层厚; weakT:弱层厚

弱层的过滤器矩阵

SET=getBoxSample(grainR,sampleW,sampleL,hRate)

根据半径数组得到Box模型所需的参数

grainR:半径数组;sampleW,sampleL模型宽和长,hRate高度比率(比1略大),hRate为1时,则返回的模型参数中sampleH为这些颗粒刚好需要的容器高度,当这个值增大时,则容器高度正比增加

Box模型设置结构体

user_HighSizeRatio.m

randD=getGradationDiameter(G,varargin)

根据粒径级配得到单元粒径数组

G:级配数据;varargin:一个参数时为体积,两个参数时,第一个参数为体积,第二个参数为级配曲线的类型,其决定在一个粒径范围内颗粒曲线的变化,通常在-1到3之间,其较小时级配曲线下凸,较大时上凸。取-1时(默认),则每个粒径对应的颗粒数一致,细单元较少;取3时,则每个粒径对应的颗粒总体积一致,细单元较多。

粒径数组

user_HighSizeRatio.m

obj=intervalObj(objOne, dx, dy, dz, num)

沿dx,dy,dz的间隔重复生成num个的objOne

objOne:单个结构体; dx,dy,dz间隔; num:生成个数

包括X,Y,Z,R信息的结构体

obj=make3DalongPath(obj2D,X,Y,Z,dDis,dAngle)

将二维物体沿着路径XYZ伸成三维(路径要精细)

obj2D:二维物体结构体;X,Y,Z:路径的坐标;dDis:复制移动距离;dAngle:复制旋转角度

包括X,Y,Z,R信息的结构体

见示例user_Cable,源代码见fun/make3DalongPath.m

obj3D=make3Dfrom2D(obj2D, height, ballR)

将二维的物体拉伸成三维,如将circle拉成tube

obj2D:二维物体结构体;height:拉成三维体的高;ballR:单元半径

包括X,Y,Z,R信息的结构体

obj=makeBox(boxW, boxL, boxH, ballR)

做一个块体结构体

宽,长,高,单元半径

包括X,Y,Z,R信息的结构体

user_BoxSlope3

obj=makeCircle(circleR, ballR)

做圆圈的结构体

circleR:圆的半径;ballR:单元半径

包括X,Y,Z,R信息的结构体

obj=makeColumn(columnR, columnHeight, ballR)

做一个柱体结构体

columnR:圆柱半径; columnHeight:圆柱高度; ballR:单元半径

包括X,Y,Z,R信息的结构体

obj=makeDisc(discR, ballR)

做一个二维圆结构体

discR:圆盘的半径;ballR:单元半径

包括X,Y,Z,R信息的结构体

obj=makeHob(hobR, hobT, cutRate, ballR, Rrate)

生成一个滚刀结构体

hobR:滚刀半径; hobT:厚度; cutRate:刀口倾斜度(越大越尖); ballR:单元半径; Rrate:单元间距和直径比

包括X,Y,Z,R信息的结构体

hob=mfs.makeHob(hobR,hobT,cutRate,ballR,Rrate);

obj=makeLine(dir, length, ballR)

沿X,Y,Z某一方向生成一条线

dir:方向,可取字符串'X','Y','Z'; length:长度; ballR:单元半径

包括X,Y,Z,R信息的结构体

mfs.makeLine('X',1,0.05);

obj=makeLShape(width, height, ballR)

生成一个L形的条(用于做网)

width:宽; length: 长; ballR:单元半径

包括X,Y,Z,R信息的结构体

obj=makeNet(width, height, cellW, cellH, ballR)

根据网的长宽,网眼的长宽和单元半径生成网

width:宽; height: 高; cellW:网眼宽; cellH:网眼高; ballR:单元半径

包括X,Y,Z,R信息的结构体

a=mfs.makeNet(100,100,10,10,1);fs.showObj(a);

obj=makeRect(width, length, ballR)

做一个平面长方形结构体

width:宽; length: 长; ballR: 单元半径

包括X,Y,Z,R信息的结构体

obj=makeTube(tubeR, tubeHeight, ballR)

做管子结构体,四边形堆积

tubeR:管子半径; tubeHeight:长; ballR:单元半径

包括X,Y,Z,R信息的结构体

obj=makeTube2(tubeR,tubeHeight,ballR)

做管子结构体,六边形堆积

tubeR:管子半径; tubeHeight:长; ballR:单元半径

包括X,Y,Z,R信息的结构体

Cu=makeUniaxialCuTest(B, stressSteps)

根据stressSteps进行B的单轴压缩试验

B: Obj_Box对象; stressSteps:应力步

单轴抗压强度Cu信息

user_BoxMatTraining

Ev=makeUniaxialEvTest(B, stressSteps)

根据stressSteps进行B的弹性模量试验

B:f;stressSteps:单元半径

弹性模量Ev信息

user_BoxMatTraining

B=makeUniaxialTest(B, varargin)

自动进行单轴力学测试,压缩,抗伸和Ev测试,计算密度,user_BoxMatTraining

B:Obj_Box对象; varargin:0或1个输入参数,为1时可取'Cu','Tu','Ev',并进行相关测试,为0时进行以上三种测试,参考user_BoxMatTraining

Obj_Box对象

user_BoxMatTraining

B=makeUniaxialTestModel0(width, length, height, ballR, distriRate, randSeed)

单轴测试初始建模

width,length,height:模型宽长高;ballR:半径;distriRate:单元半径分散系数;randSeed:随机种子

Obj_Box对象

user_BoxMatTraining

B=makeUniaxialTestModel1(B)

对makeUniaxialTestModel0生成的模型进行重力堆积

B:Obj_Box对象

Obj_Box对象

user_BoxMatTraining

B=makeUniaxialTestModel2(B,matFile,varargin)

对makeUniaxialTestModel1生成的模型进行赋材料

B:Obj_Box对象; matFile: 模型材料(可为文件名或material对象);varargin:可输入材料的rate参数,来定义material宏观参数系数(见material.rate)

Obj_Box对象

user_BoxMatTraining

B=makeUniaxialTuTest(B, stressSteps)

根据stressSteps进行B的单轴拉伸试验

B: Obj_Box对象; stressSteps:应力步

Obj_Box对象

user_BoxMatTraining

obj=move(obj, varargin)

移动结构体

obj:结构体;varargin:1个输入参数时为坐标数组P[x,y,z],3个参数为x,y,z坐标

包括X,Y,Z,R信息的结构体

user_BoxShear

obj=moveObj2Origin(obj)

将对象的中心移到原点

obj:样品结构体,包括X,Y,Z,R信息

包括X,Y,Z,R信息的结构体

mfs.moveObj2Origin(a);

d=Obj2Build(obj, varargin)

将一个Obj结构体转化为build对象

obj:样品结构体; varargin:可选参数,定义build中的mNum

build对象

reduceGravity(d, index)

逐步减少模型中的单元重力,每次除以10,再平衡200次,最后标准平衡一次

d: build对象; index:除以10的次数

见示例第一步

obj=rotate(obj, type, angle)

将结构体沿特定方向转到一定角度

结构体,方向('XY','YZ','XZ'),角度

包括X,Y,Z,R信息的结构体

在二维模型中,旋转后再运行d.mo.aY(:)=0,防止浮点误差出错

show(obj)

显示结构体,结构体中包含X,Y,Z,R,gId信息,根据gId显示颜色

obj:结构体

sorting(D, divNum)

获得单元直径分布,并画图

D:单元直径数组; divNum:分割数

包含分选系数等的结构体

obj=createSurfaceNet(x,y,z,ballR,Rrate,varargin)

%x,y,z: DEM scattered data. %ballR: the uniform radius of elements. %Rrate: the ratio of the distance between two elements to their diameter. %varargin: 1 parameter, the uniform width of the margins to be clipped; % 2 parameters, the widths of the margins to be clipped, left and right, top and bottom, respectively; % 4 parameters, the widths of the margins to be clipped, left, right, top, bottom, respectively.

user_createSurfaceNet

0以下为程序内部函数,通常不直接使用

boxCut(obj, box)

*

calculateParaRate(matFile, para1)

计算输入和实测力学参数的比值,用在UnaxialTest中*

changeRadiusDistribution(d, randSeed)

暂时不可用

clearObj(obj)

清理结构体,将所有参数设为空[]

connectFilter=groupConnectFilter(nBall,G1_gId,G2_gId)

%get the connection filter bewteen two group

connectFilter=groupOuterConnectFilter(nBall,G1_gId)

convertDir(dirIn)

*

crossProduct(AX, AY, AZ, BX, BY, BZ)

叉乘运算

data2D(XYZ, Y0, R0)

*

defineBoundary(varargin)

*to be deleted in future

getBoxBoundary(type, boundaryRrate, BexpandRate, w, l, h, ballR)

*

getBoxFrame(X, Y, Z, R)

*

getJointCutFilter(x1, z1, x2, z2, nXI, nZI, nXJ, nZJ, nBall)

%using cross product to determine the vector side*

group2MatId(aMatId, gId, gIdList, mIdList)

*

isExist(cellObj, name)

*

moveMeshGrid(S, moveDis)

将meshgrid沿着Z方向移动一定距离

包含mesh的XYZ信息

见3DSlope示例

obj=rotate2Path(obj, P1, P2)

沿着路径旋转*

包括X,Y,Z,R信息的结构体

rotateIJ(I, J, angle)

*

setBlockClump(X, Y, Z, limit)

*

shrink(X0, Y0, Z0, rate)

将坐标向物体中心收缩

XYZ2Plunge(P)

*

[connectFilter1,connectFilter2]=groupConnectFilter0(nBall,G1_gId,G2_gId)

获得G1_gId和G2_gId单元间的邻居过滤器

%connectFilter1: connection filter in first group rows, %connectFilter2: connection filter in second group rows

[connectFilter1,connectFilter2]=groupOuterConnectFilter0(nBall,G1_gId)

%get the connection filter a group with all other elements

GForce=getWallGroupForce(d,G1_gId,G2_gId)

用于支持d.getGroupForce函数

d对象;组Id

GForce=getModelGroupForce(d,G1_gId,G2_gId)

用于支持d.getGroupForce函数

d对象;组Id