83 Real cell_dimension_1,
84 Real cell_dimension_2 = 0,
85 Real cell_dimension_3 = 0,
86 Real cell_dimension_4 = 0,
87 Real cell_dimension_5 = 0,
88 Real cell_dimension_6 = 0) {
90 Real ratio_c_over_a = cell_dimension_3;
91 Real ratio_b_over_a = cell_dimension_2;
93 switch (bravais_lattice_index) {
99 lattice_vectors[0] = {1.0, 0.0, 0.0};
100 lattice_vectors[1] = {0.0, 1.0, 0.0};
101 lattice_vectors[2] = {0.0, 0.0, 1.0};
106 lattice_vectors[0] = {1.0, 0.0, 0.0};
107 lattice_vectors[1] = {0.0, 1.0, 0.0};
108 lattice_vectors[2] = {0.0, 0.0, 1.0};
113 lattice_vectors[0] = {-0.5, 0.0, 0.5};
114 lattice_vectors[1] = {0.0, 0.5, 0.5};
115 lattice_vectors[2] = {-0.5, 0.5, 0.0};
120 lattice_vectors[0] = {0.5, 0.5, 0.5};
121 lattice_vectors[1] = {-0.5, 0.5, 0.5};
122 lattice_vectors[2] = {-0.5, -0.5, 0.5};
127 lattice_vectors[0] = {-0.5, 0.5, 0.5};
128 lattice_vectors[1] = {0.5, -0.5, 0.5};
129 lattice_vectors[2] = {0.5, 0.5, -0.5};
134 Real half_sqrt3 = std::sqrt(3.0) / 2.0;
135 lattice_vectors[0] = {1.0, 0.0, 0.0};
136 lattice_vectors[1] = {-0.5, half_sqrt3, 0.0};
137 lattice_vectors[2] = {0.0, 0.0, ratio_c_over_a};
143 Real cos_alpha = cell_dimension_4;
144 Real vector_component_x = std::sqrt((1.0 - cos_alpha) / 2.0);
145 Real vector_component_y = std::sqrt((1.0 - cos_alpha) / 6.0);
146 Real vector_component_z = std::sqrt((1.0 + 2.0 * cos_alpha) / 3.0);
147 lattice_vectors[0] = {vector_component_x, -vector_component_y, vector_component_z};
148 lattice_vectors[1] = {0.0, 2.0 * vector_component_y, vector_component_z};
149 lattice_vectors[2] = {-vector_component_x, -vector_component_y, vector_component_z};
155 Real cos_alpha = cell_dimension_4;
156 Real vector_component_y = std::sqrt((1.0 - cos_alpha) / 6.0);
157 Real vector_component_z = std::sqrt((1.0 + 2.0 * cos_alpha) / 3.0);
158 Real vector_component_u =
159 vector_component_z - 2.0 * std::sqrt(2.0) * vector_component_y;
160 Real vector_component_v = vector_component_z + std::sqrt(2.0) * vector_component_y;
161 lattice_vectors[0] = {vector_component_u / std::sqrt(3.0),
162 vector_component_v / std::sqrt(3.0),
163 vector_component_v / std::sqrt(3.0)};
164 lattice_vectors[1] = {vector_component_v / std::sqrt(3.0),
165 vector_component_u / std::sqrt(3.0),
166 vector_component_v / std::sqrt(3.0)};
167 lattice_vectors[2] = {vector_component_v / std::sqrt(3.0),
168 vector_component_v / std::sqrt(3.0),
169 vector_component_u / std::sqrt(3.0)};
175 lattice_vectors[0] = {1.0, 0.0, 0.0};
176 lattice_vectors[1] = {0.0, 1.0, 0.0};
177 lattice_vectors[2] = {0.0, 0.0, ratio_c_over_a};
182 lattice_vectors[0] = {0.5, -0.5, 0.5 * ratio_c_over_a};
183 lattice_vectors[1] = {0.5, 0.5, 0.5 * ratio_c_over_a};
184 lattice_vectors[2] = {-0.5, -0.5, 0.5 * ratio_c_over_a};
189 lattice_vectors[0] = {1.0, 0.0, 0.0};
190 lattice_vectors[1] = {0.0, ratio_b_over_a, 0.0};
191 lattice_vectors[2] = {0.0, 0.0, ratio_c_over_a};
199 lattice_vectors[0] = {0.5, 0.5 * ratio_b_over_a, 0.0};
200 lattice_vectors[1] = {-0.5, 0.5 * ratio_b_over_a, 0.0};
201 lattice_vectors[2] = {0.0, 0.0, ratio_c_over_a};
209 lattice_vectors[0] = {0.5, 0.0, 0.5 * ratio_c_over_a};
210 lattice_vectors[1] = {0.5, 0.5 * ratio_b_over_a, 0.0};
211 lattice_vectors[2] = {0.0, 0.5 * ratio_b_over_a, 0.5 * ratio_c_over_a};
219 lattice_vectors[0] = {0.5, 0.5 * ratio_b_over_a, 0.5 * ratio_c_over_a};
220 lattice_vectors[1] = {-0.5, 0.5 * ratio_b_over_a, 0.5 * ratio_c_over_a};
221 lattice_vectors[2] = {-0.5, -0.5 * ratio_b_over_a, 0.5 * ratio_c_over_a};
229 Real cos_ab = cell_dimension_4;
230 Real sin_ab = std::sqrt(1.0 - cos_ab * cos_ab);
231 lattice_vectors[0] = {1.0, 0.0, 0.0};
232 lattice_vectors[1] = {ratio_b_over_a * cos_ab, ratio_b_over_a * sin_ab, 0.0};
233 lattice_vectors[2] = {0.0, 0.0, ratio_c_over_a};
239 Real cos_ac = cell_dimension_5;
240 Real sin_ac = std::sqrt(1.0 - cos_ac * cos_ac);
241 lattice_vectors[0] = {1.0, 0.0, 0.0};
242 lattice_vectors[1] = {0.0, ratio_b_over_a, 0.0};
243 lattice_vectors[2] = {ratio_c_over_a * cos_ac, 0.0, ratio_c_over_a * sin_ac};
252 Real cos_bc = cell_dimension_4;
253 Real cos_ac = cell_dimension_5;
254 Real cos_ab = cell_dimension_6;
255 Real sin_ab = std::sqrt(1.0 - cos_ab * cos_ab);
256 lattice_vectors[0] = {1.0, 0.0, 0.0};
257 lattice_vectors[1] = {ratio_b_over_a * cos_ab, ratio_b_over_a * sin_ab, 0.0};
258 Real vector_component_c_x = ratio_c_over_a * cos_ac;
259 Real vector_component_c_y = ratio_c_over_a * (cos_bc - cos_ac * cos_ab) / sin_ab;
260 Real vector_component_c_z =
262 std::sqrt(1.0 + 2.0 * cos_bc * cos_ac * cos_ab - cos_bc * cos_bc - cos_ac * cos_ac -
265 lattice_vectors[2] = {vector_component_c_x, vector_component_c_y, vector_component_c_z};
270 throw std::runtime_error(
271 "Unsupported bravais_lattice_index=" + std::to_string(bravais_lattice_index) +
272 ". Supported: 0 (free), 1 (SC), 2 (FCC), 3/-3 (BCC), 4 (hex), 5/-5 (trig R), "
273 "6 (tet), 7 (bct), 8 (ort), 9 (bco), 10 (fco), 11 (bort), "
274 "12/-12 (mono), 14 (tri)");
277 return lattice_vectors;