Orfeo Toolbox  3.16
Public Types | Public Member Functions | Public Attributes | Static Public Attributes | Protected Attributes | List of all members
itk::fem::SolverHyperbolic Class Reference

Solver class suitable for hyperbolic problems. More...

#include <itkFEMSolverHyperbolic.h>

+ Inheritance diagram for itk::fem::SolverHyperbolic:
+ Collaboration diagram for itk::fem::SolverHyperbolic:

Public Types

enum  {
  matrix_K =1,
  matrix_M =2,
  matrix_C =3,
  matrix_tmp =4
}
 
enum  {
  solution_d =0,
  solution_v =1,
  solution_a =2
}
 
enum  {
  vector_dhat =2,
  vector_vhat =3,
  vector_ahat =4,
  vector_tmp =5
}
 
typedef Element::ArrayType ElementArray
 
typedef Element::Float Float
 
typedef itk::Image
< Element::ConstPointer,
MaxGridDimensions
InterpolationGridType
 
typedef Load::ArrayType LoadArray
 
typedef Material::ArrayType MaterialArray
 
typedef Node::ArrayType NodeArray
 
typedef Element::VectorType VectorType
 

Public Member Functions

 SolverHyperbolic ()
 
void ApplyBC (int dim=0, unsigned int matrix=0)
 
virtual void AssembleElementMatrix (Element::Pointer e)
 
void AssembleF (int dim=0)
 
void AssembleK (void)
 
virtual void AssembleLandmarkContribution (Element::Pointer e, float)
 
virtual void Clear (void)
 
void DecomposeK (void)
 
virtual void FinalizeMatrixAfterAssembly (void)
 
void GenerateGFN (void)
 
Float GetDeformationEnergy (unsigned int SolutionIndex=0)
 
const ElementGetElementAtPoint (const VectorType &pt) const
 
const InterpolationGridTypeGetInterpolationGrid (void) const
 
LinearSystemWrapper::Pointer GetLinearSystemWrapper ()
 
unsigned int GetNumberOfDegreesOfFreedom (void)
 
Float GetSolution (unsigned int i, unsigned int which=0)
 
virtual Float GetTimeStep (void) const
 
void InitializeInterpolationGrid (const VectorType &size, const VectorType &bb1, const VectorType &bb2)
 
void InitializeInterpolationGrid (const VectorType &size)
 
virtual void InitializeLinearSystemWrapper (void)
 
virtual void InitializeMatrixForAssembly (unsigned int N)
 
void Read (std::istream &f)
 
void SetLinearSystemWrapper (LinearSystemWrapper::Pointer ls)
 
virtual void SetTimeStep (Float dt)
 
virtual void Solve (void)
 
void UpdateDisplacements (void)
 
void Write (std::ostream &f)
 

Public Attributes

ElementArray el
 
LoadArray load
 
Float m_beta
 
Float m_deltaT
 
Float m_gamma
 
MaterialArray mat
 
NodeArray node
 

Static Public Attributes

static const unsigned int MaxGridDimensions = 3
 

Protected Attributes

LinearSystemWrapper::Pointer m_ls
 
unsigned int NGFN
 
unsigned int NMFC
 

Detailed Description

Solver class suitable for hyperbolic problems.

M*ddu + C*du + K*u=F

Definition at line 33 of file itkFEMSolverHyperbolic.h.

Member Typedef Documentation

Array that holds pointers to all elements. since we want to be able to manipulate the array we have to use special pointers

Definition at line 54 of file itkFEMSolver.h.

Local float type

Definition at line 48 of file itkFEMSolver.h.

Type used to store interpolation grid

Definition at line 95 of file itkFEMSolver.h.

Array that holds special pointers to all external loads

Definition at line 66 of file itkFEMSolver.h.

Array that holds pointers to the materials

Definition at line 72 of file itkFEMSolver.h.

Array that holds special pointers to the nodes

Definition at line 60 of file itkFEMSolver.h.

VectorType from the Element base class

Definition at line 78 of file itkFEMSolver.h.

Member Enumeration Documentation

anonymous enum

Constants that specify, where matrices are strored.

Enumerator
matrix_K 
matrix_M 
matrix_C 
matrix_tmp 

Definition at line 75 of file itkFEMSolverHyperbolic.h.

anonymous enum

Constants that specify, where vectors are strored.

Enumerator
solution_d 
solution_v 
solution_a 

Definition at line 80 of file itkFEMSolverHyperbolic.h.

