ITK FEM Modifications
From KitwarePublic
Jump to navigationJump to search
This page describes the changes being made to the ITK FEM framework. The current repository for this work is hosted here
- git@github.com:kiranhs/ITKv4FEM-Kiran.git
Solver
- Derive from ProcessObject and template over dimension
- template <unsigned int VDimension = 3> class ITK_EXPORT Solver1 : public ProcessObject
- Remove all I/O from Solver
- Use SetInput() and GetOutput() methods to set the FE problem and to get the deformed mesh
- Update() method will execute the Solver
- Retain the following methods
- SetLinearSystemWrapper()
- GetLinearSystemWrapper()
- GetElementAtPoint()
- GetDeformationEnergy()
- SetTimeStep()
- GetSolution()
FEMObject
A new object type was added, itk::fem::FEMObject, that is used to define the FEM problem. The class derives from DataObject and is templated over dimension.
- template <unsigned int VDimension = 3> class ITK_EXPORT FEMObject : public DataObject
- Class Methods
- GetNumberOfDegreesOfFreedom()
- GetNumberOfMultiFreedomConstraints()
- GetNumberOfNodes
- GetNumberOfElements
- GetNumberOfLoads(void)
- GetNumberOfMaterials(void)
- AddNextElement(Element::Pointer e)
- InsertElement(Element::Pointer e, ElementIdentifier index)
- AddNextNode(Node::Pointer e)
- InsertNode(Node::Pointer e, NodeIdentifier index)
- AddNextMaterial(Material::Pointer mat)
- InsertMaterial(Material::Pointer e, MaterialIdentifier index)
- AddNextLoad(Load::Pointer ld)
- InsertLoad(Load::Pointer ld, LoadIdentifier index)
- GetElement(ElementIdentifier index)
- GetElementWithGlobalNumber(int globalNumber)
- GetNode(NodeIdentifier index)
- GetNodeWithGlobalNumber(int globalNumber)
- GetMaterial(MaterialIdentifier index)
- GetMaterialWithGlobalNumber(int globalNumber)
- GetLoad(LoadIdentifier index)
- GetLoadWithGlobalNumber(int globalNumber)
- RenumberNodeContainer()
- FinalizeMesh()
FEMSpatialObject
This class provides a spatial object wrapper around the FEMObject. This class facilities the I/O which is now supported by the MetaIO library.
Using FEM Framework
const unsigned int Dimension = 3; typedef itk::SpatialObject<Dimension> SpatialObjectType; typedef SpatialObjectType::Pointer SpatialObjectPointer; // Read the FEM Problem typedef itk::SpatialObjectReader<Dimension> SpatialObjectReaderType; typedef SpatialObjectReaderType::Pointer SpatialObjectReaderPointer; SpatialObjectReaderPointer SpatialReader = SpatialObjectReaderType::New(); SpatialReader->SetFileName( argv[1] ); SpatialReader->Update(); typedef itk::FEMObjectSpatialObject<Dimension> FEMObjectSpatialObjectType; typedef FEMObjectSpatialObjectType::Pointer FEMObjectSpatialObjectPointer; FEMObjectSpatialObjectType::Pointer femSO = dynamic_cast<FEMObjectSpatialObjectType*>((*(children->begin())).GetPointer()); femSO->GetFEMObject()->FinalizeMesh(); // Solve FEM Problem typedef itk::fem::Solver1<Dimension> Solver3DType; Solver3DType::Pointer solver = Solver3DType::New(); solver->SetInput( femSO->GetFEMObject() ); solver->Update( ); // Write the solution - (i.e. deformed mesh) FEMObjectSpatialObjectType::Pointer femSODef = FEMObjectSpatialObjectType::New(); femSODef->SetFEMObject(solver->GetOutput()); typedef itk::SpatialObjectWriter<Dimension> SpatialObjectWriterType; typedef SpatialObjectWriterType::Pointer SpatialObjectWriterPointer; SpatialObjectWriterPointer SpatialWriter = SpatialObjectWriterType::New(); SpatialWriter->SetInput(femSODef); SpatialWriter->SetFileName( argv[2] ); SpatialWriter->Update();
Ongoing Work
- Remove old FEM Factory infrastructure
- Finalize how to handle Image derived loads
- Update FEM Registration
- Merge with Modular ITK
- Further code cleanup and testing