Files
bullet3/Demos3/FiniteElementMethod/OpenTissue/dynamics/fem/fem_dynamics_assembly.h
2014-10-29 13:56:32 -07:00

105 lines
2.9 KiB
C++

#ifndef OPENTISSUE_DYNAMICS_FEM_FEM_DYNAMICS_ASSEMBLY_H
#define OPENTISSUE_DYNAMICS_FEM_FEM_DYNAMICS_ASSEMBLY_H
//
// OpenTissue Template Library
// - A generic toolbox for physics-based modeling and simulation.
// Copyright (C) 2008 Department of Computer Science, University of Copenhagen.
//
// OTTL is licensed under zlib: http://opensource.org/licenses/zlib-license.php
//
#include <OpenTissue/configuration.h>
#define n_i (&mesh.m_nodes[n])
#define n_j (&mesh.m_nodes[j])
namespace OpenTissue
{
namespace fem
{
namespace detail
{
/**
* Setup dynamic equation.
* This is the equation of motion given as:
*
*
* A v^{i+1} = b
*
*
* where
*
* A = M + \delta t C + \delta t^2 K
* b = M v^i - \delta t (K x^i + f_0 + f_plas - f_ext)
*
* In this implementation, the following holds:
*
* M is a diagonal matrix with diagonal elements given by m_mass.
* C is a diagonal matrix given by massCoef*M, which is Raleigh damping with stiffness coefficient zero.
*
* Also plastic forces, f_plas, is ignored.
*
* @param dt The time step, \delta t, which is about to be taken.
* @param mass_damping Coefficient for mass damping in the Raleigh damping equation.
* The coefficient \alpha in C = \alpha M + \beta K. In this implementation \beta = 0.
*
*
*
*
*/
template < typename fem_mesh, typename real_type >
inline void dynamics_assembly(
fem_mesh & mesh,
real_type const & mass_damping,
real_type const & dt
)
{
typedef typename fem_mesh::vector3_type vector3_type;
typedef typename fem_mesh::matrix3x3_type matrix3x3_type;
typedef typename fem_mesh::node_type::matrix_iterator matrix_iterator;
for (int n = 0;n<mesh.m_nodes.size();n++)
{
//fem_mesh::node_type& ni = mesh.m_nodes[n];
//if (ni.m_mass)
{
unsigned int i = n_i->idx();
vector3_type & b_i = n_i->m_b;
real_type & m_i = n_i->m_mass;
b_i.clear();
matrix_iterator Kbegin = n_i->Kbegin();
matrix_iterator Kend = n_i->Kend();
for (matrix_iterator K = Kbegin; K != Kend;++K)
{
unsigned int j = K->first;
matrix3x3_type & K_ij = K->second;
vector3_type & x_j = n_j->m_coord;
matrix3x3_type & A_ij = n_i->A(j);
A_ij = K_ij * (dt*dt);
b_i -= K_ij * x_j;
if (i == j)
{
real_type c_i = mass_damping*m_i;
real_type tmp = m_i + dt*c_i;
A_ij(0,0) += tmp; A_ij(1,1) += tmp; A_ij(2,2) += tmp;
}
}
b_i -= n_i->m_f0;
b_i += n_i->m_f_external;
b_i *= dt;
b_i += n_i->m_velocity * m_i;
}
}
}
} // namespace detail
} // namespace fem
} // namespace OpenTissue
//OPENTISSUE_DYNAMICS_FEM_FEM_DYNAMICS_ASSEMBLY_H
#endif