我在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;
}
答案 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;
}