MDStressLab++
Loading...
Searching...
No Matches
Rigidity.cpp
Go to the documentation of this file.
1//
2// Created by Nikhil Chandra Admal on 1/29/25.
3//
4
5#include "Rigidity.h"
6#include "typedef.h"
7#include <set>
8#include "neighbor_list.h"
9
10Rigidity::Rigidity(const MatrixXd& coordinates)
11 : coordinates(coordinates)
12{
13 std::cout << "Constructing rigidity matrix" << std::endl;
14 size_t numberOfParticles= coordinates.rows();
15 std::cout << "Number of particles = " << numberOfParticles << std::endl;
16 int halfNlSize= (numberOfParticles*(numberOfParticles-1))/2;
17
18 matrixR.resize(halfNlSize,DIM*numberOfParticles);
19 matrixRTR.resize(DIM*numberOfParticles,DIM*numberOfParticles);
20 matrixR.setZero();
21 int index= -1;
22 for(int i_particle1=0; i_particle1<numberOfParticles; ++i_particle1)
23 {
24 // Loop through the neighbors of particle1 in the halfNl
25 for(int i_particle2= i_particle1+1; i_particle2<numberOfParticles; i_particle2++)
26 {
27 index++;
28 Vector3d rab= coordinates.row(i_particle1)-coordinates.row(i_particle2);
29 for(size_t k=0; k<2*DIM; k++) {
30 if (k < DIM)
31 matrixR(index,DIM * i_particle1 + k)= rab(k) / rab.norm();
32 else
33 matrixR(index, DIM * i_particle2 + k - DIM)= -rab(k - DIM) / rab.norm();
34 }
35 }
36 }
37 matrixRTR= matrixR.transpose() * matrixR;
38}
39
40std::vector<double> Rigidity::project(const Eigen::VectorXd& b) const{
41 VectorXd u,h;
42 u.setZero();
43 //Eigen::ConjugateGradient<Eigen::MatrixXd, Eigen::Lower|Eigen::Upper, Eigen::IncompleteCholesky<double>> cg;
44 //Eigen::LeastSquaresConjugateGradient<Eigen::MatrixXd> cg;
45 //u= cg.compute(matrixRTR).solve(b);
46 //std::cout << "#iterations: " << cg.iterations() << std::endl;
47 //std::cout << "estimated error: " << cg.error() << std::endl;
48
49
50 Eigen::BDCSVD<Eigen::MatrixXd> cg;
51 cg.compute(matrixRTR,Eigen::ComputeThinU | Eigen::ComputeThinV);
52 u= cg.solve(b);
53 double residualError= (matrixRTR*u.transpose()-b).norm()/b.norm();
54 if (residualError>1e-5) {
55 std::cout << "residual = " << residualError << ". Residual error too big." << std::endl;
56 }
57
58 h= matrixR*u.transpose();
59 std::vector<double> hij(h.size(),0.0);
60
61 for(int i=0; i<h.size(); ++i)
62 hij[i]=h(i);
63
64 return hij;
65}
66
67
Eigen::MatrixXd matrixR
Definition Rigidity.h:16
Eigen::MatrixXd matrixRTR
Definition Rigidity.h:16
Rigidity(const MatrixXd &coordinates)
Definition Rigidity.cpp:10
std::vector< double > project(const Eigen::VectorXd &gi) const
Definition Rigidity.cpp:40
const MatrixXd & coordinates
Definition Rigidity.h:17
double norm(double const *a)
Definition helper.hpp:20
#define DIM
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > MatrixXd
Definition typedef.h:54
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor > VectorXd
Definition typedef.h:59
Eigen::Matrix< double, 1, DIM, Eigen::RowMajor > Vector3d
Definition typedef.h:60