diff --git a/Base/Constraint/PbdConstraints/imstkPbdConstraint.h b/Base/Constraint/PbdConstraints/imstkPbdConstraint.h index 81952aebcd89ed02cdc3a1ea7b81ed24873d4dca..8176be0b060b0269319c6ff9ea95dd4312f0c9bf 100644 --- a/Base/Constraint/PbdConstraints/imstkPbdConstraint.h +++ b/Base/Constraint/PbdConstraints/imstkPbdConstraint.h @@ -62,17 +62,6 @@ public: /// virtual Type getType() const = 0; - /// - /// \brief update constraint - /// \param model \class PbdModel - /// \return true if succeeded - /// TODO: Remove this or implement for child classes in future - /// - virtual bool updateConstraint(PbdModel& model) - { - return true; - } - /// /// \brief compute delta position from the constraint function /// \param model \class PbdModel @@ -80,17 +69,6 @@ public: /// virtual bool solvePositionConstraint(PbdModel& model) = 0; - /// - /// \brief compute delta velocity, specifically for rigid bodies - /// \param model \class PbdModel - /// \return true if succeeded - /// TODO: Remove this or implement for child classes in future - /// - virtual bool solveVelocityConstraint(PbdModel& model) - { - return true; - } - public: std::vector<size_t> m_vertexIds; ///> index of points for the constraint }; diff --git a/Base/DynamicalModels/ObjectModels/imstkDeformableBodyModel.cpp b/Base/DynamicalModels/ObjectModels/imstkFEMDeformableBodyModel.cpp similarity index 87% rename from Base/DynamicalModels/ObjectModels/imstkDeformableBodyModel.cpp rename to Base/DynamicalModels/ObjectModels/imstkFEMDeformableBodyModel.cpp index a6e7515fce339d49b15a5bea88b2312e5a4a9424..c13973440c59439a100dc25e78ec544a4183e196 100644 --- a/Base/DynamicalModels/ObjectModels/imstkDeformableBodyModel.cpp +++ b/Base/DynamicalModels/ObjectModels/imstkFEMDeformableBodyModel.cpp @@ -22,7 +22,7 @@ #include <fstream> //imstk -#include "imstkDeformableBodyModel.h" +#include "imstkFEMDeformableBodyModel.h" // vega #include "generateMassMatrix.h" @@ -31,65 +31,65 @@ namespace imstk { -DeformableBodyModel::DeformableBodyModel() : +FEMDeformableBodyModel::FEMDeformableBodyModel() : DynamicalModel(DynamicalModelType::elastoDynamics), m_damped(false){} void -DeformableBodyModel::setForceModelConfiguration(std::shared_ptr<ForceModelConfig> fmConfig) +FEMDeformableBodyModel::setForceModelConfiguration(std::shared_ptr<ForceModelConfig> fmConfig) { m_forceModelConfiguration = fmConfig; } std::shared_ptr<imstk::ForceModelConfig> -DeformableBodyModel::getForceModelConfiguration() const +FEMDeformableBodyModel::getForceModelConfiguration() const { return m_forceModelConfiguration; } void -DeformableBodyModel::setInternalForceModel(std::shared_ptr<InternalForceModel> fm) +FEMDeformableBodyModel::setInternalForceModel(std::shared_ptr<InternalForceModel> fm) { m_internalForceModel = fm; } std::shared_ptr<imstk::InternalForceModel> -DeformableBodyModel::getInternalForceModel() const +FEMDeformableBodyModel::getInternalForceModel() const { return m_internalForceModel; } void -DeformableBodyModel::setTimeIntegrator(std::shared_ptr<TimeIntegrator> timeIntegrator) +FEMDeformableBodyModel::setTimeIntegrator(std::shared_ptr<TimeIntegrator> timeIntegrator) { m_timeIntegrator = timeIntegrator; } std::shared_ptr<imstk::TimeIntegrator> -DeformableBodyModel::getTimeIntegrator() const +FEMDeformableBodyModel::getTimeIntegrator() const { return m_timeIntegrator; } void -DeformableBodyModel::setModelGeometry(std::shared_ptr<Geometry> geometry) +FEMDeformableBodyModel::setModelGeometry(std::shared_ptr<Geometry> geometry) { m_forceModelGeometry = geometry; } std::shared_ptr<imstk::Geometry> -DeformableBodyModel::getModelGeometry() +FEMDeformableBodyModel::getModelGeometry() { return m_forceModelGeometry; } void -DeformableBodyModel::configure(const std::string& configFileName) +FEMDeformableBodyModel::configure(const std::string& configFileName) { m_forceModelConfiguration = std::make_shared<ForceModelConfig>(configFileName); } void -DeformableBodyModel::initialize(std::shared_ptr<VolumetricMesh> physicsMesh) +FEMDeformableBodyModel::initialize(std::shared_ptr<VolumetricMesh> physicsMesh) { this->setModelGeometry(physicsMesh); @@ -122,7 +122,7 @@ DeformableBodyModel::initialize(std::shared_ptr<VolumetricMesh> physicsMesh) } void -DeformableBodyModel::loadInitialStates() +FEMDeformableBodyModel::loadInitialStates() { // For now the initial states are set to zero m_initialState = std::make_shared<kinematicState>(m_numDOF); @@ -131,7 +131,7 @@ DeformableBodyModel::loadInitialStates() } void -DeformableBodyModel::loadBoundaryConditions() +FEMDeformableBodyModel::loadBoundaryConditions() { auto fileName = m_forceModelConfiguration->getStringOptionsMap().at("fixedDOFFilename"); @@ -166,7 +166,7 @@ DeformableBodyModel::loadBoundaryConditions() } void -DeformableBodyModel::initializeForceModel() +FEMDeformableBodyModel::initializeForceModel() { const double g = m_forceModelConfiguration->getFloatsOptionsMap().at("gravity"); const bool isGravityPresent = (g > 0) ? true : false; @@ -207,7 +207,7 @@ DeformableBodyModel::initializeForceModel() } void -DeformableBodyModel::initializeMassMatrix(const bool saveToDisk /*= false*/) +FEMDeformableBodyModel::initializeMassMatrix(const bool saveToDisk /*= false*/) { if (!this->m_forceModelGeometry) { @@ -226,7 +226,7 @@ DeformableBodyModel::initializeMassMatrix(const bool saveToDisk /*= false*/) } void -DeformableBodyModel::initializeDampingMatrix(std::shared_ptr<vega::VolumetricMesh> vegaMesh) +FEMDeformableBodyModel::initializeDampingMatrix(std::shared_ptr<vega::VolumetricMesh> vegaMesh) { auto dampingLaplacianCoefficient = this->m_forceModelConfiguration->getFloatsOptionsMap().at("dampingLaplacianCoefficient"); auto dampingMassCoefficient = this->m_forceModelConfiguration->getFloatsOptionsMap().at("dampingMassCoefficient"); @@ -272,7 +272,7 @@ DeformableBodyModel::initializeDampingMatrix(std::shared_ptr<vega::VolumetricMes } void -DeformableBodyModel::initializeTangentStiffness() +FEMDeformableBodyModel::initializeTangentStiffness() { if (!m_internalForceModel) { @@ -320,7 +320,7 @@ DeformableBodyModel::initializeTangentStiffness() } void -DeformableBodyModel::initializeGravityForce() +FEMDeformableBodyModel::initializeGravityForce() { m_gravityForce.resize(m_numDOF); m_gravityForce.setZero(); @@ -330,7 +330,7 @@ DeformableBodyModel::initializeGravityForce() } void -DeformableBodyModel::computeImplicitSystemRHS(kinematicState& stateAtT, +FEMDeformableBodyModel::computeImplicitSystemRHS(kinematicState& stateAtT, kinematicState& newState) { // Do checks if there are uninitialized matrices @@ -367,7 +367,7 @@ DeformableBodyModel::computeImplicitSystemRHS(kinematicState& stateAtT, } void -DeformableBodyModel::computeSemiImplicitSystemRHS(kinematicState& stateAtT, +FEMDeformableBodyModel::computeSemiImplicitSystemRHS(kinematicState& stateAtT, kinematicState& newState) { // Do checks if there are uninitialized matrices @@ -394,7 +394,7 @@ kinematicState& newState) } void -DeformableBodyModel::computeImplicitSystemLHS(const kinematicState& stateAtT, +FEMDeformableBodyModel::computeImplicitSystemLHS(const kinematicState& stateAtT, kinematicState& newState) { // Do checks if there are uninitialized matrices @@ -421,7 +421,7 @@ DeformableBodyModel::computeImplicitSystemLHS(const kinematicState& stateAtT, } void -DeformableBodyModel::initializeExplicitExternalForces() +FEMDeformableBodyModel::initializeExplicitExternalForces() { m_explicitExternalForce.resize(m_numDOF); m_explicitExternalForce.setZero(); @@ -430,7 +430,7 @@ DeformableBodyModel::initializeExplicitExternalForces() } void -DeformableBodyModel::updateDampingMatrix() +FEMDeformableBodyModel::updateDampingMatrix() { if (m_damped) { @@ -454,7 +454,7 @@ DeformableBodyModel::updateDampingMatrix() } void -DeformableBodyModel::applyBoundaryConditions(SparseMatrixd &M, const bool withCompliance) const +FEMDeformableBodyModel::applyBoundaryConditions(SparseMatrixd &M, const bool withCompliance) const { double compliance = withCompliance ? 1.0 : 0.0; @@ -482,7 +482,7 @@ DeformableBodyModel::applyBoundaryConditions(SparseMatrixd &M, const bool withCo } void -DeformableBodyModel::applyBoundaryConditions(Vectord &x) const +FEMDeformableBodyModel::applyBoundaryConditions(Vectord &x) const { for (auto & index : m_fixedNodeIds) { @@ -491,13 +491,13 @@ DeformableBodyModel::applyBoundaryConditions(Vectord &x) const } void -DeformableBodyModel::updateMassMatrix() +FEMDeformableBodyModel::updateMassMatrix() { // Do nothing for now as topology changes are not supported yet! } void -DeformableBodyModel::updatePhysicsGeometry() +FEMDeformableBodyModel::updatePhysicsGeometry() { auto volMesh = std::static_pointer_cast<VolumetricMesh>(m_forceModelGeometry); auto u = m_currentState->getQ(); @@ -506,7 +506,7 @@ DeformableBodyModel::updatePhysicsGeometry() void -DeformableBodyModel::updateBodyStates(const Vectord& solution, const stateUpdateType updateType) +FEMDeformableBodyModel::updateBodyStates(const Vectord& solution, const stateUpdateType updateType) { auto uPrev = m_previousState->getQ(); auto u = m_currentState->getQ(); @@ -541,7 +541,7 @@ DeformableBodyModel::updateBodyStates(const Vectord& solution, const stateUpdate } NonLinearSystem::VectorFunctionType -DeformableBodyModel::getFunction(const bool semiImplicit) +FEMDeformableBodyModel::getFunction(const bool semiImplicit) { // Function to evaluate the nonlinear objective function given the current state return [&, this](const Vectord& q) -> const Vectord& @@ -561,7 +561,7 @@ DeformableBodyModel::getFunction(const bool semiImplicit) } NonLinearSystem::MatrixFunctionType -DeformableBodyModel::getFunctionGradient() +FEMDeformableBodyModel::getFunctionGradient() { //const Vectord& q // Gradient of the nonlinear objective function given the current state @@ -574,7 +574,7 @@ DeformableBodyModel::getFunctionGradient() } NonLinearSystem::UpdateFunctionType -DeformableBodyModel::getUpdateFunction() +FEMDeformableBodyModel::getUpdateFunction() { // Function to evaluate the nonlinear objective function given the current state return[&, this](const Vectord& q) -> void @@ -584,7 +584,7 @@ DeformableBodyModel::getUpdateFunction() } void -DeformableBodyModel::initializeEigenMatrixFromVegaMatrix(const vega::SparseMatrix& vegaMatrix, SparseMatrixd& eigenMatrix) +FEMDeformableBodyModel::initializeEigenMatrixFromVegaMatrix(const vega::SparseMatrix& vegaMatrix, SparseMatrixd& eigenMatrix) { auto rowLengths = vegaMatrix.GetRowLengths(); auto nonZeroValues = vegaMatrix.GetEntries(); @@ -605,7 +605,7 @@ DeformableBodyModel::initializeEigenMatrixFromVegaMatrix(const vega::SparseMatri } Vectord& -DeformableBodyModel::getContactForce() +FEMDeformableBodyModel::getContactForce() { return m_Fcontact; } diff --git a/Base/DynamicalModels/ObjectModels/imstkDeformableBodyModel.h b/Base/DynamicalModels/ObjectModels/imstkFEMDeformableBodyModel.h similarity index 96% rename from Base/DynamicalModels/ObjectModels/imstkDeformableBodyModel.h rename to Base/DynamicalModels/ObjectModels/imstkFEMDeformableBodyModel.h index ea007b9a5c9f7046e31083b6d7879736a2a43959..99a6d9b6bccc4dad00ca037a37f7681ca3225200 100644 --- a/Base/DynamicalModels/ObjectModels/imstkDeformableBodyModel.h +++ b/Base/DynamicalModels/ObjectModels/imstkFEMDeformableBodyModel.h @@ -19,8 +19,8 @@ =========================================================================*/ -#ifndef imstkDeformableBodyModel_h -#define imstkDeformableBodyModel_h +#ifndef imstkFEMDeformableBodyModel_h +#define imstkFEMDeformableBodyModel_h #include <memory> @@ -49,13 +49,13 @@ namespace imstk { /// -/// \class DeformableBodyModel +/// \class FEMDeformableBodyModel /// /// \brief Mathematical model of the physics governing the dynamic deformable object /// Note: Vega specifics will removed in future when the inertial and damping calculations /// are done with in-house code /// -class DeformableBodyModel : public DynamicalModel<VectorizedState> +class FEMDeformableBodyModel : public DynamicalModel<VectorizedState> { using kinematicState = VectorizedState; @@ -63,12 +63,12 @@ public: /// /// \brief Constructor /// - DeformableBodyModel(); + FEMDeformableBodyModel(); /// /// \brief Destructor /// - ~DeformableBodyModel() = default; + ~FEMDeformableBodyModel() = default; /// /// \brief Set/Get force model configuration @@ -258,4 +258,4 @@ protected: } // imstk -#endif // ifndef imstkDeformableBodyModel_h +#endif // ifndef imstkFEMDeformableBodyModel_h diff --git a/Base/SceneElements/Objects/imstkDeformableObject.cpp b/Base/SceneElements/Objects/imstkDeformableObject.cpp index 891ee7215dfc28550ce04d7637d4c8284ddd7e75..7dd029df146e61d1cc6ae590898121a30835e9c3 100644 --- a/Base/SceneElements/Objects/imstkDeformableObject.cpp +++ b/Base/SceneElements/Objects/imstkDeformableObject.cpp @@ -40,17 +40,13 @@ DeformableObject::getContactForce() bool DeformableObject::initialize() { - // CHECKBACK - if (!m_dynamicalModel || m_dynamicalModel->getType() != DynamicalModelType::elastoDynamics) + m_defModel = std::dynamic_pointer_cast<FEMDeformableBodyModel>(m_dynamicalModel); + if (m_defModel == nullptr) { LOG(WARNING) << "Dynamic model set is not of expected type (DeformableBodyModel)!"; return false; } - else - { - m_defModel = std::static_pointer_cast<DeformableBodyModel>(m_dynamicalModel); - return true; - } + return true; } const Vectord& diff --git a/Base/SceneElements/Objects/imstkDeformableObject.h b/Base/SceneElements/Objects/imstkDeformableObject.h index 909ec7ec77a697b5c57b1407969cdce214270085..08a9221bcfb0f82938d05f041443939d7e44a246 100644 --- a/Base/SceneElements/Objects/imstkDeformableObject.h +++ b/Base/SceneElements/Objects/imstkDeformableObject.h @@ -27,7 +27,7 @@ // imstk #include "imstkDynamicObject.h" -#include "imstkDeformableBodyModel.h" +#include "imstkFEMDeformableBodyModel.h" #include "imstkMath.h" namespace imstk @@ -48,7 +48,7 @@ public: /// /// \brief Constructor /// - DeformableObject(std::string name) : DynamicObject(name) { m_type = Type::Deformable; } + DeformableObject(std::string name) : DynamicObject(name) { m_type = Type::FEMDeformable; } DeformableObject() = delete; /// @@ -108,7 +108,7 @@ public: const Vectord& getPrevAccelerations() const; protected: - std::shared_ptr<DeformableBodyModel> m_defModel; + std::shared_ptr<FEMDeformableBodyModel> m_defModel; }; } // imstk diff --git a/Base/SceneElements/Objects/imstkDynamicObject.h b/Base/SceneElements/Objects/imstkDynamicObject.h index cbed91ac20763556d76683482e2fa484a80ec204..524f303edfefe1b092c2dcf0c862017fd95d0ce6 100644 --- a/Base/SceneElements/Objects/imstkDynamicObject.h +++ b/Base/SceneElements/Objects/imstkDynamicObject.h @@ -81,16 +81,13 @@ public: /// size_t getNumOfDOF() const { - if (m_dynamicalModel) - { - return m_dynamicalModel->getNumDegreeOfFreedom(); - } - else + if (!m_dynamicalModel) { LOG(WARNING) << "Cannot get the degree of freedom since the dynamical model is not initialized! returning 0"; return 0; } + return m_dynamicalModel->getNumDegreeOfFreedom(); } /// @@ -104,11 +101,17 @@ public: { m_physicsToCollidingGeomMap->apply(); } - CollidingObject::updateGeometries(); - if (m_physicsToVisualGeomMap) + if (m_updateVisualFromPhysicsGeometry) + { + if (m_physicsToVisualGeomMap) + { + m_physicsToVisualGeomMap->apply(); + } + } + else { - m_physicsToVisualGeomMap->apply(); + CollidingObject::updateGeometries(); } } @@ -125,6 +128,7 @@ protected: //Maps std::shared_ptr<GeometryMap> m_physicsToCollidingGeomMap; ///> Maps from Physics to collision geometry std::shared_ptr<GeometryMap> m_physicsToVisualGeomMap; ///> Maps from Physics to visual geometry + bool m_updateVisualFromPhysicsGeometry = true; ///> Defines if visual is updated from colliding mapping or physics mapping }; } // imstk diff --git a/Base/SceneElements/Objects/imstkPbdObject.cpp b/Base/SceneElements/Objects/imstkPbdObject.cpp index 745ca06a78f829331319f2b8217f27c88729b968..19ca5ed93932706d7b83cc302315d3216b320a80 100644 --- a/Base/SceneElements/Objects/imstkPbdObject.cpp +++ b/Base/SceneElements/Objects/imstkPbdObject.cpp @@ -9,31 +9,22 @@ namespace imstk bool PbdObject::initialize(int nCons, ...) { - std::shared_ptr<Mesh> mesh; - if (!m_physicsGeometry || - !(m_physicsGeometry->getType() == Geometry::Type::TetrahedralMesh || - m_physicsGeometry->getType() == Geometry::Type::SurfaceMesh|| - m_physicsGeometry->getType() == Geometry::Type::HexahedralMesh)) + std::shared_ptr<Mesh> mesh = std::dynamic_pointer_cast<Mesh>(m_physicsGeometry); + if (mesh == nullptr) { LOG(WARNING) << "Physics geometry is not a mesh!"; return false; } - else - { - mesh = std::static_pointer_cast<Mesh>(m_physicsGeometry); - } - if (!m_dynamicalModel || m_dynamicalModel->getType() != DynamicalModelType::positionBasedDynamics) + m_pbdModel = std::dynamic_pointer_cast<PbdModel>(m_dynamicalModel); + if (m_pbdModel == nullptr) { LOG(WARNING) << "Dynamic model set is not of expected type (PbdModel)!"; return false; } - else - { - m_pbdModel = std::static_pointer_cast<PbdModel>(m_dynamicalModel); - m_pbdModel->setModelGeometry(mesh); - m_pbdModel->initialize(); - } + + m_pbdModel->setModelGeometry(mesh); + m_pbdModel->initialize(); va_list args; va_start(args, nCons); diff --git a/Base/SceneElements/Objects/imstkPbdObject.h b/Base/SceneElements/Objects/imstkPbdObject.h index 3bddddb062f421fd8353367e9b1705413153912b..f8e6f25c3982ef95199be46c574cfca3761d8dd1 100644 --- a/Base/SceneElements/Objects/imstkPbdObject.h +++ b/Base/SceneElements/Objects/imstkPbdObject.h @@ -58,6 +58,7 @@ public: protected: + std::shared_ptr<Mesh> m_physicsGeometry; ///> Geometry used for Physics std::shared_ptr<PbdModel> m_pbdModel; ///> PBD mathematical model }; diff --git a/Base/SceneElements/Objects/imstkPbdRigidObject.h b/Base/SceneElements/Objects/imstkPbdRigidObject.h index 9b44347abf7c6a779423646aaef76985d04e8304..02c875a7167b05121b202bcff2b05eab934b8c83 100644 --- a/Base/SceneElements/Objects/imstkPbdRigidObject.h +++ b/Base/SceneElements/Objects/imstkPbdRigidObject.h @@ -42,7 +42,7 @@ public: /// PbdRigidObject(std::string name) : PbdObject(name) { - m_type = SceneObject::Type::Deformable; + m_type = SceneObject::Type::Pbd; } /// diff --git a/Base/SceneElements/Objects/imstkSceneObject.h b/Base/SceneElements/Objects/imstkSceneObject.h index 3978f3cacff29c0da58d5b843bef4872288188fa..38045907bad200c5b6056d7420d8bc6075bab324 100644 --- a/Base/SceneElements/Objects/imstkSceneObject.h +++ b/Base/SceneElements/Objects/imstkSceneObject.h @@ -46,7 +46,7 @@ public: Visual, Colliding, Rigid, - Deformable, + FEMDeformable, Pbd }; diff --git a/Base/Solvers/imstkNewtonMethod.cpp b/Base/Solvers/imstkNewtonMethod.cpp index f26ad61f542431eea4817d6292ad175d25feb473..77fac9e6a89bf7d37ed3a80e1390003c591e77fd 100644 --- a/Base/Solvers/imstkNewtonMethod.cpp +++ b/Base/Solvers/imstkNewtonMethod.cpp @@ -87,8 +87,6 @@ NewtonMethod::solveGivenState(Vectord& x) void NewtonMethod::solve() { - NonLinearSolver::solve(); - if (!this->m_nonLinearSystem) { LOG(WARNING) << "NewtonMethod::solve - nonlinear system is not set to the nonlinear solver"; diff --git a/Base/Solvers/imstkNonLinearSolver.h b/Base/Solvers/imstkNonLinearSolver.h index 462c2c2839997765126a3f563a73d67bb09bd67d..e19ff7b32eeb36683460f913799ea76965fe9808 100644 --- a/Base/Solvers/imstkNonLinearSolver.h +++ b/Base/Solvers/imstkNonLinearSolver.h @@ -53,10 +53,7 @@ public: /// \brief Main solve routine. /// virtual void solveGivenState(Vectord& x) = 0; - virtual void solve() - { - SolverBase::solve(); - }; + virtual void solve() = 0; /// /// \brief Backtracking line search method based on the Armijo-Goldstein condition diff --git a/Base/Solvers/imstkPbdSolver.h b/Base/Solvers/imstkPbdSolver.h index a84026781f78e27e5783ed2775cc5a02185f258d..d596c250d007088ee0440b03630e0092abc25d5b 100644 --- a/Base/Solvers/imstkPbdSolver.h +++ b/Base/Solvers/imstkPbdSolver.h @@ -74,8 +74,6 @@ public: /// void solve() { - SolverBase::solve(); - m_pbdObject->integratePosition(); m_pbdObject->solveConstraints(); m_pbdObject->integrateVelocity(); diff --git a/Base/Solvers/imstkSolverBase.h b/Base/Solvers/imstkSolverBase.h index 4d27451654ca3a8393b43fd5010a7a49af1f10b9..9c87b52101810a2bbe2a615107ca7b485215c45d 100644 --- a/Base/Solvers/imstkSolverBase.h +++ b/Base/Solvers/imstkSolverBase.h @@ -36,7 +36,7 @@ public: SolverBase() = default; virtual ~SolverBase() = default; - virtual void solve() {}; + virtual void solve() =0; }; diff --git a/Examples/Sandbox/main.cpp b/Examples/Sandbox/main.cpp index 32e6d1825a5c150c973fa34d7fa2bc86ea083e95..8d6ba7d8f13bc876fedc440012515051ce716274 100644 --- a/Examples/Sandbox/main.cpp +++ b/Examples/Sandbox/main.cpp @@ -10,7 +10,7 @@ // Objects #include "imstkForceModelConfig.h" -#include "imstkDeformableBodyModel.h" +#include "imstkFEMDeformableBodyModel.h" #include "imstkDeformableObject.h" #include "imstkSceneObject.h" #include "imstkLight.h" @@ -1060,7 +1060,7 @@ void testDeformableBody() // e. Scene object 1: Dragon // Configure dynamic model - auto dynaModel = std::make_shared<DeformableBodyModel>(); + auto dynaModel = std::make_shared<FEMDeformableBodyModel>(); dynaModel->configure("asianDragon.config"); dynaModel->initialize(volTetMesh); auto timeIntegrator = std::make_shared<BackwardEuler>(0.01);// Create and add Backward Euler time integrator