NDDEM
RigidBody.h
Go to the documentation of this file.
1 
2 #include <algorithm>
3 #include <optional>
4 
5 template <int d>
6 class RigidBody
7 {
8 public:
9  RigidBody() {com=std::vector<double>(d) ; F=std::vector<double>(d,0) ;
10  setvel=std::vector<double>(d,std::numeric_limits<double>::quiet_NaN()) ;
11  addforce=std::vector<double>(d,0.) ;
12  cancelgravity=false ;
13  }
14 
15  //variables
16  std::vector<int> ids ;
17  v1d F, com ;
19  double mass ;
20  bool cancelgravity ;
21 
22  template <class Archive> void serialize(Archive &ar) { ar(ids, F, com, setvel, addforce, mass, cancelgravity) ; }
23 
24  //--------------------------------------------------------------------------------
25  double setparticles(std::vector<int> iid, cv2d & X, cv1d & m)
26  {
27  com=std::vector<double>(d,0) ;
28  F=std::vector<double>(d,0) ;
29  mass=0 ;
30  ids=iid ;
31  std::sort(ids.begin(), ids.end()) ;
32 
33 
34  for (auto &i:ids)
35  {
36  com += (X[i]*m[i]) ;
37  mass += m[i] ;
38  }
39  for (auto & v:com) v/=mass ;
40 
41  return mass ;
42  }
43 } ;
44 
45 //==============================================================================
46 template <int d>
48 {
49 public :
50 
51  std::vector<RigidBody<d>> RB ;
52 
53  template <class Archive> void serialize(Archive &ar) { ar(RB) ; }
54 
55  int allocate (std::vector<std::optional<int>> & RigidBodyId)
56  {
57  for (size_t i=0 ; i<RB.size() ; i++)
58  {
59  for (auto & j: RB[i].ids)
60  {
61  if (RigidBodyId[j].has_value())
62  printf("WARN: grain %d may be allocated to several rigid bodies ...\n", j) ;
63  RigidBodyId[j]=i ;
64  }
65  }
66  return 0;
67  }
68 
69  int process_forces ( std::vector <std::vector<double> > &V, std::vector < std::vector <double> > & F, std::vector < std::vector <double> > & Torque, cv1d & m, cv1d & g)
70  {
71  for (auto & v: RB)
72  {
73  Tools<d>::setzero(v.F) ;
74 
75  for (auto &id : v.ids) v.F += F[id] ;
76  for (auto &id : v.ids)
77  {
78  for (int dd=0 ; dd<d ; dd++)
79  F[id][dd]=v.addforce[dd] + v.F[dd]/v.mass*m[id] - g[dd]*(v.cancelgravity?1:0)*m[id] ;
80  Tools<d>::setzero(Torque[id]) ;
81  for (int dd = 0 ; dd<d ; dd++)
82  if (!isnan(v.setvel[dd]))
83  {
84  F[id][dd]=0 ;
85  V[id][dd]=v.setvel[dd] ;
86  }
87  }
88  }
89  return 0;
90  }
91 };
92 
93 
94 
95 
Definition: RigidBody.h:48
int process_forces(std::vector< std::vector< double > > &V, std::vector< std::vector< double > > &F, std::vector< std::vector< double > > &Torque, cv1d &m, cv1d &g)
Definition: RigidBody.h:69
int allocate(std::vector< std::optional< int >> &RigidBodyId)
Definition: RigidBody.h:55
std::vector< RigidBody< d > > RB
Definition: RigidBody.h:51
void serialize(Archive &ar)
Definition: RigidBody.h:53
Definition: RigidBody.h:7
double mass
Definition: RigidBody.h:19
void serialize(Archive &ar)
Definition: RigidBody.h:22
double setparticles(std::vector< int > iid, cv2d &X, cv1d &m)
Definition: RigidBody.h:25
v1d F
Definition: RigidBody.h:17
std::vector< int > ids
Definition: RigidBody.h:16
bool cancelgravity
Definition: RigidBody.h:20
RigidBody()
Definition: RigidBody.h:9
v1d setvel
Definition: RigidBody.h:18
v1d com
Definition: RigidBody.h:17
v1d addforce
Definition: RigidBody.h:18
static void setzero(v2d &a)
Set a matrix to zero in-place.
Definition: Tools.h:117
const vector< double > cv1d
Definition: Typedefs.h:13
const vector< vector< double > > cv2d
Definition: Typedefs.h:14
vector< double > v1d
Definition: Typedefs.h:9
uint d
PUGI_IMPL_FN void sort(I begin, I end, const Pred &pred)
Definition: pugixml.cpp:7707