anonymous enum
Enumerator
vector_dhat 
vector_vhat 
vector_ahat 
vector_tmp 

Definition at line 81 of file itkFEMSolverHyperbolic.h.

Constructor & Destructor Documentation

itk::fem::SolverHyperbolic::SolverHyperbolic ( )

Default constructor

Definition at line 28 of file itkFEMSolverHyperbolic.cxx.

References InitializeLinearSystemWrapper(), m_beta, m_deltaT, and m_gamma.

Member Function Documentation

void itk::fem::Solver::ApplyBC ( int  dim = 0,
unsigned int  matrix = 0 
)
inherited

Apply the boundary conditions to the system.

Note
This function must be called after AssembleK().
Parameters
matrixIndex of a matrix, to which the BCs should be applied (master stiffness matrix). Normally this is zero, but in derived classes many matrices may be used and this index must be specified.
dimThis is a parameter that can be passed to the function and is normally used with isotropic elements to specify the dimension in which the DOF is fixed.

Apply the boundary conditions to the system.

Store a temporary pointer to load object for later, so that we don't have to access it via the iterator

Apply boundary conditions in form of MFC loads.

We add the multi freedom constraints contribution to the master stiffness matrix using the lagrange multipliers. Basically we only change the last couple of rows and columns in K.

Apply essential boundary conditions

Definition at line 643 of file itkFEMSolver.cxx.

References itk::fem::LinearSystemWrapper::AddVectorValue(), itk::fem::LinearSystemWrapper::DestroyVector(), itk::fem::LinearSystemWrapper::GetColumnsOfNonZeroMatrixElementsInRow(), itk::fem::LinearSystemWrapper::GetMatrixValue(), itk::fem::LinearSystemWrapper::InitializeVector(), itk::fem::LinearSystemWrapper::IsVectorInitialized(), itk::fem::Solver::load, itk::fem::Solver::m_ls, itk::fem::Solver::NGFN, and itk::fem::LinearSystemWrapper::SetMatrixValue().

Referenced by itk::fem::SolverCrankNicolson::AssembleKandM(), and itk::fem::Solver::FinalizeMatrixAfterAssembly().

void itk::fem::SolverHyperbolic::AssembleElementMatrix ( Element::Pointer  e)
virtual

When assembling the element matrix into master matrix, we need to assemble the mass matrix too.

Here we finaly update the corresponding element in the master stiffness matrix. We first check if element in Ke is zero, to prevent zeros from being allocated in sparse matrix.

Reimplemented from itk::fem::Solver.

Definition at line 49 of file itkFEMSolverHyperbolic.cxx.

References itk::fem::Element::GetDegreeOfFreedom(), itk::fem::Element::GetMassMatrix(), itk::fem::Element::GetNumberOfDegreesOfFreedom(), and itk::fem::Element::GetStiffnessMatrix().

void itk::fem::Solver::AssembleF ( int  dim = 0)
inherited

Assemble the master force vector.

Parameters
dimThis is a parameter that can be passed to the function and is normally used with isotropic elements to specify the dimension for which the master force vector should be assembled.

Assemble the master force vector

Convert the external loads to the nodal loads and add them to the master force vector F.

Store a temporary pointer to load object for later, so that we don't have to access it via the iterator

Pass the vector to the solution to the Load object.

Here we only handle Nodal loads

If using the extra dim parameter, we can apply the force to different isotropic dimension.

FIXME: We assume that the implementation of force vector inside the LoadNode class is correct for given number of dimensions

Element loads...

If array of element pointers is not empty, we apply the load to all elements in that array

If the list of element pointers in load object is empty, we apply the load to all elements in a system.

Handle boundary conditions in form of MFC loads are handled next.

Handle essential boundary conditions.

If we got here, we were unable to handle that class of Load object. We do nothing...

Adjust the master force vector for essential boundary conditions as required.

Definition at line 389 of file itkFEMSolver.cxx.

References itk::fem::LinearSystemWrapper::AddVectorValue(), itk::fem::Solver::el, itk::fem::Element::GetDegreeOfFreedom(), itk::fem::Element::GetLoadVector(), itk::fem::Element::GetNumberOfDegreesOfFreedom(), itk::fem::LinearSystemWrapper::GetVectorValue(), itk::fem::LinearSystemWrapper::InitializeVector(), itk::fem::LinearSystemWrapper::IsVectorInitialized(), itk::fem::Solver::load, itk::fem::Solver::m_ls, itk::fem::Solver::NGFN, itk::fem::Solver::NMFC, and itk::fem::LinearSystemWrapper::SetVectorValue().

