ppap4lmp  0.7.2
add_dihedral_angle.cpp
Go to the documentation of this file.
1 
9 #include "add_dihedral_angle.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({"atom1-id", "atom2-id","atom3-id", "atom4-id"});
30 
31  auto el_atoms = ext_generator->get_element();
32 
33  el_atoms->check_required_keys({"id", "xu", "yu", "zu"});
34 
35  auto id2index_atom = ut::map_to_index(el_atoms->get_data(), "id");
36 
37  ArrayXXd rs_atom;
38  el_atoms->make_2darray_from_data(rs_atom, {"xu", "yu", "zu"});
39 
40  const double rad2deg = 180.0 / M_PI;
41 
42  for (auto &d : data)
43  {
44  RowVector3d r1 = rs_atom.row(id2index_atom[d["atom1-id"]]);
45  RowVector3d r2 = rs_atom.row(id2index_atom[d["atom2-id"]]);
46  RowVector3d r3 = rs_atom.row(id2index_atom[d["atom3-id"]]);
47  RowVector3d r4 = rs_atom.row(id2index_atom[d["atom4-id"]]);
48 
49  auto vec_1to2 = r2 - r1;
50  auto vec_2to3 = r3 - r2;
51  auto vec_3to4 = r4 - r3;
52 
53  auto n123 = vec_1to2.cross(vec_2to3);
54  auto n234 = vec_2to3.cross(vec_3to4);
55 
56  d["dihedral-angle"] = rad2deg * acos(
57  n123.dot(n234) / (n123.norm() * n234.norm()));
58  }
59 }
This file has a definition of AddDihedralAngle class, which is a subclass of Adder class...
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
virtual void compute_impl(Json &data, JsonToVoidFunc check_required_keys, JsonToBoolFunc check_optional_keys) override
This method overrides Updater::compute_impl.
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
ShPtr< Generator > ext_generator
Definition: updater.h:64
Namespace for utility functions.
Definition: join.h:14
std::function< void(const Json &)> JsonToVoidFunc
An alias for a function accepts a Json object.
Definition: updater.h:18
AddDihedralAngle(const ElPtr &elem)
Constructor of AddDihedralAngle class.
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...