iMSTK
Interactive Medical Simulation Toolkit
imstkIsotropicHyperelasticFeForceModel.cpp
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #include "imstkIsotropicHyperelasticFeForceModel.h"
8 #include "imstkLogger.h"
9 
10 #include <MooneyRivlinIsotropicMaterial.h>
11 #include <neoHookeanIsotropicMaterial.h>
12 #include <StVKIsotropicMaterial.h>
13 
14 namespace imstk
15 {
16 IsotropicHyperelasticFeForceModel::IsotropicHyperelasticFeForceModel(const HyperElasticMaterialType materialType,
17  std::shared_ptr<vega::VolumetricMesh> mesh,
18  const double inversionThreshold, const bool withGravity, const double gravity) : InternalForceModel()
19 {
20  auto tetMesh = std::dynamic_pointer_cast<vega::TetMesh>(mesh);
21 
22  const int enableCompressionResistance = 1;
23  const double compressionResistance = 500;
24  switch (materialType)
25  {
26  case HyperElasticMaterialType::StVK:
27  m_isotropicMaterial = std::make_shared<vega::StVKIsotropicMaterial>(
28  tetMesh.get(),
29  enableCompressionResistance,
30  compressionResistance);
31  break;
32 
33  case HyperElasticMaterialType::NeoHookean:
34  m_isotropicMaterial = std::make_shared<vega::NeoHookeanIsotropicMaterial>(
35  tetMesh.get(),
36  enableCompressionResistance,
37  compressionResistance);
38  break;
39 
40  case HyperElasticMaterialType::MooneyRivlin:
41  m_isotropicMaterial = std::make_shared<vega::MooneyRivlinIsotropicMaterial>(
42  tetMesh.get(),
43  enableCompressionResistance,
44  compressionResistance);
45  break;
46 
47  default:
48  LOG(WARNING) << "Error: Invalid hyperelastic material type.";
49  break;
50  }
51 
52  m_isotropicHyperelasticFem = std::make_shared<vega::IsotropicHyperelasticFEM>(
53  tetMesh.get(),
54  m_isotropicMaterial.get(),
55  inversionThreshold,
56  withGravity,
57  gravity);
58 }
59 } // namespace imstk
Compound Geometry.