Referenced by itk::fem::SolverCrankNicolson::AssembleFforTimeStep(), and itk::fem::FEMRegistrationFilter< TMovingImage, TFixedImage >::IterativeSolve().

void itk::fem::Solver::AssembleK ( void  )
inherited

Assemble the master stiffness matrix (also apply the MFCs to K)

Before we can start the assembly procedure, we need to know, how many boundary conditions if form of MFCs are there in a system.

Now we can assemble the master stiffness matrix from element stiffness matrices.

Since we're using the Lagrange multiplier method to apply the MFC, each constraint adds a new global DOF.

Step over all elements

Step over all the loads again to add the landmark contributions to the appropriate place in the stiffness matrix

Definition at line 241 of file itkFEMSolver.cxx.

References itk::fem::Solver::AssembleElementMatrix(), itk::fem::Solver::AssembleLandmarkContribution(), itk::fem::Solver::el, itk::fem::Solver::FinalizeMatrixAfterAssembly(), itk::fem::Solver::InitializeMatrixForAssembly(), itk::fem::Solver::load, itk::fem::Solver::NGFN, and itk::fem::Solver::NMFC.

Referenced by itk::fem::FEMRegistrationFilter< TMovingImage, TFixedImage >::MultiResSolve(), and itk::fem::FEMRegistrationFilter< TMovingImage, TFixedImage >::RunRegistration().

void itk::fem::Solver::AssembleLandmarkContribution ( Element::Pointer  e,
float  eta 
)
virtualinherited

Add the contribution of the landmark-containing elements to the correct position in the master stiffess matrix. Since more complex Solver classes may need to assemble many matrices and may also do some funky stuff to them, this function is virtual and can be overriden in a derived solver class.

Here we finaly update the corresponding element in the master stiffness matrix. We first check if element in Le is zero, to prevent zeros from being allocated in sparse matrix.

Definition at line 311 of file itkFEMSolver.cxx.

References itk::fem::LinearSystemWrapper::AddMatrixValue(), itk::fem::Element::GetDegreeOfFreedom(), itk::fem::Element::GetLandmarkContributionMatrix(), itk::fem::Element::GetNumberOfDegreesOfFreedom(), itk::fem::Solver::m_ls, and itk::fem::Solver::NGFN.

Referenced by itk::fem::Solver::AssembleK().

void itk::fem::Solver::Clear ( void  )
virtualinherited
void itk::fem::Solver::DecomposeK ( void  )
inherited

Decompose matrix using svd, qr, whatever ...

Decompose matrix using svd, qr, whatever ... if needed

Definition at line 586 of file itkFEMSolver.cxx.

void itk::fem::SolverHyperbolic::FinalizeMatrixAfterAssembly ( void  )
virtual

Combines the M, C and K matrices into one big system of linear equations.

Reimplemented from itk::fem::Solver.

Definition at line 111 of file itkFEMSolverHyperbolic.cxx.

void itk::fem::Solver::GenerateGFN ( void  )
inherited

System solver functions. Call all six functions below (in listed order) to solve system. Assign a global freedom numbers to each DOF in a system. This must be done before any other solve function can be called.

Assign a global freedom number to each DOF in a system.

Assign new ID to every DOF in a system

Definition at line 186 of file itkFEMSolver.cxx.

References itk::fem::Solver::el, itk::fem::Element::InvalidDegreeOfFreedomID, itk::fem::Solver::NGFN, and itk::fem::Solver::node.

Referenced by itk::fem::FEMRegistrationFilter< TMovingImage, TFixedImage >::CreateMesh().

Solver::Float itk::fem::Solver::GetDeformationEnergy ( unsigned int  SolutionIndex = 0)
inherited

Get the total deformation energy using the chosen solution

Definition at line 620 of file itkFEMSolver.cxx.

References itk::fem::Solver::el, itk::fem::Solution::GetSolutionValue(), and itk::fem::Solver::m_ls.

const Element * itk::fem::Solver::GetElementAtPoint ( const VectorType pt) const
inherited

Returns the pointer to the element which contains global point pt.

Parameters
ptPoint in global coordinate system.
Note
Interpolation grid must be initializes before you can call this function.

Definition at line 883 of file itkFEMSolver.cxx.

References itk::fem::Solver::m_InterpolationGrid, and itk::fem::Solver::MaxGridDimensions.

Referenced by itk::fem::FEMRegistrationFilter< TMovingImage, TFixedImage >::InterpolateVectorField().

