Program Listing for File BoundaryModel.h

Return to documentation for file (SPlisHSPlasH/BoundaryModel.h)

#ifndef __BoundaryModel_h__
#define __BoundaryModel_h__

#include "Common.h"
#include <vector>

#include "RigidBodyObject.h"
#include "SPHKernels.h"
#include "Utilities/BinaryFileReaderWriter.h"

namespace SPH
{
    class TimeStep;

    class BoundaryModel
    {
        public:
            BoundaryModel();
            virtual ~BoundaryModel();

        protected:
            RigidBodyObject *m_rigidBody;
            std::vector<Vector3r> m_forcePerThread;
            std::vector<Vector3r> m_torquePerThread;

        public:
            virtual void reset();

            virtual void performNeighborhoodSearchSort() {};

            virtual void saveState(BinaryFileWriter &binWriter) {};
            virtual void loadState(BinaryFileReader &binReader) {};

            RigidBodyObject* getRigidBodyObject() { return m_rigidBody; }

            FORCE_INLINE void addForce(const Vector3r &pos, const Vector3r &f)
            {
                if (m_rigidBody->isDynamic())
                {
                    #ifdef _OPENMP
                    int tid = omp_get_thread_num();
                    #else
                    int tid = 0;
                    #endif
                    m_forcePerThread[tid] += f;
                    m_torquePerThread[tid] += (pos - m_rigidBody->getPosition()).cross(f);
                }
            }

#ifdef USE_AVX
            FORCE_INLINE void addForce(const Vector3f8 &pos, const Vector3f8 &f, const unsigned int count)
            {
                if (m_rigidBody->isDynamic())
                {
                    float fx[8];
                    float fy[8];
                    float fz[8];
                    f.x().store(fx);
                    f.y().store(fy);
                    f.z().store(fz);
                    float px[8];
                    float py[8];
                    float pz[8];
                    pos.x().store(px);
                    pos.y().store(py);
                    pos.z().store(pz);
                    for (unsigned int l = 0; l < count; l++)
                    {
                        addForce(Vector3r(px[l],py[l],pz[l]), Vector3r(fx[l],fy[l],fz[l]));
                    }
                }
            }
#endif


            FORCE_INLINE void getPointVelocity(const Vector3r &x, Vector3r &res)
            {
                if (m_rigidBody->isDynamic() || m_rigidBody->isAnimated())
                    res = m_rigidBody->getAngularVelocity().cross(x - m_rigidBody->getPosition()) + m_rigidBody->getVelocity();
                else
                    res.setZero();
            }

            void getForceAndTorque(Vector3r &force, Vector3r &torque);
            void clearForceAndTorque();
    };
}

#endif