5.2. 建模流程

5.2.1. 载入求解器

在使用GUI界面程序是,需要指定显示指定求解器模块(见高亮代码行)。

1gui = True
2sim = None
3if gui:
4    app.core.setAnalysisType(AnalysisType="CUDEM")
5    sim=app.core.sim
6else:
7    sim = DEMSim()

SudoSim 目前提供的求解器( AnalysisType )主要有:

  • “CUDEM”

  • “RTDEM”

  • “GODEM”

  • “MPM”

  • “MPMDEM”

  • “ProxySim”

注意

ProxySim 是一个用于远程模拟的代理模拟器,不需要用户指定,但在远程模拟时,本地客户端求解器会显示 ProxySim

5.2.2. 设定几何

设定几何包括模拟区域大小(如CUDEM需要设定 domain 、MPM需要设定背景网格大小等)、颗粒、物质点、墙等。具体设定相见各个模块教程。

5.2.3. 设定材料

针对上述的几何对象赋上材料属性。

5.2.4. 设置辅助函数

编写Python函数,用以辅助建模。比如,通过简单的Python函数即可快速批量指定颗粒的位置、大小、方向等。此外,亦可以构建用于钩子程序的Python函数。

  • 设置辅助函数 HookFunc ,该辅助函数用于记录运行时间,可以在模拟计算中自动调用。

1import time
2elapsedTime = []
3def HookFunc(elapsedTime):
4    t = time.time()
5    if len(elapsedTime) > 0:
6        elapsedTime.append(t-elapsedTime[0])
7        app.print(t-elapsedTime[0])
8    else:
9        elapsedTime.append(t)

注意

需要注意的是,在GUI中,如果需要实时打印数据,不能直接调用Python的 print 函数,而是采用我们提供的线程安全函数 app.print (见高亮行)。

  • 设置钩子程序,并加到模拟中

1pyhook1 = PyHook()
2# 指定该钩子程序需要执行的Python函数
3pyhook1.command = 'HookFunc(elapsedTime)'
4# 设置每隔800步执行一次,总共执行100次
5pyhook1.reset(iterPeriod = 800, totalRuns = 100)
6# 让该钩子程序处于执行状态
7pyhook1.dead = False
8# 添加该钩子到模拟中
9sim.hooks = [pyhook1]
  • 实时绘制曲线图

 1#添加绘图仪
 2app.addPlot(name='Stress',labels=['No Bonds'],xlabel='Axial Strain', ylabel='Axial Stress')
 3#添加Python钩子函数
 4ss_st = []
 5def HookFunc(ss_st):
 6    #global ss_st
 7    fyy = sim.getShapeReactForce(3, 1)
 8    styy = sim.iter()*sim.dt
 9    ss_st.append([styy, fyy])
10    drawdata = np.array(ss_st)
11    app.plot(drawdata[1:,0], drawdata[1:,1]/1000., name = 'Stress')

5.2.5. 初始化模型

目前,SudoSim 的设计是需要用户手动调用初始化模型函数完成该函数之前的所有建模设置。不同模块有不同的初始化函数(后续会统一):

  • CUDEM

1# 最后执行创建颗粒完成初始化
2sim.createParticles(pos,rs)
  • RTDEM

1# 直接调用初始化函数完成初始化
2sim.init()
  • MPM

1# 直接调用预分析函数完成初始化
2sim.PreAnalysis()

5.2.6. 执行计算

GUI中提供了统一的线程安全运行函数:

1app.run(100) #运行100步

亦可以采用模块的运行函数:

1sim.run(100) #运行100步
2# 或者
3sim.RunPthread(100) #运行100步

注意

sim.RunPthreadapp.run 是相同的,而 sim.run 可能会造成GUI僵死。