const InterpolationGridType* itk::fem::Solver::GetInterpolationGrid ( void  ) const
inlineinherited

Returns pointer to interpolation grid, which is an itk::Image of pointers to Element objects. Normally you would use physical coordinates to get specific points (pointers to elements) from the image. You can then use the Elemenet::InterpolateSolution member function on the returned element to obtain the solution at this point.

Note
Physical coordinates in an image correspond to the global coordinate system in which the mesh (nodes) are.

Definition at line 131 of file itkFEMSolver.h.

References itk::SmartPointer< TObjectType >::GetPointer(), and itk::fem::Solver::m_InterpolationGrid.

LinearSystemWrapper::Pointer itk::fem::Solver::GetLinearSystemWrapper ( )
inlineinherited
unsigned int itk::fem::Solver::GetNumberOfDegreesOfFreedom ( void  )
inlineinherited
Float itk::fem::Solver::GetSolution ( unsigned int  i,
unsigned int  which = 0 
)
inlineinherited
virtual Float itk::fem::SolverHyperbolic::GetTimeStep ( void  ) const
inlinevirtual

Returns the time step used for dynamic problems.

Reimplemented from itk::fem::Solver.

Definition at line 69 of file itkFEMSolverHyperbolic.h.

References m_deltaT.

void itk::fem::Solver::InitializeInterpolationGrid ( const VectorType size,
const VectorType bb1,
const VectorType bb2 
)
inherited

Initialize the interpolation grid. The interpolation grid is used to find elements that containg specific points in a mesh. The interpolation grid stores pointers to elements for each point on a grid thereby providing a fast way (lookup table) to perform interpolation of results.

Note
Interpolation grid must be reinitialized each time a mesh changes.
Parameters
sizeVector that represents number of points on a grid in each dimension.
bb1Lower limit of a bounding box of a grid.
bb2Upper limit of a bounding box of a grid.
See Also
GetInterpolationGrid

Initialize the interpolation grid

Definition at line 758 of file itkFEMSolver.cxx.

References itk::fem::Solver::el, itk::ImageConstIterator< TImage >::GetIndex(), itk::ImageRegionConstIterator< TImage >::GoToBegin(), itk::ImageConstIterator< TImage >::IsAtEnd(), itk::fem::Solver::m_InterpolationGrid, itk::fem::Solver::MaxGridDimensions, itk::Image< TPixel, VImageDimension >::New(), and itk::ImageRegionIterator< TImage >::Set().

Referenced by itk::fem::FEMRegistrationFilter< TMovingImage, TFixedImage >::CreateMesh(), and itk::fem::Solver::InitializeInterpolationGrid().

void itk::fem::Solver::InitializeInterpolationGrid ( const VectorType size)
inlineinherited

Same as InitializeInterpolationGrid(size, {0,0...}, size);

Definition at line 116 of file itkFEMSolver.h.

References itk::fem::Solver::InitializeInterpolationGrid().

void itk::fem::SolverHyperbolic::InitializeLinearSystemWrapper ( void  )
virtual

Initialize the linear system wrapper.

Reimplemented from itk::fem::Solver.

Definition at line 38 of file itkFEMSolverHyperbolic.cxx.

Referenced by SolverHyperbolic().

void itk::fem::SolverHyperbolic::InitializeMatrixForAssembly ( unsigned int  N)
virtual

Initializes the storasge for all master matrices.

Reimplemented from itk::fem::Solver.

Definition at line 96 of file itkFEMSolverHyperbolic.cxx.

void itk::fem::Solver::Read ( std::istream &  f)
inherited

Reads the whole system (nodes, materials and elements) from input stream

If CreateFromStream returned 0, we're ok. That was the signal for the end of stream. Just continue reading... and consequently exit the do loop.

Find out what kind of object did we read from stream and store it in the appropriate array

If we got here, something strange was in the file...

Definition at line 84 of file itkFEMSolver.cxx.

References itk::fem::FEMLightObject::CreateFromStream(), itk::fem::Solver::el, itk::fem::Solver::load, itk::fem::Solver::mat, and itk::fem::Solver::node.

Referenced by itk::fem::FEMRegistrationFilter< TMovingImage, TFixedImage >::ApplyLoads(), and itk::fem::FEMRegistrationFilter< TMovingImage, TFixedImage >::CreateMesh().

void itk::fem::Solver::SetLinearSystemWrapper ( LinearSystemWrapper::Pointer  ls)
inherited

