出现的问题
上一次的代码中,将用Newmark-β方法计算下一个时刻的位移和速度的代码放在DEFINE_CG_MOTION宏中,用单核计算时一切正常,但是多核并行计算时,每个时间步该宏被调用了不止一次,因此计算出现了紊乱。为了解决这个问题,将计算下一时刻位移速度的代码部分写到另一个宏DEFINE_EXECUTE_AT_END中,该宏会在每个时间步的最后执行,而DEFINE_CG_MOTION宏只负责将速度传给网格。
改进代码
#include "udf.h"
static real x_prev=0;
static real x_cur=0;
static real v_prev=0;
static real v_cur=0;
static real a_prev=0;
static real a_cur=0;
static double a[30000];
#define d_t 0.0005
DEFINE_EXECUTE_AT_END(execute_at_end)
{
real m, c, k;
real f_glob[ND_ND],m_glob[ND_ND],x_cg[ND_ND];
real time = RP_Get_Real("flow-time")