PFCBBS交流论坛---群号: 45609530

Would you like to react to this message? Create an account in a few clicks or log in to continue.
PFCBBS交流论坛---群号: 45609530

交流PFC中的技术问题与常见问题,以便提高PFC软件在国内的认知度。让颗粒联系你我,共同进步!!~

十一月 2024

周一周二周三周四周五周六周日
    123
45678910
11121314151617
18192021222324
252627282930 

日历 日历

最新主题

» 模拟沙堆生成的平衡问题
PFC2D学习笔记之颗粒生成 Empty周四 四月 17, 2014 11:00 pm 由 violinn

» 求助~询问。。PFC2D 求助ing
PFC2D学习笔记之颗粒生成 Empty周五 一月 10, 2014 8:26 pm 由 Ms.Yang

» 求助~询问。。PFC2D
PFC2D学习笔记之颗粒生成 Empty周五 一月 10, 2014 8:25 pm 由 Ms.Yang

» PFC是怎么用颗粒模拟岩体的
PFC2D学习笔记之颗粒生成 Empty周五 十一月 08, 2013 11:25 pm 由 求实engineer

» 希望大家踊跃发言,积极讨论PFC 技术与问题~
PFC2D学习笔记之颗粒生成 Empty周三 六月 19, 2013 9:14 pm 由 yuanyuekafu

» PFC2D学习笔记之流固耦合
PFC2D学习笔记之颗粒生成 Empty周二 四月 23, 2013 11:15 pm 由 yuanyuekafu

» PFC2D学习笔记之使用细则
PFC2D学习笔记之颗粒生成 Empty周二 四月 23, 2013 11:12 pm 由 yuanyuekafu

» PFC学习初期总结
PFC2D学习笔记之颗粒生成 Empty周二 四月 23, 2013 11:07 pm 由 yuanyuekafu

» PFC2D学习笔记之颗粒生成
PFC2D学习笔记之颗粒生成 Empty周二 十月 16, 2012 4:37 pm 由 黄亮岩土

合作伙伴

免费论坛

免費論壇

有谁在线?

总计有28位用户在线:: 0位注册用户, 0位隐身和 28位游客


[ 查看所有列表 ]


用户同时在线最高记录是37人在周五 九月 06, 2019 3:22 pm


