Loading...
Searching...
No Matches
Eigen.h
Go to the documentation of this file.
1/*
2 * This file is part of eOn.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 * Copyright (c) 2010--present, eOn Development Team
7 * All rights reserved.
8 *
9 * Repo:
10 * https://github.com/TheochemUI/eOn
11 */
12#pragma once
13
14#include <Eigen/Dense>
15#include <Eigen/Eigenvalues>
16#include <cassert>
17#include <vector>
18
19// Import individual Eigen names rather than `using namespace Eigen` so that
20// eOn's row-major matrix aliases (below) don't collide with Eigen's
21// column-major defaults. This keeps eOn binary-compatible with other
22// Eigen-based libraries that use the default column-major layout.
23using Eigen::Matrix;
24using Eigen::Vector3d;
25using Eigen::VectorXd;
26using Eigen::VectorXi;
27
28// Row-major layout so that each row is one atom's (x, y, z) triplet and
29// .data() yields [x0, y0, z0, x1, y1, z1, ...] which is what the Fortran
30// potentials and VectorXd::Map round-trips expect.
31constexpr int eOnStorageOrder = Eigen::RowMajor;
32
33using MatrixXd =
34 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, eOnStorageOrder>;
35using Matrix3d = Eigen::Matrix<double, 3, 3, eOnStorageOrder>;
36using Matrix4d = Eigen::Matrix<double, 4, 4, eOnStorageOrder>;
37using AtomMatrix = Eigen::Matrix<double, Eigen::Dynamic, 3, eOnStorageOrder>;
38using RotationMatrix = Eigen::Matrix<double, 3, 3, eOnStorageOrder>;
39
40// Column-major layout matching Fortran's memory order: (3, nat).
41// Row-Major (N,3) and Col-Major (3,N) share the same contiguous memory layout,
42// so conversions between AtomMatrix and AtomMatrixF are zero-copy
43// reinterpretations.
44using AtomMatrixF = Eigen::Matrix<double, 3, Eigen::Dynamic, Eigen::ColMajor>;
45
50inline double matDot(const AtomMatrix &a, const AtomMatrix &b) {
51 return Eigen::Map<const VectorXd>(a.data(), a.size())
52 .dot(Eigen::Map<const VectorXd>(b.data(), b.size()));
53}
54
55namespace eonc {
56
60inline AtomMatrix
61from_fortran_layout_vector(const std::vector<double> &flat_colmajor, int nat) {
62 assert(flat_colmajor.size() >= static_cast<size_t>(3 * nat));
63 return Eigen::Map<const AtomMatrix>(flat_colmajor.data(), nat, 3);
64}
65
66} // namespace eonc
Eigen::Matrix< double, 3, 3, eOnStorageOrder > RotationMatrix
Definition Eigen.h:38
double matDot(const AtomMatrix &a, const AtomMatrix &b)
SIMD-optimized dot product for contiguous Eigen matrices.
Definition Eigen.h:50
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, eOnStorageOrder > MatrixXd
Definition Eigen.h:33
Eigen::Matrix< double, 3, 3, eOnStorageOrder > Matrix3d
Definition Eigen.h:35
Eigen::Matrix< double, 4, 4, eOnStorageOrder > Matrix4d
Definition Eigen.h:36
Eigen::Matrix< double, 3, Eigen::Dynamic, Eigen::ColMajor > AtomMatrixF
Definition Eigen.h:44
constexpr int eOnStorageOrder
Definition Eigen.h:31
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition Eigen.h:37
RAII resource manager for the ARTn C library with global synchronization.
AtomMatrix from_fortran_layout_vector(const std::vector< double > &flat_colmajor, int nat)
Reconstruct AtomMatrix from a flat column-major vector (e.g.
Definition Eigen.h:61