ppap4lmp  0.7.2
add_inertia_moment.cpp
Go to the documentation of this file.
1 
9 #include "add_inertia_moment.h"
10 #include "../utils/map_to_index.h"
11 
12 namespace ut = utils;
13 
14 /* ------------------------------------------------------------------ */
15 
17  const ElPtr &elem)
18 {
19  ext_generator = elem;
20 }
21 
22 /* ------------------------------------------------------------------ */
23 
25  Json &data,
26  JsonToVoidFunc check_required_keys,
27  JsonToBoolFunc check_optional_keys)
28 {
29  check_required_keys({"atom-ids", "xu", "yu", "zu"});
30 
31  auto el_atoms = ext_generator->get_element();
32 
33  el_atoms->check_required_keys({"id", "mass", "xu", "yu", "zu"});
34 
35  auto id2index_atom = ut::map_to_index(el_atoms->get_data(), "id");
36 
37  ArrayXd ms_atom;
38  el_atoms->make_1darray_from_data(ms_atom, "mass");
39 
40  ArrayXXd rs_atom;
41  el_atoms->make_2darray_from_data(rs_atom, {"xu", "yu", "zu"});
42 
43  for (auto &d : data)
44  {
45  RowArrayXd r_mol(3);
46  r_mol << d["xu"], d["yu"], d["zu"];
47 
48  Matrix3d inertia_tensor = Matrix3d::Zero();
49 
50  auto &atom_ids = d["atom-ids"];
51 
52  auto atom_weights = d.value(
53  "atom-weights", Vec<double>(atom_ids.size(), 1.0));
54 
55  auto n_atoms = atom_ids.size();
56 
57  for (int i = 0; i != n_atoms; ++i)
58  {
59  auto id = atom_ids[i];
60  auto weight = atom_weights[i];
61 
62  auto index = id2index_atom[id];
63  auto mass = ms_atom(index) * weight;
64 
65  RowVector3d dr = rs_atom.row(index) - r_mol;
66 
67  inertia_tensor += mass * dr.transpose() * dr;
68  }
69 
70  auto tr = inertia_tensor.trace();
71 
72  d["I_xx"] = tr - inertia_tensor(0, 0);
73  d["I_yy"] = tr - inertia_tensor(1, 1);
74  d["I_zz"] = tr - inertia_tensor(2, 2);
75  d["I_xy"] = -inertia_tensor(0, 1);
76  d["I_xz"] = -inertia_tensor(0, 2);
77  d["I_yz"] = -inertia_tensor(1, 2);
78  }
79 }
Eigen::RowVector3d RowVector3d
RowVector3d is an alias for a 3-elements row vector of Eigen float numbers.
Definition: eigen.h:110
ShPtr< Element > ElPtr
An alias for a shared pointer of Element class.
Definition: element.h:378
Eigen::Array< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > ArrayXXd
ArrayXXd is an alias for a two-dimensional array of float numbers.
Definition: eigen.h:32
std::function< bool(const Json &)> JsonToBoolFunc
An alias for a function accepts a Json object and returns a bool.
Definition: updater.h:20
nlohmann::json Json
Json is an alias for nlohmann::json.
Definition: json.h:22
Eigen::Array< double, 1, Eigen::Dynamic > RowArrayXd
RowArrayXd is an alias for a row array of float numbers.
Definition: eigen.h:52
ShPtr< Generator > ext_generator
Definition: updater.h:64
AddInertiaMoment(const ElPtr &elem)
Constructor of AddInertiaMoment class.
std::vector< T > Vec
Vec is an alias for vector (same as list in Python).
Definition: std.h:27
This file has a definition of AddInertiaMoment class, which is a subclass of Adder class...
Namespace for utility functions.
Definition: join.h:14
Eigen::Array< double, Eigen::Dynamic, 1 > ArrayXd
ArrayXd is an alias for a column array of float numbers.
Definition: eigen.h:42
std::function< void(const Json &)> JsonToVoidFunc
An alias for a function accepts a Json object.
Definition: updater.h:18
virtual void compute_impl(Json &data, JsonToVoidFunc check_required_keys, JsonToBoolFunc check_optional_keys) override
This method overrides Updater::compute_impl.
Eigen::Matrix3d Matrix3d
Matrix3d is an alias for a 3x3 matrix of float numbers.
Definition: eigen.h:90
Map< Json, int > map_to_index(const Json &data, const Str &key)
Create a Map object from values of selected property in an array Json object to corresponding index i...