Files
bullet3/Demos3/FiniteElementMethod/OpenTissue/dynamics/fem/fem_dynamics_assembly.h
erwin coumans 4b665fa82b add btFileUtils::toLower to convert a string (char*) to lower case
URDF import demo: add COLLADA .dae file support
add FiniteElementMethod demo, extracted from the OpenTissue library (under the zlib license)
don't crash if loading an invalid STL file
add comparison with Assimp for COLLADA file loading (disabled by default, to avoid library dependency)
Gwen: disable some flags that make the build incompatible
2014-10-29 13:18:34 -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