diff --git a/Examples/Physiology/Fluid.hpp b/Examples/Physiology/Fluid.hpp index 46fba29180145bd1a7c16691adc8eb5c8b3fe4f7..708548d2afe2e3b9adaf5391403d3c10e40114a8 100644 --- a/Examples/Physiology/Fluid.hpp +++ b/Examples/Physiology/Fluid.hpp @@ -103,10 +103,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) auto surfMeshShell = std::dynamic_pointer_cast<SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/cylinder/cylinder_small_shell.stl")); auto tetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(MeshIO::read(iMSTK_DATA_ROOT "/cylinder/cylinder_small.vtk")); - //surfMesh->rotate(Vec3d(1, 0, 0), PI / 5, Geometry::TransformType::ConcatenateToTransform); - //surfMeshShell->rotate(Vec3d(1, 0, 0), PI / 5, Geometry::TransformType::ConcatenateToTransform); - //tetMesh->rotate(Vec3d(1, 0, 0), PI / 5, Geometry::TransformType::ConcatenateToTransform); - // set tetrahedral mesh used when writing VTUs sphModel->setGeometryMesh(tetMesh); @@ -131,7 +127,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) selectionFilter->setInputPoints(uniformMesh); selectionFilter->update(); auto enclosedFluidPoints = selectionFilter->getOutputPoints(); - //auto enclosedFluidPoints = GeometryUtils::getEnclosedPoints(surfMesh, uniformMesh, false); particles = enclosedFluidPoints->getInitialVertexPositions(); @@ -139,7 +134,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) selectionFilter->setInputPoints(uniformMesh_wall); selectionFilter->update(); auto enclosedWallPoints = selectionFilter->getOutputPoints(); - //auto enclosedWallPoints = GeometryUtils::getEnclosedPoints(surfMeshShell, uniformMesh_wall, false); StdVectorOfVec3d wallParticles = enclosedWallPoints->getInitialVertexPositions(); @@ -196,7 +190,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) selectionFilter->setInputPoints(uniformMesh); selectionFilter->update(); auto enclosedFluidPoints = selectionFilter->getOutputPoints(); - //auto enclosedFluidPoints = GeometryUtils::getEnclosedPoints(surfMesh, uniformMesh, false); particles = enclosedFluidPoints->getInitialVertexPositions(); @@ -204,7 +197,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) selectionFilter->setInputPoints(uniformMesh_wall); selectionFilter->update(); auto enclosedWallPoints = selectionFilter->getOutputPoints(); - //auto enclosedWallPoints = GeometryUtils::getEnclosedPoints(surfMeshShell, uniformMesh_wall, false); StdVectorOfVec3d wallParticles = enclosedWallPoints->getInitialVertexPositions(); @@ -233,7 +225,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) speedOfSound = 300; } - else if (SCENE_ID == 3) { // bifurcation flow @@ -265,7 +256,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) selectionFilter->setInputPoints(uniformMesh); selectionFilter->update(); auto enclosedFluidPoints = selectionFilter->getOutputPoints(); - //auto enclosedFluidPoints = GeometryUtils::getEnclosedPoints(surfMesh, uniformMesh, false); particles = enclosedFluidPoints->getInitialVertexPositions(); @@ -273,7 +263,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) selectionFilter->setInputPoints(uniformMesh_wall); selectionFilter->update(); auto enclosedWallPoints = selectionFilter->getOutputPoints(); - //auto enclosedWallPoints = GeometryUtils::getEnclosedPoints(surfMeshShell, uniformMesh_wall, false); StdVectorOfVec3d wallParticles = enclosedWallPoints->getInitialVertexPositions(); @@ -312,10 +301,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) auto surfMeshShell = std::dynamic_pointer_cast<SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/cylinder/cylinder_small_shell_cut_ellipse.stl")); auto tetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(MeshIO::read(iMSTK_DATA_ROOT "/cylinder/cylinder_small.vtk")); - //surfMesh->rotate(Vec3d(1, 0, 0), PI / 5, Geometry::TransformType::ConcatenateToTransform); - //surfMeshShell->rotate(Vec3d(1, 0, 0), PI / 5, Geometry::TransformType::ConcatenateToTransform); - //tetMesh->rotate(Vec3d(1, 0, 0), PI / 5, Geometry::TransformType::ConcatenateToTransform); - // set tetrahedral mesh used when writing VTUs sphModel->setGeometryMesh(tetMesh); @@ -340,7 +325,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) selectionFilter->setInputPoints(uniformMesh); selectionFilter->update(); auto enclosedFluidPoints = selectionFilter->getOutputPoints(); - //auto enclosedFluidPoints = GeometryUtils::getEnclosedPoints(surfMesh, uniformMesh, false); particles = enclosedFluidPoints->getInitialVertexPositions(); @@ -348,7 +332,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) selectionFilter->setInputPoints(uniformMesh_wall); selectionFilter->update(); auto enclosedWallPoints = selectionFilter->getOutputPoints(); - //auto enclosedWallPoints = GeometryUtils::getEnclosedPoints(surfMeshShell, uniformMesh_wall, false); StdVectorOfVec3d wallParticles = enclosedWallPoints->getInitialVertexPositions(); @@ -381,7 +364,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) auto sphHemorrhageModel = std::make_shared<SPHHemorrhage>(hemorrhagePlaneCenter, hemorrhagePlaneRadius, hemorrhagePlaneArea, hemorrhagePlaneOutwardNormal); sphModel->setHemorrhageModel(sphHemorrhageModel); } - else if (SCENE_ID == 5) { // femoral artery flow with leak @@ -389,10 +371,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) auto surfMeshShell = std::dynamic_pointer_cast<SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/femoral/femoral_artery_shell.stl")); auto tetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(MeshIO::read(iMSTK_DATA_ROOT "/femoral/femoral_artery.vtk")); - //surfMesh->rotate(Vec3d(1, 0, 0), PI / 5, Geometry::TransformType::ConcatenateToTransform); - //surfMeshShell->rotate(Vec3d(1, 0, 0), PI / 5, Geometry::TransformType::ConcatenateToTransform); - //tetMesh->rotate(Vec3d(1, 0, 0), PI / 5, Geometry::TransformType::ConcatenateToTransform); - // set tetrahedral mesh used when writing VTUs sphModel->setGeometryMesh(tetMesh); @@ -417,7 +395,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) selectionFilter->setInputPoints(uniformMesh); selectionFilter->update(); auto enclosedFluidPoints = selectionFilter->getOutputPoints(); - //auto enclosedFluidPoints = GeometryUtils::getEnclosedPoints(surfMesh, uniformMesh, false); particles = enclosedFluidPoints->getInitialVertexPositions(); @@ -425,7 +402,6 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) selectionFilter->setInputPoints(uniformMesh_wall); selectionFilter->update(); auto enclosedWallPoints = selectionFilter->getOutputPoints(); - //auto enclosedWallPoints = GeometryUtils::getEnclosedPoints(surfMeshShell, uniformMesh_wall, false); StdVectorOfVec3d wallParticles = enclosedWallPoints->getInitialVertexPositions(); @@ -449,15 +425,27 @@ generateFluid(const std::shared_ptr<Scene>& scene, const double particleRadius) StdVectorOfVec3d outletNormals{ Vec3d(1, 0, 0) }; std::vector<std::pair<Vec3d, Vec3d>> outletCoords{ std::make_pair(outletMinCoord, outletMaxCoord) }; - auto sphBoundaryConditions = std::make_shared<SPHBoundaryConditions>(inletCoords, outletCoords, fluidCoords, inletNormal, outletNormals, inletRadius, inletCenterPoint, inletFlowRate, particles, wallParticles); + auto sphBoundaryConditions = std::make_shared<SPHBoundaryConditions>(inletCoords, + outletCoords, + fluidCoords, + inletNormal, + outletNormals, + inletRadius, + inletCenterPoint, + inletFlowRate, + particles, + wallParticles); sphModel->setBoundaryConditions(sphBoundaryConditions); const Vec3d hemorrhagePlaneCenter(0.57, -0.16, -0.12); - const double hemorrhagePlaneRadius = 0.4; - //const double hemorrhagePlaneArea = 0.018; - const double hemorrhagePlaneArea = 0.158; - //const double hemorrhagePlaneArea = 0.3152; + const double hemorrhagePlaneRadius = 0.4; + const double hemorrhagePlaneArea = 0.158; const Vec3d hemorrhagePlaneNormal(0.31, -0.14, -0.94); - auto sphHemorrhageModel = std::make_shared<SPHHemorrhage>(hemorrhagePlaneCenter, hemorrhagePlaneRadius, hemorrhagePlaneArea, hemorrhagePlaneNormal); + auto sphHemorrhageModel = std::make_shared<SPHHemorrhage>( + hemorrhagePlaneCenter, + hemorrhagePlaneRadius, + hemorrhagePlaneArea, + hemorrhagePlaneNormal); + sphModel->setHemorrhageModel(sphHemorrhageModel); sphModel->setInitialVelocities(particles.size(), Vec3d(0.1, 0, 0)); diff --git a/Examples/Physiology/PhysiologyExample.hpp b/Examples/Physiology/PhysiologyExample.hpp index 8d5e1ace1392a3441f1a498b4302539e8c3b5e3b..8ab484474a67116a796912a05ac9315a1afd90d6 100644 --- a/Examples/Physiology/PhysiologyExample.hpp +++ b/Examples/Physiology/PhysiologyExample.hpp @@ -29,7 +29,6 @@ #include "imstkLight.h" #include "imstkPhysiologyModel.h" #include "imstkPhysiologyObject.h" -//#include "imstkPlane.h" #include "imstkPointSet.h" #include "imstkObjectInteractionFactory.h" #include "imstkScene.h" @@ -39,7 +38,6 @@ #include "imstkSPHObject.h" #include "imstkSPHPhysiologyInteraction.h" #include "imstkTaskGraph.h" -//#include "imstkVTKTextStatusManager.h" #include "imstkVTKViewer.h" #include "imstkMouseSceneControl.h" #include "imstkKeyboardSceneControl.h" @@ -51,18 +49,25 @@ using namespace imstk; static std::shared_ptr<PhysiologyObject> makePhysiologyObject() { - // configure model - auto physiologyParams = std::make_shared<PhysiologyModelConfig>(); + // configuration for the Physiology model + imstkNew<PhysiologyModelConfig> physiologyParams; - // Create a physics model - auto physiologyModel = std::make_shared<PhysiologyModel>(); + // Set the base physiology state to available preset + physiologyParams->m_basePatient = PatientPhysiology::StandardMale; + + // Create a Physiology model + imstkNew<PhysiologyModel> physiologyModel; physiologyModel->configure(physiologyParams); - // Setup hemorrhage action - auto hemorrhageAction = std::make_shared<HemorrhageAction>(HemorrhageAction::Type::External, "VascularCompartment::RightLeg"); + // Create an external hemorrhage on the right leg + imstkNew<HemorrhageAction> hemorrhageAction(HemorrhageAction::Type::External, + "VascularCompartment::RightLeg"); + + + // Add a hemorrhage action to the model physiologyModel->addAction("Hemorrhage", hemorrhageAction); - auto physiologyObj = std::make_shared<PhysiologyObject>("Pulse"); + imstkNew<PhysiologyObject> physiologyObj("Human physiology"); physiologyObj->setDynamicalModel(physiologyModel); return physiologyObj; @@ -129,7 +134,7 @@ main(int argc, char* argv[]) scene->getCollisionGraph()->addInteraction(interactionPair); // configure camera - (SCENE_ID == 5) ? scene->getActiveCamera()->setPosition(0, 1.0, 4.0) : scene->getActiveCamera()->setPosition(0, 1.0, 5.0); + (SCENE_ID == 5) ? scene->getActiveCamera()->setPosition(0, 1.0, 4.0) : scene->getActiveCamera()->setPosition(0, 1.0, 7.0); // configure light (white) auto whiteLight = std::make_shared<DirectionalLight>("whiteLight"); @@ -137,7 +142,7 @@ main(int argc, char* argv[]) whiteLight->setIntensity(7); scene->addLight(whiteLight); - // Setup some scalars + //Setup some scalars std::shared_ptr<PointSet> fluidGeometry = std::dynamic_pointer_cast<PointSet>(fluidObj->getPhysicsGeometry()); std::shared_ptr<StdVectorOfReal> scalarsPtr = std::make_shared<StdVectorOfReal>(fluidGeometry->getNumVertices()); std::fill_n(scalarsPtr->data(), scalarsPtr->size(), 0.0); @@ -167,18 +172,21 @@ main(int argc, char* argv[]) }, "PrintTotalTime"); taskGraph->insertAfter(fluidObj->getDynamicalSPHModel()->getMoveParticlesNode(), printTotalTime); - std::shared_ptr<TaskNode> writeSPHStateToCSV = std::make_shared<TaskNode>([&]() { + std::shared_ptr<TaskNode> writeSPHStateToCSV = std::make_shared<TaskNode>([&]() + { fluidObj->getDynamicalSPHModel()->writeStateToCSV(); }, "WriteStateToCSV"); taskGraph->insertAfter(fluidObj->getDynamicalSPHModel()->getMoveParticlesNode(), writeSPHStateToCSV); - std::shared_ptr<TaskNode> writeSPHStateToVtk = std::make_shared<TaskNode>([&]() { + std::shared_ptr<TaskNode> writeSPHStateToVtk = std::make_shared<TaskNode>([&]() + { fluidObj->getDynamicalSPHModel()->writeStateToVtk(); }, "WriteStateToVtk"); taskGraph->insertAfter(fluidObj->getDynamicalSPHModel()->getMoveParticlesNode(), writeSPHStateToVtk); // This node colors the fluid points based on their type - std::shared_ptr<TaskNode> computeVelocityScalars = std::make_shared<TaskNode>([&]() { + std::shared_ptr<TaskNode> computeVelocityScalars = std::make_shared<TaskNode>([&]() + { const std::shared_ptr<SPHBoundaryConditions> sphBoundaryConditions = sphModel->getBoundaryConditions(); StdVectorOfReal& scalars = *scalarsPtr; for (size_t i = 0; i < sphModel->getCurrentState()->getNumParticles(); i++) @@ -204,30 +212,35 @@ main(int argc, char* argv[]) taskGraph->insertAfter(fluidObj->getUpdateGeometryNode(), computeVelocityScalars); }; - // Setup a viewer to render in its own thread - imstkNew<VTKViewer> viewer("Viewer"); - viewer->setActiveScene(scene); - - // Setup a scene manager to advance the scene in its own thread - imstkNew<SceneManager> sceneManager("Scene Manager"); - sceneManager->setActiveScene(scene); - viewer->addChildThread(sceneManager); // SceneManager will start/stop with viewer - connect<Event>(sceneManager, EventType::PostUpdate, displayColors); - - // Add mouse and keyboard controls to the viewer + // Run the simulation { - imstkNew<MouseSceneControl> mouseControl(viewer->getMouseDevice()); - mouseControl->setSceneManager(sceneManager); - viewer->addControl(mouseControl); + // Setup a viewer to render in its own thread + imstkNew<VTKViewer> viewer("Viewer"); + viewer->setActiveScene(scene); - imstkNew<KeyboardSceneControl> keyControl(viewer->getKeyboardDevice()); - keyControl->setSceneManager(sceneManager); - keyControl->setViewer(viewer); - } + // Setup a scene manager to advance the scene in its own thread + imstkNew<SceneManager> sceneManager("Scene Manager"); + sceneManager->setActiveScene(scene); + viewer->addChildThread(sceneManager); // SceneManager will start/stop with viewer + connect<Event>(sceneManager, EventType::PostUpdate, displayColors); - // Start viewer running, scene as paused - sceneManager->requestStatus(ThreadStatus::Running); - viewer->start(); + // Add mouse and keyboard controls to the viewer + { + imstkNew<MouseSceneControl> mouseControl(viewer->getMouseDevice()); + mouseControl->setSceneManager(sceneManager); + viewer->addControl(mouseControl); + + imstkNew<KeyboardSceneControl> keyControl(viewer->getKeyboardDevice()); + keyControl->setSceneManager(sceneManager); + keyControl->setViewer(viewer); + viewer->addControl(keyControl); + } + + // Start viewer running, scene as paused + sceneManager->requestStatus(ThreadStatus::Paused); + viewer->start(); + + } return 0; } diff --git a/Source/GeometryMappers/imstkTetraTriangleMap.cpp b/Source/GeometryMappers/imstkTetraTriangleMap.cpp index ffbc0e6e4f2db1ab4ab46e537471d48a41cabe9b..cef134ef0ce7e8e0084e808b3d074e3cf9b22507 100644 --- a/Source/GeometryMappers/imstkTetraTriangleMap.cpp +++ b/Source/GeometryMappers/imstkTetraTriangleMap.cpp @@ -141,7 +141,7 @@ TetraTriangleMap::isValid() const { auto meshMaster = static_cast<TetrahedralMesh*>(m_master.get()); #if defined(DEBUG) || defined(_DEBUG) || !defined(NDEBUG) - CHECK(dynamic_cast<TetrahedralMesh*>(m_master.get()) == nullptr) << "Fail to cast from geometry to mesh"; + CHECK(dynamic_cast<TetrahedralMesh*>(m_master.get())) << "Fail to cast from geometry to mesh"; #endif auto totalElementsMaster = meshMaster->getNumTetrahedra();