43 for (
size_t length : {
size_t{2},
size_t{1}}) {
44 if (species_symbol.size() < length)
46 const std::string element = species_symbol.substr(0, length);
47 if (!std::all_of(element.begin(), element.end(), [](
unsigned char character) {
48 return std::isalpha(character);
53 const std::string rest = species_symbol.substr(length);
55 return {element,
nullptr};
56 const bool all_digits = std::all_of(rest.begin(), rest.end(), [](
unsigned char character) {
57 return std::isdigit(character);
59 if (all_digits && rest.size() < 10)
60 return {element, std::stoi(rest)};
61 return {element, rest};
63 return {species_symbol,
nullptr};
76 const char* row_keys[3] = {
"a",
"b",
"c"};
77 nlohmann::json vectors = {{
"units",
"angstrom"}};
78 Real lengths_angstrom[3];
79 for (
int row = 0; row < 3; ++row) {
81 vectors[row_keys[row]] = {vector_angstrom[0], vector_angstrom[1], vector_angstrom[2]};
82 lengths_angstrom[row] = vector_angstrom.
norm();
84 auto angle_degrees = [&](
int first,
int second) {
85 const Real cosine = vectors_bohr[first].dot(vectors_bohr[second]) /
86 (vectors_bohr[first].norm() * vectors_bohr[second].norm());
91 basis[
"units"] =
"crystal";
92 basis[
"elements"] = nlohmann::json::array();
93 basis[
"coordinates"] = nlohmann::json::array();
94 basis[
"constraints"] = nlohmann::json::array();
95 nlohmann::json labels = nlohmann::json::array();
96 for (
size_t atom_index = 0; atom_index < input.
atoms.size(); ++atom_index) {
97 const Atom& atom = input.
atoms[atom_index];
98 const int site_id =
static_cast<int>(atom_index) + 1;
99 auto [element, label] =
101 basis[
"elements"].push_back({{
"id", site_id}, {
"value", element}});
102 if (!label.is_null())
103 labels.push_back({{
"id", site_id}, {
"value", label}});
104 basis[
"coordinates"].push_back(
106 basis[
"constraints"].push_back({{
"id", site_id},
113 basis[
"labels"] = labels;
115 return {{
"name", input.
prefix},
116 {
"metadata", nlohmann::json::object()},
118 {{
"a", lengths_angstrom[0]},
119 {
"b", lengths_angstrom[1]},
120 {
"c", lengths_angstrom[2]},
121 {
"alpha", angle_degrees(1, 2)},
122 {
"beta", angle_degrees(0, 2)},
123 {
"gamma", angle_degrees(0, 1)},
124 {
"units", {{
"length",
"angstrom"}, {
"angle",
"degree"}}},
125 {
"vectors", vectors}}},