.. _program_listing_file_SPlisHSPlasH_Elasticity_Elasticity_Kugelstadt2021.h: Program Listing for File Elasticity_Kugelstadt2021.h ==================================================== |exhale_lsh| :ref:`Return to documentation for file ` (``SPlisHSPlasH/Elasticity/Elasticity_Kugelstadt2021.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #ifndef __Elasticity_Kugelstadt2021_h__ #define __Elasticity_Kugelstadt2021_h__ #include "SPlisHSPlasH/Common.h" #include "SPlisHSPlasH/FluidModel.h" #include "SPlisHSPlasH/NonPressureForceBase.h" #include "SPlisHSPlasH/Utilities/MatrixFreeSolver.h" #if USE_AVX #include "SPlisHSPlasH/Utilities/AVX_math.h" #include "SPlisHSPlasH/Utilities/CholeskyAVXSolver.h" #endif namespace SPH { class Elasticity_Kugelstadt2021 : public NonPressureForceBase { protected: struct Factorization { Real m_dt; Real m_mu; Eigen::SparseMatrix m_DT_K; Eigen::SparseMatrix m_D; Eigen::SparseMatrix m_matHTH; #ifdef USE_AVX CholeskyAVXSolver *m_cholesky; Factorization() { m_cholesky = nullptr; } ~Factorization() { delete m_cholesky; } #else Eigen::SparseMatrix m_matL; Eigen::SparseMatrix m_matLT; Eigen::VectorXi m_permInd; Eigen::VectorXi m_permInvInd; #endif }; struct ElasticObject { std::string m_md5; std::vector m_particleIndices; unsigned int m_nFixed; std::shared_ptr m_factorization; #ifdef USE_AVX VectorXr m_rhs; VectorXr m_sol; std::vector> m_RHS; std::vector> m_f_avx; std::vector> m_sol_avx; std::vector> m_quats_avx; #else std::vector> m_f; std::vector> m_sol; std::vector> m_RHS; std::vector> m_RHS_perm; std::vector> m_quats; #endif ElasticObject() { m_factorization = nullptr; } ~ElasticObject() { m_factorization = nullptr; } }; Real m_youngsModulus; Real m_poissonRatio; Vector3r m_fixedBoxMin; Vector3r m_fixedBoxMax; // initial particle indices, used to access their original positions std::vector m_current_to_initial_index; std::vector m_initial_to_current_index; // initial particle neighborhood std::vector> m_initialNeighbors; // volumes in rest configuration std::vector m_restVolumes; std::vector m_rotations; std::vector m_stress; std::vector m_L; std::vector m_F; std::vector m_vDiff; std::vector m_RL; unsigned int m_iterationsV; unsigned int m_maxIterV; Real m_maxErrorV; Real m_alpha; int m_maxNeighbors; unsigned int m_totalNeighbors; std::vector m_objects; Real m_lambda; Real m_mu; #ifdef USE_AVX std::vector> m_precomp_RL_gradW8; std::vector> m_precomp_L_gradW8; std::vector> m_precomp_RLj_gradW8; std::vector m_precomputed_indices8; inline static void computeF(const unsigned int i, const Real* x, Elasticity_Kugelstadt2021* e); #else std::vector> m_precomp_RL_gradW; std::vector> m_precomp_L_gradW; std::vector> m_precomp_RLj_gradW; std::vector m_precomputed_indices; typedef Eigen::SimplicialLLT, Eigen::Lower, Eigen::AMDOrdering> SolverLLT; #endif typedef Eigen::ConjugateGradient Solver; Solver m_solver; void computeRHS(VectorXr& rhs); void determineFixedParticles(); std::string computeMD5(const unsigned int objIndex); void initValues(); void initSystem(); void initFactorization(std::shared_ptr factorization, std::vector &particleIndices, const unsigned int nFixed, const Real dt, const Real mu); void findObjects(); void computeMatrixL(); void precomputeValues(); void stepElasticitySolver(); void stepVolumeSolver(); virtual void initParameters(); virtual void deferredInit(); // multiplication of symmetric matrix, represented by a 6D vector, and a // 3D vector FORCE_INLINE void symMatTimesVec(const Vector6r & M, const Vector3r & v, Vector3r &res) { res[0] = M[0] * v[0] + M[3] * v[1] + M[4] * v[2]; res[1] = M[3] * v[0] + M[1] * v[1] + M[5] * v[2]; res[2] = M[4] * v[0] + M[5] * v[1] + M[2] * v[2]; } void rotationMatricesToAVXQuaternions(); public: static std::string METHOD_NAME; static int YOUNGS_MODULUS; static int POISSON_RATIO; static int FIXED_BOX_MIN; static int FIXED_BOX_MAX; static int ITERATIONS_V; static int MAX_ITERATIONS_V; static int MAX_ERROR_V; static int ALPHA; static int MAX_NEIGHBORS; Elasticity_Kugelstadt2021(FluidModel *model); virtual ~Elasticity_Kugelstadt2021(void); static NonPressureForceBase* creator(FluidModel* model) { return new Elasticity_Kugelstadt2021(model); } virtual std::string getMethodName() { return METHOD_NAME; } virtual void step(); virtual void reset(); virtual void performNeighborhoodSearchSort(); virtual void saveState(BinaryFileWriter &binWriter); virtual void loadState(BinaryFileReader &binReader); static void matrixVecProd(const Real* vec, Real* result, void* userData); void computeRotations(); }; } #endif