这是在C ++中编写此表达式的正确方法吗?

时间:2016-05-10 17:54:10

标签: c++

我在python上使用FEM求解器Fenics。但是,由于python是一个包装器,而主程序是用c ++编写的,我最近切换到了后者。我遇到了一个带有以下表达式的演示(代码和表达式如下所示)。我无法理解所写的内容以及他们为什么会这样写。这是我正在使用的FEM平台特有的东西,我是否应该朝这个方向看,而不是将其视为与C ++缺乏知识相关的问题。

正在实施Newmark beta时间步进方案,其中加速度更新由表达式

定义

a = 1 /(2 * beta)*((u - u0 - v0 * dt)/(0.5 * dt * dt) - (1-2 * beta)* a0)

用c ++代码表示为:

// Acceleration update
void update_a(Function& a, const Function& u, const Function& a0,
              const Function& v0,  const Function& u0,
              double beta, double dt)
{
  *a.vector()  = *u.vector();
  *a.vector() -= *u0.vector();
  *a.vector() *= 1.0/dt;
  *a.vector() -= *v0.vector();
  *a.vector() *= 1.0/((0.5-beta)*dt);
  *a.vector() -= *a0.vector();
  *a.vector() *= (0.5-beta)/beta;
}

1 个答案:

答案 0 :(得分:2)

在c ++中,你通常希望整理你的代码和数据,使其优雅(第一)和高效(第二,因为这将遵循优雅)。

这可能会更好:

class A
{
public:
    A( int k );
};

class B
{
public:
    B();
    A a(1);    //this show me "error: expected identifier before numeric constant"
};

如果您愿意,可以根据Function对象表达这一点......

double update_a(double u, double a0,
              double v0,  double u0,
              double beta, double dt)

// a = 1/(2*beta)*((u - u0 - v0*dt)/(0.5*dt*dt) - (1-2*beta)*a0)
{
  auto half_term = 1.0 / (2.0 * beta);
  auto v_increase_term = (u - u0 - v0 * dt) / (0.5 * dt * dt);
  auto drag_term = (1.0 - 2.0 * beta) * a0;

  return half_term * (v_increase_term - drag_term);

  /* or if you prefer...

  return (1.0 / (2.0 * beta))
    * ((u - u0 - v0 * dt) / (0.5 * dt * dt)
       - (1.0 - 2.0 * beta) * a0);
   */
}

// Velocity update
auto update_v(double a, double a0,
              double v0, double gamma, double dt)
{
  return dt * ((1.0 - gamma) * a0 + gamma * a) + v0;
}