2016-05-10 6 views
-1

私はFEMソルバーであるFenics with pythonで作業します。しかし、Pythonはラッパーであり、メインプログラムはC++で作られているので、最近私は後者に切り替えました。私は次の式(コードと式の両方)を使ってデモを見つけました。私は何が書かれているのか理解できず、なぜこのように書くのでしょうか?これは、私が使用しているFEMプラットフォームに特有のものですか?これをC++の知識の欠如に関連する問題として考える代わりに、その方向性を調べるべきですか?これはC++でこの式を書く正しい方法ですか?

加速度更新が式によって定義されるステッピング方式が実施されているニューマークベータ時間:

= 1 /(2 *ベータ)*((U - U0 - V0の*のDT)/(0.5 * DT * DT) - (1-2 *ベータ版)* A0)

としてのC++コードで表現されています

一般的にあなたがするようにコードとデータを整理するために探している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

タイプ(class/struct) 'Function'を見てください。これはおそらく、オーバーロードされた 'operator *'型を返すメンバ関数 'vector'や、' * 'が適用されるときにあなたのコードに示される算術式と代入式をサポートする別の型をもたらすポインタを持っています。 – Pixelchemist

+0

何をしているのかわからずにコードを見ると、 'Function'型のオブジェクトは実際に何らかの形で数学的なベクトルになり、' a.vector() 'はベクトルを取得し、演算子のオーバーロードを使ってあなたの表現。したがって、 ' - = u0.vector()'はそれぞれの位置で 'u0'を減算します。これの利点は、自動的に操作を並列化/「ベクトル化」することでしょうか?あるいは、彼らはこのようにもっと明確に感じます。 –

答えて

2

それはエレガント(最初)と演技(2番目はエレガンスから続くので)。

これは良いかもしれない:

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; 
} 

ご希望の場合は、関数オブジェクトの面でこれを表現することができます...

struct Function 
{ 
    auto vector() -> double* { return std::addressof(_v); } 
    auto vector() const -> const double* { return std::addressof(_v); } 
    double _v = 0.0; 
}; 

// 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() = update_a(*u.vector(), *a0.vector(), *v0.vector(), *u0.vector(), 
         beta, dt); 
} 
+0

これはうまくいっています。それらのすべての "楽しい"機能の種類を抽象化して良い仕事。また、OPの元の試行での数学エラーを修正します。 –

関連する問題