Sets the LinearSystemWrapper object that will be used when solving the master equation. If this function is not called, a default VNL linear system representation will be used (class LinearSystemWrapperVNL).

Parameters
lsPointer to an object of class which is derived from LinearSystemWrapper.
Note
Once the LinearSystemWrapper object is changed, it is used until the member function SetLinearSystemWrapper is called again. Since LinearSystemWrapper object was created outside the Solver class, it should also be destroyed outside. Solver class will not destroy it when the Solver object is destroyed.

Change the LinearSystemWrapper object used to solve system of equations.

Definition at line 64 of file itkFEMSolver.cxx.

References itk::fem::Solver::InitializeLinearSystemWrapper(), and itk::fem::Solver::m_ls.

Referenced by itk::fem::Solver::Clear(), itk::fem::FEMRegistrationFilter< TMovingImage, TFixedImage >::MultiResSolve(), itk::fem::FEMRegistrationFilter< TMovingImage, TFixedImage >::RunRegistration(), and itk::fem::Solver::Solver().

virtual void itk::fem::SolverHyperbolic::SetTimeStep ( Float  )
inlinevirtual

Sets the time step used for dynamic problems.

Parameters
dtNew time step.

Reimplemented from itk::fem::Solver.

Definition at line 70 of file itkFEMSolverHyperbolic.h.

References m_deltaT.

void itk::fem::SolverHyperbolic::Solve ( void  )
virtual

Solves the system for the next time step.

Reimplemented from itk::fem::Solver.

Definition at line 151 of file itkFEMSolverHyperbolic.cxx.

void itk::fem::Solver::UpdateDisplacements ( void  )
inherited

Copy solution vector u to the corresponding nodal values, which are stored in node objects). This is standard post processing of the solution

Copy solution vector u to the corresponding nodal values, which are stored in node objects). This is standard post processing of the solution.

Definition at line 616 of file itkFEMSolver.cxx.

void itk::fem::Solver::Write ( std::ostream &  f)
inherited

Writes everything (nodes, materials and elements) to output stream

Definition at line 155 of file itkFEMSolver.cxx.

References itk::fem::Solver::el, itk::fem::Solver::load, itk::fem::Solver::mat, and itk::fem::Solver::node.

Member Data Documentation

ElementArray itk::fem::Solver::el
inherited
LoadArray itk::fem::Solver::load
inherited
Float itk::fem::SolverHyperbolic::m_beta

Definition at line 84 of file itkFEMSolverHyperbolic.h.

Referenced by SolverHyperbolic().

Float itk::fem::SolverHyperbolic::m_deltaT

Definition at line 85 of file itkFEMSolverHyperbolic.h.

Referenced by GetTimeStep(), SetTimeStep(), and SolverHyperbolic().

Float itk::fem::SolverHyperbolic::m_gamma

Definition at line 83 of file itkFEMSolverHyperbolic.h.

Referenced by SolverHyperbolic().

LinearSystemWrapper::Pointer itk::fem::Solver::m_ls
protectedinherited
MaterialArray itk::fem::Solver::mat
inherited
const unsigned int itk::fem::Solver::MaxGridDimensions = 3
staticinherited

Since the itk::Image is templated over the number of dimensions, we have to know this at compile time. Solver class, however, can handle elements in any number of dimensions. In order to be able to use the Image, we choose the maximum number of space dimension that this function will be able to handle. Any unused dimensions are filled with zero.

For example: If a 2D node coordinates are {1.0,3.0} then the corresponding phisycal point in an image is {1.0,3.0,0.0};

Definition at line 90 of file itkFEMSolver.h.

Referenced by itk::fem::Solver::GetElementAtPoint(), and itk::fem::Solver::InitializeInterpolationGrid().

unsigned int itk::fem::Solver::NGFN
protectedinherited
unsigned int itk::fem::Solver::NMFC
protectedinherited

Number of multi freedom constraints in a system. This member is set in a AssembleK function.

Definition at line 328 of file itkFEMSolver.h.

Referenced by itk::fem::Solver::AssembleF(), itk::fem::Solver::AssembleK(), itk::fem::SolverCrankNicolson::AssembleKandM(), itk::fem::Solver::Clear(), and itk::fem::SolverCrankNicolson::InitializeForSolution().

NodeArray itk::fem::Solver::node
inherited

The documentation for this class was generated from the following files:

Generated at Sun May 19 2013 03:03:11 for Orfeo Toolbox with doxygen 1.8.3.1