Functions | |
| template<typename matrix_type , typename vector_type > | |
| void | compute_diagonal (matrix_type const &J, matrix_type const &WJT, vector_type &d) |
| template<typename matrix_type , typename vector_type > | |
| void | compute_f (matrix_type const &WJT, vector_type const &x, vector_type &f) |
| template<typename matrix_type > | |
| void | compute_WJT (matrix_type const &W, matrix_type const &J, matrix_type &WJT) |
| template<typename matrix_type , typename size_type , typename real_type , typename vector_type > | |
| void | update_f (matrix_type const &WJT, size_type const &i, real_type const &dx, vector_type &f) |
| void OpenTissue::mbd::math::compute_diagonal | ( | matrix_type const & | J, | |
| matrix_type const & | WJT, | |||
| vector_type & | d | |||
| ) |
Compute the diagonal of A. That is we compute the diagonal of
noalias(A) = prod( J, matrix_type( prod( W, trans(J) ) ) )
Exploiting that we already have pre-computed the term prod( W, trans(J) ).
| J | The jacobian matrix. | |
| WJT | The value of prod(W,trans(J)), where W is the inverted mass matrix. This argument is assumed to be stored as prod(J,W) = trans( prod( W, trans(J) ) ). | |
| d | Upon return this vector contain the values of the diagonal of A. That is d(i) = A(i,i). |
| void OpenTissue::mbd::math::compute_f | ( | matrix_type const & | WJT, | |
| vector_type const & | x, | |||
| vector_type & | f | |||
| ) |
Compute f-vector. The f-vector is defined as
f = prod( prod(W, trans(J) ), x)
We can write x as
e_1 x_1 + ... +e_i x_i + ... + e_n x_n
So f becomes
f = W J^T ( sum_i^n e_i x_i)
From this we see that we can compute f by invoking update_f n-times.
| WJT | The value of prod(W, trans(J)) stored as prod(J,W). | |
| x | ||
| f |
| void OpenTissue::mbd::math::compute_WJT | ( | matrix_type const & | W, | |
| matrix_type const & | J, | |||
| matrix_type & | WJT | |||
| ) |
Multiply inverse mass matrix by transposed jacobian.
| W | The inverse mass matrix. | |
| J | The jacobian matrix. | |
| WJT | Upon return this argument holds the value of prod(W,trans(J)), where W is the inverted mass matrix. This argument is assumed to be stored as prod(J,W) = trans( prod( W, trans(J) ) ). |
| void OpenTissue::mbd::math::update_f | ( | matrix_type const & | WJT, | |
| size_type const & | i, | |||
| real_type const & | dx, | |||
| vector_type & | f | |||
| ) |
Update f-vector. Let
f = W J^T x
Compute new f-value, f', when x_i = x_i + dx, that is
f' = W J^T (x + e_i dx)
where e_i is the i'th euclidean basis vector. Now
f' = f + W J^T ( e_i dx) f' = f + column_i(W J^T) dx f' = f + row_i(J W) dx
The last equation is used to update the f-vector to its new value.
| WJT | The value of prod(W, trans(J)) stored as prod(J,W). | |
| i | ||
| dx | ||
| f |
1.7.1