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)