首页/文章/ 详情

Range fish的使用

2年前浏览3115

  PFC的range包含了绝大部分的范围使用,包括id、组、位置等。当然作为一个用户自由度非常高的软件,也提供了用户自定义范围的方法,也就是range fish。这里对其使用方法进行简单的讲解以及应用,主要应用场景应当是对组间接触的赋值是非常有用的。


一、fish range 的用法


    首先第一步需要构造一个fish函数,fish函数的命名格式为:











fish def IsInRange(pos,pointer)    if ... then        IsInRange=true
    else        IsInRange=false    endif
end


    其中IsInRange为fish的名称,其中需要包括两个传入参数,第一个参数是pos,为元素的位置;第二个参数为元素指针。在函数中需要根据if判断来设定函数的返回值是true还是false。


    第二步就是使用

image.png

进行调用即可。下面举几个小例子。


二、筛选指定位置的小颗粒



    这里我们首先生成随机分布的0.3-0.8半径的颗粒:

image.png

然后定义我们需要的小颗粒的条件:

image.png

这里我们把半径小于0.5,并且位置在坐标轴右边的颗粒定义为small的分组。


效果如图:


微信截图_20220719164332.png


三、筛选圆右边筒壁的面片


 这里我们首先生成一个圆筒:

image.png

之后定义我们分类的fish函数:

image.png

筒壁上面片应该满足坐标大于0,并且面片法向的向量的z值为0。


效果如图:

image.png

四、指定组间接触


    这个之前介绍过一个方法 《接触分组赋值》,很明显的是里面的方法异常的繁琐,虽然我们常说的是不管黑猫白猫,抓住老鼠就是好猫。但是代码整洁、易修改也是我们的目标。

这里介绍一下利用range fish 实现组件接触的赋值。

首先生成颗粒,分成 small 、mid 、big三个组。














model newmodel domain extent -10 10 

wall generate box -5 5ball generate radius 0.1 0.4 number 150 box -5 5ball attribute density 2e3 damp 0.7

ball group "small" range radius 0.1 0.2ball group "mid" range radius 0.2 0.3 ball group "big" range radius 0.3 0.4


然后我们定义组内的接触:

image.png

    这里的match 2相当于5.0的and用法,之前的全局设置降低到局部,应当是更加方便的。


    到这一步为止,如果我们运行的话,组间的接触应该都是默认default的kn=1e7。如图:

image.png



图中蓝色的都是组间接触。


我们按之前的概念,首先定义三个组间的fish函数:

IsSmallAndMid 、 IsSmallAndBig 、IsMidAndBig

































def IsSmallAndMid(pos,pointer)    ball_pointer_1=contact.end1(pointer)    ball_pointer_2=contact.end2(pointer)    if  IsWallPointer(ball_pointer_1) | IsWallPointer(ball_pointer_2)then        IsSmallAndMid=false        exit    endif    IsSmallAndMid=IsBetweenGroup(ball_pointer_1,ball_pointer_2,"Default=small","Default=mid")end

def IsSmallAndBig(pos,pointer)    ball_pointer_1=contact.end1(pointer)    ball_pointer_2=contact.end2(pointer)    if  IsWallPointer(ball_pointer_1) | IsWallPointer(ball_pointer_2)then        IsSmallAndBig=false        exit    endif    IsSmallAndBig=IsBetweenGroup(ball_pointer_1,ball_pointer_2,"Default=small","Default=big")end

def IsMidAndBig(pos,pointer)    ball_pointer_1=contact.end1(pointer)    ball_pointer_2=contact.end2(pointer)    if  IsWallPointer(ball_pointer_1) | IsWallPointer(ball_pointer_2)then        IsMidAndBig=false        exit    endif    IsMidAndBig=IsBetweenGroup(ball_pointer_1,ball_pointer_2,"Default=mid","Default=big")end


里面用到了两个函数,这两个函数应该在上述函数前定义:

 1、 IsWallPointer 用来判断是否是墙体指针:

image.png

2、 IsBetweenGroup 用来判断两个颗粒是否分别属于两个分组:

image.png

然后我们进行接触赋

image.png

效果如图所示:

image.png



    可以发现的是组间的接触分别给了三个数值,如预期一样,证明使用这种方式加组间接触参数是可行的。


附上分组给接触完整的代码:
























































































model newmodel domain extent -10 10 

wall generate box -5 5ball generate radius 0.1 0.4 number 150 box -5 5ball attribute density 2e3 damp 0.7

ball group "small" range radius 0.1 0.2ball group "mid" range radius 0.2 0.3 ball group "big" range radius 0.3 0.4contact cmat default model linear property kn 1e7 ks 1e1 fric 0.5 contact cmat add 1 model linear property kn 2e7 ks 1e1 fric 0.5 ...        range group "small" match 2contact cmat add 2 model linear property kn 3e7 ks 1e1 fric 0.5 ...        range group "mid" match 2contact cmat add 3 model linear property kn 4e7 ks 1e1 fric 0.5 ...        range group "big" match 2

def IsWallPointer(pointer)    if type.pointer.name(pointer) =="Facet" then        IsWallPointer=true    else         IsWallPointer=false    endifenddef IsBetweenGroup(bp1,bp2,group1,group2)    ball_group_1=ball.group(bp1)    ball_group_2=ball.group(bp2)    if  ball_group_1==group1 & ball_group_2==group2 then        IsBetweenGroup=true        exit    endif    if  ball_group_1==group2 & ball_group_2==group1 then        IsBetweenGroup=true        exit    endif    IsBetweenGroup=falseend

def IsSmallAndMid(pos,pointer)    ball_pointer_1=contact.end1(pointer)    ball_pointer_2=contact.end2(pointer)    if  IsWallPointer(ball_pointer_1) | IsWallPointer(ball_pointer_2)then        IsSmallAndMid=false        exit    endif    IsSmallAndMid=IsBetweenGroup(ball_pointer_1,ball_pointer_2,"Default=small","Default=mid")end

def IsSmallAndBig(pos,pointer)    ball_pointer_1=contact.end1(pointer)    ball_pointer_2=contact.end2(pointer)    if  IsWallPointer(ball_pointer_1) | IsWallPointer(ball_pointer_2)then        IsSmallAndBig=false        exit    endif    IsSmallAndBig=IsBetweenGroup(ball_pointer_1,ball_pointer_2,"Default=small","Default=big")end

def IsMidAndBig(pos,pointer)    ball_pointer_1=contact.end1(pointer)    ball_pointer_2=contact.end2(pointer)    if  IsWallPointer(ball_pointer_1) | IsWallPointer(ball_pointer_2)then        IsMidAndBig=false        exit    endif    IsMidAndBig=IsBetweenGroup(ball_pointer_1,ball_pointer_2,"Default=mid","Default=big")end

contact cmat add 4 model linear property kn 5e7 ks 1e1 fric 0.5 ...        range fish @IsSmallAndMidcontact cmat add 5 model linear property kn 6e7 ks 1e1 fric 0.5 ...        range fish @IsSmallAndBigcontact cmat add 6 model linear property kn 7e7 ks 1e1 fric 0.5 ...        range fish @IsMidAndBigmodel gravity 9.8

model solve




代码&命令科普PFC
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-07-19
最近编辑:2年前
lobby
硕士 |擅长颗粒流PFC
获赞 880粉丝 4980文章 83课程 22
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