iMSTK
Interactive Medical Simulation Toolkit
imstkSphBoundaryConditions.h
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 #pragma once
8 
9 #include "imstkMath.h"
10 
11 namespace imstk
12 {
19 {
20 public:
21  enum class ParticleType
22  {
23  Fluid,
24  Wall,
25  Inlet,
26  Outlet,
27  Buffer
28  };
29 
30 public:
31  SphBoundaryConditions(std::pair<Vec3d, Vec3d>& inletCoords, std::vector<std::pair<Vec3d, Vec3d>>& outletCoords, std::pair<Vec3d, Vec3d>& fluidCoords,
32  const Vec3d& inletNormal, const StdVectorOfVec3d& outletNormals, const double inletRadius, const Vec3d& inletCenterPt, const double inletFlowRate,
33  StdVectorOfVec3d& mainParticlePositions,
34  const StdVectorOfVec3d& wallParticlePositions);
35 
36 public:
37  bool isInInletDomain(const Vec3d& position);
38 
39  bool isInOutletDomain(const Vec3d& position);
40 
41  bool isInFluidDomain(const Vec3d& position);
42 
43  void setParticleTypes(const StdVectorOfVec3d& mainParticlePositions, const size_t numWallParticles);
44 
45  std::vector<ParticleType>& getParticleTypes() { return m_particleTypes; }
46 
47  Vec3d getBufferCoord() { return m_bufferCoord; }
48 
49  Vec3d computeParabolicInletVelocity(const Vec3d& position);
50 
51  void addBoundaryParticles(StdVectorOfVec3d& mainParticlePositions, const StdVectorOfVec3d& wallParticlePositions);
52 
53  void setInletVelocity(const double flowRate);
54 
55  Vec3d getInletCoord() { return m_inletDomain.first; }
56 
57  Vec3d getInletVelocity() { return m_inletVelocity; }
58 
59  Vec3d getInletNormal() { return m_inletNormal; }
60 
61  std::vector<size_t>& getBufferIndices() { return m_bufferIndices; }
62 
63  Vec3d placeParticleAtInlet(const Vec3d& position);
64 
65 private:
66  std::pair<Vec3d, Vec3d> m_inletDomain;
67  std::vector<std::pair<Vec3d, Vec3d>> m_outletDomain;
68  std::pair<Vec3d, Vec3d> m_fluidDomain;
69 
70  std::vector<ParticleType> m_particleTypes;
71 
72  Vec3d m_bufferCoord;
73  Vec3d m_inletCenterPoint;
74  double m_inletRadius;
75  Vec3d m_inletVelocity;
76  Vec3d m_inletNormal;
77 
78  double m_inletCrossSectionalArea;
79 
80  const size_t m_numBufferParticles = 10000;
81  std::vector<size_t> m_bufferIndices;
82 };
83 } // namespace imstk
Compound Geometry.
void setParticleTypes(const StdVectorOfVec3d &mainParticlePositions, const size_t numWallParticles)
set particle type (fluid, wall, inlet, outlet, buffer)