[ITK-users] itk::Fem::Solver update problem

Yusuf OEZBEK nasil122002 at yahoo.de
Mon Oct 9 08:08:37 EDT 2017


Dear ITK Users,

According the mail https://public.kitware.com/pipermail/insight-users/2007-November/024272.html , I have converted my vtkUnstructuredGrid, wich I extracted from a vtkPolyData and contains TRIANGLE_CELL's to the itkMesh and than from itkMesh to itk::Fem::Object to deform my mesh:
My problem is: If I call "m_FemSolver->Update();" ,I get a segmentation fault, which I really not understand. 

Program received signal SIGSEGV, Segmentation fault.
0x00007fffb1086dd5 in itk::fem::FEMObject<2u>::DeepCopy (this=0x4cc5ee0, 
    Copy=0x4cc1780)
    at /home/toolkits/itk-4.7.2/Modules/Numerics/FEM/include/itkFEMObject.hxx:157
157        a->UnRegister();


void itkMeshToFemMesh::updateItkMeshSlot(itk::Mesh<double, 3, MeshTraitsType> *itkMesh)
{
  typedef itk::fem::FEMObject<3> FemObjectType;
  FemObjectType::Pointer m_FemObject= FemObjectType::New();

  typedef itk::fem::Solver<3> SolverType;
  typedef SolverType::Pointer SolverPointerType;
  SolverPointerType m_FemSolver= SolverType::New();

  // Define the Element Material properties
  typedef itk::fem::MaterialLinearElasticity MaterialType;
  MaterialType::Pointer material= MaterialType::New();
  material->SetGlobalNumber(0);
  material->SetYoungsModulus(200E6);
  material->SetCrossSectionalArea(1.0);
  material->SetThickness(1.0);
  material->SetMomentOfInertia(1.0);
  material->SetPoissonsRatio(0.2);
  material->SetDensityHeatProduct(1.0);
  m_FemObject->AddNextMaterial(material);

  // Define the element type
  typedef itk::fem::Element2DC0LinearTriangularStrain TriangularElementType;
  TriangularElementType::Pointer triangularElement= TriangularElementType::New();
  triangularElement->SetMaterial(material.GetPointer());

  // Convert mesh points into nodes
  VectorType point(3);
  PointType*ptr;
  PointType pt;
  ptr= &pt;

  int numOfPoints= itkMesh->GetNumberOfPoints();
  cout<<"itkMesh numOfPoints: "<<numOfPoints<<endl;

  int numberOfCells= itkMesh->GetNumberOfCells();
  cout<<"itkMesh numberOfCells: "<<numberOfCells<<endl;

  CellsContainerPointer cellIterator= itkMesh->GetCells();
  CellIterator cells= cellIterator->Begin();

  bool flag= true;

  for(int k=0; k< numberOfCells; k++)
  {
    CellType *cellPtr= cells.Value();
    cout<<"Cell Value: "<< cells.Value() << " Cell Type= " << cellPtr->GetType()<<endl;

    switch(cellPtr->GetType())
    {
      case CellType::TRIANGLE_CELL:
      {
        if(flag== true) // To make sure that the nodes are created just once
        {
          for(int j= 0; j< numOfPoints; j++)
          {
            itkMesh->GetPoint(j, ptr);

            typedef TriangularElementType::Node TriangularNodeType;
            TriangularNodeType::Pointer triangularNode= TriangularNodeType::New();
            point[0]= -1.0;
            point[1]= 2.0;
            point[2]= 3.0;
            triangularNode->SetCoordinates(point);
            triangularNode->SetGlobalNumber(j);
            m_FemObject->AddNextNode(triangularNode.GetPointer());
          }
          flag= false;
        }
        PointIdIterator pointIt= cellPtr->PointIdsBegin();
        int i= 0;

        while(pointIt!= cellPtr->PointIdsEnd())
        {
           triangularElement->SetNode(i, m_FemObject->GetNode(*pointIt));
          pointIt++;
          i++;
        }
        cells++;
        triangularElement->SetGlobalNumber(k);
        m_FemObject->AddNextElement(triangularElement.GetPointer());
        break;
      }
    }
  }

  // Define some Load
  LoadNodePointerType loadNode =LoadNodeType::New();
  loadNode->SetElement(triangularElement);
  loadNode->SetGlobalNumber(3);
  loadNode->SetNode(1);

  vnl_vector<double> force(2);
  force[0]= 20.0;
  force[1]= -20.0;
  force[2]= 10.0;
  loadNode->SetForce(force);
  m_FemObject->AddNextLoad(loadNode);

  //Solve for displacements.
  m_FemObject->FinalizeMesh();
  m_FemSolver->SetInput(m_FemObject);
  m_FemSolver->Update();     // SEGMENTATION FAULT

  cout<< "Fem Solver Output: "<< m_FemSolver->GetOutput()<<endl;

  const unsigned int invalidId= itk::fem::Element::InvalidDegreeOfFreedomID;
  int numberOfNodes= m_FemSolver->GetInput()->GetNumberOfNodes();

  for(int i= 0; i< numberOfNodes; i++)
  {
    itk::fem::Element::Node::Pointer node= m_FemSolver->GetInput()->GetNode(i);
    cout<<"Fem Node : "<< node->GetGlobalNumber()<<endl;

    for(unsigned int j= 0, dof; (dof= node->GetDegreeOfFreedom(j))!= invalidId; j++)
    {
      cout <<"Solver GetSolution: "<< m_FemSolver->GetSolution(dof)<<endl;
    }
  }

  // Write the deformed mesh
  typedef itk::FEMObjectSpatialObject<3> FemObjectSpatialObjectType;
  FemObjectSpatialObjectType::Pointer m_FemSpatialObject= FemObjectSpatialObjectType::New();
  m_FemSpatialObject->SetFEMObject(m_FemSolver->GetOutput());

  typedef itk::FEMSpatialObjectWriter<3>                      FemSpatialObjectWriterType;
  FemSpatialObjectWriterType::Pointer femSpatialWriter= FemSpatialObjectWriterType::New();
  femSpatialWriter->SetInput(m_FemSpatialObject);
  femSpatialWriter->SetFileName("deformedMesh.meta");
  femSpatialWriter->Update();
}

Thank you for any help!


More information about the Insight-users mailing list