2 posters

    PFC2D学习笔记之颗粒生成

    画之缘
    画之缘
    版主


    帖子数 : 43
    3 : 16704
    威望 : 1
    注册日期 : 09-10-03
    年龄 : 39
    地点 : 浙江省杭州市

    PFC2D学习笔记之颗粒生成 Empty PFC2D学习笔记之颗粒生成

    帖子  画之缘 周六 十月 03, 2009 7:56 pm

    使用命令BALL和GENERATE 可以生成颗粒。BALL命令只能单个生成的颗粒,且可
    以相互重叠;GENERATE 命令可以生成颗粒组,但自动生成的一组颗粒间没有重叠。
    生成的颗粒组有两种,一种是规则的排列,用于模拟结构部件,这种阵列的初始接触力
    可以精确的预测;另一种是不规则的排列,用于模拟实体或内部结构无序的粒状材料,要预
    估其初始接触力量值是不可能的。对于第二种颗粒组,尽管颗粒排列是任意的,但某些特性
    还是需要在颗粒生成后添加,比如弱面或各向异性强度等。
    规则排列
    通过用户自定义FISH 函数,在循环体内使用BALL命令生成。示例如下
    loop row (1,n_row)
    loop col (1,n_col)
    command
    ball id=idc x=xc y=yc rad=rc
    end_command
    idc = idc + 1
    xc = xc + r2
    end_loop
    yc = yc + yinc
    xc = x0 + radius * (row - (row/2) * 2)
    end_loop
    不规则排列
    一般,边界都是由墙定义好的,要在给定空间内生成颗粒,既要保证孔隙比符合要求,
    又要使组合达到平衡。显然,孔隙比不能任意的小。
    无法将圆颗粒在紧密堆积时将他们设置在任意紧密的区域(低孔隙比)。这里讨论两种方
    法来以给定的半径和孔隙比生成颗粒,这两种方法都是先固定边界,即半径扩大法和颗粒排
    斥法。还有一种方法是移动边界法,可以得到精确的孔隙比,但这种方法有三个缺点:边界
    条件改变了;达到平衡的时间很慢;最终分布很不均匀。
    半径扩大法和颗粒排斥法中,颗粒半径按照某种概率分布生成,如均匀分布或高斯分布,
    也可以通过FISH自定义其分布形式。
    BALL和GENERATE 的具体用法,参考《PFC2D 学习笔记之命令篇》。
    半径扩大法
    其基本FISH函数语句如下:
    mult = 1.6 ; initial radius multiplication factor
    n0 = 1.0 - (1.0 - poros) / multˆ2
    r0 = sqrt(height*width*(1.0 - n0)/(pi*num))
    rlo = 2.0 * r0 / (1.0 + rat)
    rhi = rat * rlo

    ... ...
    gen id=1,num rad=rlo,rhi x=0,width y=0,height
    prop dens=1000 ks=s_stiff kn=n_stiff
    ... ...
    sum = 0.0
    bp = ball_head
    loop while bp # null
    sum = sum + pi * b_rad(bp)ˆ2
    bp = b_next(bp)
    end_loop
    pmeas = 1.0 - sum / (width * height)
    mult = sqrt((1.0 - poros) / (1.0 - pmeas))
    ini rad mul mult
    cycle 1000
    prop fric 0.2
    cycle 2000
    注意,为了使颗粒组在比较快的时间内达到平衡,必须设置在CYCLE 前使用FRIC 设置摩擦系
    数,用于消散颗粒能量,但这种干预方式阻碍了颗粒的自由运动,对其最终组合状态有影响。因
    此,需要根据经验来设置FRIC 的大小,以在计算机时间和颗粒组合状态之间找到一个平衡。
    可以通过设置测量圆,来观察颗粒局部参数,并判断是否达到平衡状态。
    颗粒排斥法
    该方法在颗粒半径的上下限之间随即生成颗粒半径,并随即生成球心坐标,再FISH 函
    数的循环体中采用BALL命令不断创建颗粒,直至得到所要的孔隙比。BALL命令允许颗粒
    发生重叠,以至于当重叠部分比颗粒半径还大的时候,其初始速度很大,甚至有些颗粒会穿
    过边界墙体飞出。如果颗粒飞出墙体空间,则其孔隙比将发生变化,为了防止这种情况的发
    生,在刚开始的CYCLE 中,每隔几个时间步就把动能归零(通过设置平动和转动速度为零
    来实现),然后正常收敛到平衡状态。
    其核心程序如下:
    loop n (1,n_max)
    r_ball = rlo + urand * (rhi - rlo)
    pvol_new = pvol_sum + pi * r_ballˆ2
    if (1.0 - pvol_new / tot_vol) < poros then
    exit section ; (new porosity will be < that specified)
    end_if
    rb2 = r_ball * 2.0
    x_ball = r_ball + urand * (width - rb2)
    y_ball = r_ball + urand * (height - rb2)
    command
    ball x=x_ball y=y_ball rad=r_ball
    end_command
    pvol_sum = pvol_new

    count = count + 1
    end_loop
    ··· ···
    loop n (1,4)
    command
    cycle 5
    ini xvel 0 yvel 0
    end_command
    end_loop
    颗粒半径非均匀分布
    有时候,需要在空间的不同部分生成不同大小的颗粒。这时,可以用WALL 将空间区
    域分隔成多个区域,在每个区域按照单区域形式生成颗粒组(其方法即前面介绍的规则排列
    法和不规则排列法中的两种方法)。当每个区域都生成颗粒组并分别达到平衡后,使用命令
    DEL WALL ID 将隔墙删除。也可以不设隔墙,采用坐标控制颗粒的生成区域,但这种方法
    生成颗粒组后,若经过CYCLE 平衡后,颗粒将不能完全停留在各自的原始区域。
    其核心程序并无特别之处,参考前面介绍的颗粒生成方法。
    复杂形状区域内生成颗粒组
    有时,颗粒分布区的边界条件并非矩形或圆形区域,而是很复杂的,例如大区域内部
    有空洞,相交边界墙非正交,环形区域等。这种情况下就要通过几个步骤来实现颗粒组的生
    成。
    可以在适当的地方设置临时WALL,在GENERATE 命令中使用关键字NO_SHADOW
    来限制生成的颗粒不会出现在WALL的影子区。当生成完颗粒组以后,使用命令DELWALL
    ID 将临时WALL删除。
    另一种通用的方法是写一个FISH 函数作为生成过滤器,并调用GENERATE 命令的
    FILTER 关键字。FILTER 的用法参考《PFC2D 学习笔记之命令篇》。
    以矩形环区域为例,说明生成过滤器的核心程序:
    _brad = fc_arg(0)
    _bx = fc_arg(1)
    _by = fc_arg(2)
    _skip = 0
    ······
    if _rx < ff_r1 then
    if _ry < ff_r1 then
    _skip = 1
    end_if
    end_if
    ff_rect = _skip
    ······
    generate x=(@_xlo, @_xhi) y=(@_ylo, @_yhi) &

    rad=(0.09, 0.11) filter=ff_rect id=(1,250)
    创建复杂颗粒——颗粒簇
    可以将几个颗粒粘结在一起,形成颗粒簇,其行为用于模拟一个非均匀形态的颗粒。
    可以使用FISH 函数在给定空间中创建这种粘结性的颗粒簇。“爆炸—排斥”法(即前文所
    述的颗粒排斥法)可以用于将这种颗粒簇压缩到稳定排列形式;另一种方法是通过FISH 函
    数将这些颗粒簇放置在预定位置。颗粒簇在受到大于其粘结强度的外力时,形成颗粒簇的颗
    粒间的粘结会破坏,以致颗粒簇内部的颗粒会分离,这也常用来模拟颗粒的破碎行为。
    以ROCKFALL为例,说明其核心程序如下:
    问题的提出:在落石过程中,边坡堆积层的行为取决于许多因素,包括单元几何形状
    及其特性,粘聚性及其破坏等。该模拟可以用于研究陡立坡的稳定性、堆积层防护结构设计
    以及边坡不同滑动面组合。
    mcbp = ball_head ; local ball pointer storage
    b_max_id = max_bid
    mc_start_id = b_max_id + 1 ; start id for this group of clusters
    num_range = end_id-start_id+1 ; number of main particles involved
    num_done = 0 ; number of main particles completed
    section
    loop while mcbp # null ; this way we step thru balls once
    next_mcbp = b_next(mcbp) ; need to collect now before ball deleted
    if b_id(mcbp) >= start_id ; is current ball in required range?
    if b_id(mcbp) <= end_id
    b_max_id = b_max_id + 1 ; will be id for new main ball
    clust_start_id = b_max_id ; start id of cluster balls
    mb_id = b_id(mcbp) ; main ball id
    mb_rad = b_rad(mcbp) ; main ball radius
    mb_x = b_x(mcbp) ; main ball x coord
    mb_y = b_y(mcbp) ; main ball y coord
    command
    del ball range id mb_id mb_id ; make contiguous id range for cluster
    ball id clust_start_id x mb_x y mb_y rad mb_rad
    endcommand
    start_ang = urand * 2.0 * pi ; random orientation for cluster
    if cl_tight <= 0.0 ; governs overlap of cluster particles
    cl_tight = 1.0
    endif
    pc_rad = 2.0 * mb_rad * cl_tight
    if cl_balls >= 7 ; limit of 7 particles
    cl_balls = 7
    endif
    if cl_pack = 1
    inc_ang = 2.0 * pi / (float(cl_balls) - 1.0)
    else

    inc_ang = pi / 3.0
    endif
    loop j (1, cl_balls - 1)
    b_max_id = b_max_id + 1
    xx = pc_rad * cos(start_ang) + mb_x
    yy = pc_rad * sin(start_ang) + mb_y
    command
    ball id b_max_id x xx y yy rad mb_rad
    endcommand
    start_ang = start_ang + inc_ang
    endloop
    command
    range name temp id clust_start_id b_max_id
    prop pb_s cl_pbs pb_n cl_pbn range temp
    prop pb_kn cl_pbkn pb_ks cl_pbks pb_r cl_pbr range temp
    prop kn cl_kn ks cl_ks n_b cl_nb s_b cl_sb range temp
    prop fric cl_fric dens cl_dens range temp
    endcommand
    num_done = num_done + 1
    endif
    endif
    if num_done = num_range ; jump off the train
    exit section
    endif
    mcbp = next_mcbp
    endloop
    endsection
    mc_end_id = b_max_id ; last id for this collection
    ······
    loop i (1, cl_damp) ; ... while we let the cluster settle
    command ; down a bit (user sets iterations) ...
    cycle 10
    ini xvel 0 yvel 0
    endcommand
    endloop
    创建聚粒
    另一种形成非均匀形态颗粒的方法就是是使用聚粒。聚粒和颗粒簇的不同之处在于,形
    成聚粒的颗粒之间的粘结不会发生破坏,即整个聚粒可以看做一个超级颗粒。
    首先,在一个空间中生成指定孔隙比的圆颗粒组;然后每个颗粒转化成同体积同质量
    的聚粒;最后聚粒组逐步达到平衡。
    其核心程序就是,先分别生成某聚粒的各个组员,然后使用命令
    clumpclp= cl_add(null,_b1)

    ii = cl_add(clp,_b2)
    形成CLUMP,然后通过以下语句使聚粒组达到平衡状态:
    loop i (1,100)
    command
    cyc 5
    end_command
    clp = clump_head
    loop while clp # null
    cl_xvel(clp) = 0.0
    cl_yvel(clp) = 0.0
    cl_rvel(clp) = 0.0
    clp = cl_next(clp)
    end_loop
    end_loop
    优化
    为了不用搜索全部颗粒组就能探测到潜在接触,PFC2D将所有颗粒都纳入“细胞空间”。
    用户可以在数据文件的最开始就使用命令SET MAX_BALLS N,这个N 只是用户预期的颗
    粒数目,而不需要很精确;后面对MAX_BALL的重定义将被忽视。该数字N 有助于PFC2D
    确定最优细胞数。
    可以通过PRINT CELL 或PLOT CELL命令确定细胞数目。每个细胞中颗粒数以5 到
    20 个为宜,过多过少都会影响程序执行效率。
    关于CELL SPACE:
    PFC2D 中,每个物理实体,如球、墙、接触,都会用一个数据单元表示。该数据单元
    是C++语言中的动态数据结构,在列表内用指针将数据单元与数据结构连接。不再需要的数
    据单元会放入堆里,并且在需要新数据单元的时候,会在分配内存之前首先在堆里寻找废弃
    的数据单元再利用。连接表更新所需的计算时间很少,每次只需要添加或删除两三个整数而
    已,而不用重新排序。
    每个数据单元包括其所属实体的几何和物理数据,以及指向下一个相似单元(该单元
    可以在连接表的任何位置)的指针。每个BALL 单元包括指向它的接触列表的一个指针。
    每个接触单元包括一个指向该接触涉及的两个实体的指针。
    需要注意的是,每个实体连接图和搜索函数所需要的计算时间取决于实体的大小和形
    状,而不是系统中实体的个数。假定细胞面积和平均实体面积成比例,邻居探测多需要的总
    计算时间与实体数成比例。
    很难用一个公式来计算最优细胞大小。如果只用一个细胞,则整个搜索时间将是二次
    方。随着细胞数的增加,相邻实体间调用某实体的次数将减少。但是随着细胞数的继续增加,
    MAPING和SEARCHING所需要的时间可能会随之增加。PFC2D 使用一种试探性算法来确
    定最优细胞密度。如果在一个模型中哟大量颗粒,在生成颗粒之前使用命令SET
    MAX_BALLS 会有助于程序提高效率。
    每个实体的累积位移将被记录下来,当任何一个累积位移超过设定的CTOL 时,程序
    将对系统内的实体进行REMAPPING,并激活接触探测。接触探测将在比实体封装体增大
    的区域内进行搜索。如果任何实体运动超出了细胞空间的范围,则细胞空间将

    重新定义,将影响尺寸再增大10%,并且所有实体将重新MAP。
    CTOL的值也用来判断接触是重建还是删除。如果两个实体之间的间距小于等于CTOL,
    则重建接触,反之则删除接触。这种逻辑确保物理接触发生前就已经形成潜在接触的数据结
    构,并确保接触搜索只在运动实体间发生,而不会在相对活动很小的实体上浪费时间。因此,
    花费时间较长的接触探测并非每个力学步都要进行。
    avatar
    黄亮岩土


    帖子数 : 1
    3 : 13267
    威望 : 0
    注册日期 : 12-10-16

    PFC2D学习笔记之颗粒生成 Empty PFC2D模拟落石的程序

    帖子  黄亮岩土 周二 十月 16, 2012 4:37 pm

    这位大哥,毕业论文需要做落石模拟,下载的学习资料落石程序是错误的,你有没有比较完整的模板让我好好学习下,自己实在不是搞这得料子,求帮助。以前做flac时候有模板觉得比较简单

      目前的日期/时间是周日 十一月 24, 2024 11:57 pm