7 #include "imstkSphBoundaryConditions.h" 13 SphBoundaryConditions::SphBoundaryConditions(std::pair<Vec3d, Vec3d>& inletCoords, std::vector<std::pair<Vec3d, Vec3d>>& outletCoords, std::pair<Vec3d, Vec3d>& fluidCoords,
14 const Vec3d& inletNormal,
const StdVectorOfVec3d&,
const double inletRadius,
const Vec3d& inletCenterPt,
const double inletFlowRate,
15 StdVectorOfVec3d& mainParticlePositions,
const StdVectorOfVec3d& wallParticlePositions) :
16 m_inletDomain(inletCoords), m_outletDomain(outletCoords),
17 m_fluidDomain(fluidCoords),
18 m_bufferCoord(Vec3d(100.0, 0.0, 0.0)),
19 m_inletCenterPoint(inletCenterPt),
20 m_inletRadius(inletRadius),
21 m_inletNormal(inletNormal.normalized()),
22 m_inletCrossSectionalArea(PI * m_inletRadius * m_inletRadius)
24 setInletVelocity(inletFlowRate);
25 setParticleTypes(mainParticlePositions, wallParticlePositions.size());
27 addBoundaryParticles(mainParticlePositions, wallParticlePositions);
31 SphBoundaryConditions::isInInletDomain(
const Vec3d& position)
33 if (position.x() >= m_inletDomain.first.x() && position.y() >= m_inletDomain.first.y() && position.z() >= m_inletDomain.first.z()
34 && position.x() <= m_inletDomain.second.x() && position.y() <= m_inletDomain.second.y() && position.z() <= m_inletDomain.second.z())
43 SphBoundaryConditions::isInOutletDomain(
const Vec3d& position)
45 for (
const auto& i : m_outletDomain)
47 if (position.x() >= i.first.x() && position.y() >= i.first.y() && position.z() >= i.first.z()
48 && position.x() <= i.second.x() && position.y() <= i.second.y() && position.z() <= i.second.z())
58 SphBoundaryConditions::isInFluidDomain(
const Vec3d& position)
60 const double error = 0.1;
61 if (position.x() >= m_fluidDomain.first.x() - error && position.y() >= m_fluidDomain.first.y() - error && position.z() >= m_fluidDomain.first.z() - error
62 && position.x() <= m_fluidDomain.second.x() + error && position.y() <= m_fluidDomain.second.y() + error && position.z() <= m_fluidDomain.second.z() + error)
76 m_particleTypes.reserve(mainParticlePositions.size() + numWallParticles + m_numBufferParticles);
78 for (
auto const& i : mainParticlePositions)
81 if (isInInletDomain(i))
83 type = ParticleType::Inlet;
85 else if (isInOutletDomain(i))
87 type = ParticleType::Outlet;
91 type = ParticleType::Fluid;
93 m_particleTypes.push_back(type);
96 m_particleTypes.insert(m_particleTypes.end(), numWallParticles, ParticleType::Wall);
97 m_particleTypes.insert(m_particleTypes.end(), m_numBufferParticles, ParticleType::Buffer);
98 m_bufferIndices.resize(m_numBufferParticles);
99 std::iota(std::begin(m_bufferIndices), std::end(m_bufferIndices), m_particleTypes.size() - m_numBufferParticles);
103 SphBoundaryConditions::computeParabolicInletVelocity(
const Vec3d& particlePosition)
106 const Vec3d inletRegionCenterPoint = (Vec3d(1.0, 1.0, 1.0) + m_inletNormal).array() * m_inletCenterPoint.array() + particlePosition.dot(m_inletNormal) * m_inletNormal.array();
107 const double distance = (particlePosition - inletRegionCenterPoint).norm();
108 Vec3d inletParabolicVelocity;
109 if (distance > m_inletRadius)
111 inletParabolicVelocity = Vec3d::Zero();
115 inletParabolicVelocity = m_inletVelocity * (1.0 - (distance / m_inletRadius) * (distance / m_inletRadius));
117 return inletParabolicVelocity;
121 SphBoundaryConditions::addBoundaryParticles(StdVectorOfVec3d& mainParticlePositions,
const StdVectorOfVec3d& wallParticlePositions)
123 mainParticlePositions.insert(mainParticlePositions.end(), wallParticlePositions.begin(), wallParticlePositions.end());
124 mainParticlePositions.insert(mainParticlePositions.end(), m_numBufferParticles, Vec3d(100.0, 0.0, 0.0));
128 SphBoundaryConditions::setInletVelocity(
const double flowRate)
130 m_inletVelocity = -m_inletNormal * (flowRate / m_inletCrossSectionalArea * 2.0);
134 SphBoundaryConditions::placeParticleAtInlet(
const Vec3d& position)
136 const Vec3d inletPosition = (Vec3d(1.0, 1.0, 1.0) + m_inletNormal).cwiseProduct(position) - m_inletCenterPoint.cwiseProduct(m_inletNormal);
137 return inletPosition;
void setParticleTypes(const StdVectorOfVec3d &mainParticlePositions, const size_t numWallParticles)
set particle type (fluid, wall, inlet, outlet, buffer)