Refactoring itk::FEM framework - V4
From KitwarePublic
Revision as of 17:53, 4 July 2010 by Vmagnotta (talk | contribs) (→Add Support to Utilize itk::Mesh)
This page outlines the proposed changes to the itk::FEM framework. Feed back on these changes should be sent to Vincent Magnotta (vincent-magnotta - at- uiowa.edu). A number of these changes will break backwards compatibility.
Add Support for itk::Mesh
Currently the itk::fem framework offers a complicated interface for specifying mesh to be used for analysis. We will provide support to utilize the itk::Mesh object for specifying the FEM mesh. We also plan to provide interfaces to read/write VTK Unstructured grids as itk::Mesh.
Changes to the FEM Framework Classes
itk::Solver
- Move the following class variables from public to protected:
- node
- el
- load
- mat
- Add the following member functions:
- bool AddNextElement(ElementType *element) – Add the next element to the mesh data structure. This will be used to replace the solver->el.push_back()
- bool InsertElement(ElementType *element, unsigned long index) – Insert the element to the position within the mesh data structure.
- bool AddNextNode(NodeType *node) – Add the next node to the mesh data structure. This will be used to replace the solver->node.push_back()
- bool InsertNode(NodeType *node, unsigned long index) – Insert the node into the desired location within the mesh data structure.
- bool AddNextMaterial(itk::fem::FEMP<itk::fem::Material>) – Add the next material type to the solver.
- bool InsertMaterial(itk::fem::FEMP<itk::fem::Material>, int) – Insert the material property to the specified index in the solver material property array.
- bool AddNextLoad(itk::fem::FEMP<itk::fem::Load>) – Add the next load to the solver.
- bool InsertLoad(itk::fem::FEMP<itk::fem::Load>, int) – Insert the load to the specified index in the solver load array.
- bool GetElement(unsigned long index, ElementType *element) – Get the specified element from the mesh data structure
- bool GetNode(unsigned long index, NodeType *node) – Get the specified node from the mesh data structure
- bool GetMaterial(itk::fem::FEMP<itk::fem::Material>, int) – Get the specified material from the solver.
- bool GetLoad(itk::fem::FEMP<itk::fem::Load>, int) – Get the specified load from the solver.
- unsigned int GetNumberOfNodes() – Returns the number of nodes stored in the solver.
- unsigned int GetNumberOfElements()– Returns the number of element stored in the solver.
- unsigned int GetNumberOfMaterials()– Returns the number of materials stored in the solver.
- unsigned int GetNumberOfLoads() – Returns the number of loads stored in the solver
- bool ClearMaterialArray() – Insert the load to the specified index in the solver load array.
- bool ClearloadArray() – Insert the load to the specified index in the solver load array.
- bool RemoveMaterial(int) – Remove the material property at the specified index from the solver Material array.
- bool RemoveLoad(int) – Remove the load at the specified index from the solver load array.
- void SetMesh(itk::Mesh) – Specify the entire mesh to be used by the solver.
- itk::Mesh GetMesh() – Returns the mesh used by the solver.
- MeshType::Pointer GetDeformedMesh() – Returns the resulting mesh after applying the loading and boundary conditions on the mesh.
- itk::Array<double>::Pointer GetMeshStresses() – Returns the stresses for the mesh with each element of the array corresponding to an element in the mesh.
- itk::Array<double>::Pointer GetMeshStrains()– Returns the strains for the mesh with each element of the array corresponding to an element in the mesh.
itk::fem::Load
itk::fem::LightObject
- Move the following class variables from public to protected:
- GN
- Add public methods to get/set the class variables
- void SetGlobalNumber(int) – Set the global number for the FEM object. The default value is -1.
- int GetGlobalNumber() – Get the global number for the FEM object.
itk::fem::LoadBC
- Move the following class variables from public to protected:
- m_dof
- m_element
- m_value
- CLID
- The following class functions will be added, allowing the user to get and set the class variables:
- void SetDegreesOfFreedom(unsigned int dof) – Set the degrees of freedom for the local element for which the boundary condition is being applied.
- void SetElement(Element::ConstPointer element) – Set the element for which the boundary condition is being applied.
- void SetValue(vnl_vector< Element::Float > value) – Set the boundary condition using a vector representation. This can be used to restrict motion of an element in a particular direction.
- unsigned int GetDegreesOfFreedom() – Returns the local degrees of freedom for the element on which the boundary condition is being applied.
- Element::ConstPointer GetElement() – Returns the element on which the boundary condition is being applied.
- vnl_vector< Element::Float > GetValue() – Returns the assigned boundary condition.
itk::fem::LoadBCMFC
- Move the following member variables from public to protected:
- Index
- lhs
- rhs
- Add class methods to get and set the class variables.
- void SetIndex(int) – Set the index variable for the multi freedom displacement constraint. This is used internally by the itk::Fem::Solver.
- void AddLeftHandSideTerm(LoadBCMFC::MFCTerm) – Add terms to the right hand side of the multi freedom displacement constraint. Used to replace loadBCMFC.lhs.push_back().
- void AddRightHandSideTerm(vnl_vector< Element::Float >) – Set the right hand side of the linear equation that defines the constraints. Replaces loadBCMFC.rhs = a;
- int GetIndex – Get the index variable for the multi freedom displacement constraint.
- int GetNumberOfLeftHandSideTerms() – Returns the number of terms used to define the left hand side of the multi freedom displacement constraint.
- itk::LoadBFMC GetLeftHandSideTerm(int index) – Returns the specified left hand side term.
- int GetNumberOfRightHandSideTerms()– Returns the number of terms used to define the left hand side of the multi freedom displacement constraint.
- Element::Float GetRightHandSideTerm(int index) – Returns the specified right hand side term.
itk::fem::LoadEdge
- Move the following member variables from public to protected signatures:
- m_Edge
- m_Force
- Provide public interface to get/set class variables
- void SetEdge(int) – Set the edge to apply the desired force.
- void SetForce(vnl_matrix< Float >) – Set the force to be applied to an edge.
- int GetEdge() – Get the edge for the applied force.
- vnl_matrix< Float > GetForce() – Get the force applied.
itk::fem::LoadGravConst
- Move the following class variables from public to protected signatures.
- Fg_value
- Provide class methods to get/set the class variables
- void SetForce(vnl_vector< Float >) – Set the constant force vector that exists for every point in space.
- vnl_vector< Float > GetForce() – Return the constant force vector that exists for every point in space.
itk::fem::LoadLandmark
- Move the following class variables from public to protected signatures.
- eta
- m_force
- m_pt
- m_Solution
- m_Source
- m_Target
- Add the following public interface
- void SetEta(double) – Set the square root of the variance.
- double GetEta(double) – Get the square root of the variance.
itk::fem::LoadNode
- Move the following class variables from public to protected signatures:
- F
- m_element
- m_pt
- Add the following class member functions
- void SetForce(vnl_vector< Float >) – Set the applied force to the node.
- void SetElement(Element::ConstPointer) – Set the element in the system that contains the degrees of freedom on which the force is applied.
- void SetNode(unsigned int) – Set the point on which the force is being applied.
- vnl_vector< Float > &GetForce() – Get the applied force.
- Element::ConstPointer GetElement() – Get the element in the system that contains the degrees of freedom on which the force is applied.
- Unsigned int GetNode() – Get the point on which the force is being applied.
itk::fem::LoadPoint
- Move the following class variables from public to protected signatures:
- Fp
- point
- Add public class methods to access these variables:
- void SetForce(vnl_vector<Float>) – Set the force to be applied to the specified point location.
- void SetPoint(vnl_vector<Float>) – Set the point where the force is applied in global coordinates.
- vnl_vector<Float> & GetForce(vnl_vector<Float>) – Get the applied force.
- vnl_vector<Float> & GetPoint (vnl_vector<Float>) – Get the point where the force is applied.
itk::fem::MaterialLinearElasticity
- Move the following class variables from public to protected signatures:
- A
- E
- h
- I
- nu
- RhoC
- Add the following public class member functions to get/set the class variables.
- void SetCrossSectionalArea(double) – Set the cross sectional area (used to set variable A)
- void SetYoungsModulus(double) – Set the Youngs Modulus (used to set the variable E)
- void SetThickness(double) – Set the cross sectional thickness (used to set the variable h)
- void SetMomentOfInertia(double) – Set the Moment of Inertia (used to set the variable I)
- void SetPoissonsRatio(double) – Set the Poisson’s ratio (used to set the variable nu)
- void SetDensityHeatProduct(double) – Set the Density - Heat Capacity product (used to set the variable RhoC)
- double GetCrossSectionalArea() – Get the cross sectional area
- double GetYoungsModulus() – Get the Youngs Modulus
- double GetThickness() – Get the cross sectional thickness
- double GetMomentOfInertia() – Get the Moment of Inertia
- double GetPoissonsRatio() – Get the Poisson’s ratio
- double GetDensityHeatProduct() – Get the Density - Heat Capacity product
Update the itk::FEMRegistrationFilter
To make the FEMRegistrationFilter similar to the other registration filters the following changes will be made
- Remove these public member functions. The application programmer will be responsible for loading the images and setting the parameters for the filter. The configuration file will be removed.
- GetConfigFileName ()
- GetFixedFile ()
- GetMovingFile ()
- GetResultsFileName ()
- GetWriteDisplacements ()
- ReadConfigFile (const char *)
- SetConfigFileName (const char *f)
- SetDisplacementsFile (const char *r)
- SetFixedFile (const char *t)
- SetLandmarkFile (const char *l)
- SetMovingFile (const char *r)
- SetResultsFile (const char *r)
- SetResultsFileName (const char *f)
- WriteDisplacementField (unsigned int index)
- WriteDisplacementFieldMultiComponent ()
- WriteWarpedImage (const char *fn)
- Add these new public member functions
- bool AddNextMovingLandmark(PointType) – Add another point for the moving image to the registration.
- bool AddNextFixedLandmark(PointType) – Add another point from the fixed image to the registration.
- void ClearMovingLandmarks() – Remove all of the existing landmarks for the moving image.
- void ClearFixedLandmarks() – Remove all of the existing landmarks for the fixed image.
- bool InsertMovingLandmark(PointType p, int index) – Insert the moving landmark at the specified index.
- bool InsertFixedLandmark(PointType p, int index) – Insert the fixed landmark at the specified index.
- bool RemoveMovingLandmark(int index)
- bool RemoveFixedLandmark(int index)
- void SetFEMesh() – Set the mesh to be used for the registration.
- void GetFEMesh() – Get the mesh used in the registration.
- void SetUserDefinedMesh(bool) – Specifies if the user will provide a custom mesh or if it will be generated based on the image.