excgrid 0.1.0
Grid + XC-kernel + D3 library
Loading...
Searching...
No Matches
grid.hpp
1#pragma once
2
3#include "excgrid/error.hpp"
4#include "excgrid/geometry.hpp"
5#include "excgrid/internal/lebedev_tables.hpp"
6
7#include <array>
8#include <cstddef>
9#include <span>
10#include <vector>
11
12namespace excgrid {
13
20
32class RadialGrid {
33public:
40 static Result<RadialGrid> Create(std::size_t pointCount,
41 double alpha,
42 std::size_t exponent = 2);
43
46 [[nodiscard]] std::size_t Size() const noexcept {
47 return _points.size();
48 }
49
52 [[nodiscard]] std::span<const double> Points() const noexcept {
53 return _points;
54 }
55
58 [[nodiscard]] std::span<const double> Weights() const noexcept {
59 return _weights;
60 }
61
62private:
63 RadialGrid(std::vector<double> points, std::vector<double> weights) noexcept;
64
65 std::vector<double> _points;
66 std::vector<double> _weights;
67};
68
78class AngularGrid {
79public:
81 static constexpr std::span<const std::size_t, internal::kLebedevSizeCount> kAvailableSizes =
82 internal::kLebedevSizes;
83
87 static Result<AngularGrid> Create(std::size_t pointCount);
88
91 [[nodiscard]] std::size_t Size() const noexcept {
92 return _size;
93 }
94
97 [[nodiscard]] std::size_t Degree() const noexcept {
98 return _degree;
99 }
100
104 [[nodiscard]] std::array<double, 3> Point(std::size_t index) const noexcept;
105
109 [[nodiscard]] double Weight(std::size_t index) const noexcept;
110
111private:
112 AngularGrid(std::size_t size, std::size_t degree, std::size_t offset) noexcept;
113
114 std::size_t _size;
115 std::size_t _degree;
116 std::size_t _offset;
117};
118
122 std::size_t radialPoints = 75;
123 std::size_t angularPoints = 302;
124 double alpha = 0.5;
125 std::size_t radialExponent = 2;
126 double trimWeight = 1e-15;
127 std::size_t blockTarget = 1024;
128};
129
135struct Block {
136 std::size_t pointCount = 0;
137 std::vector<std::array<double, 3>> points;
138 std::vector<double> weights;
139 std::vector<std::size_t> atomIndex;
140};
141
150class BlockGrid {
151public:
156 static Result<BlockGrid> Create(const Geometry& geometry, const GridParams& params = {});
157
160 [[nodiscard]] std::size_t BlockCount() const noexcept {
161 return _blocks.size();
162 }
163
166 [[nodiscard]] std::span<const Block> Blocks() const noexcept {
167 return _blocks;
168 }
169
172 [[nodiscard]] std::size_t TotalPointCount() const noexcept {
173 return _totalPoints;
174 }
175
176private:
177 BlockGrid(std::vector<Block> blocks, std::size_t totalPoints) noexcept;
178
179 std::vector<Block> _blocks;
180 std::size_t _totalPoints;
181};
182
183} // namespace excgrid
Definition grid.hpp:150
Definition grid.hpp:32
std::expected< T, ErrorCode > Result
Definition error.hpp:23
static Result< AngularGrid > Create(std::size_t pointCount)
std::size_t TotalPointCount() const noexcept
Definition grid.hpp:172
std::vector< double > weights
pointCount quadrature weights.
Definition grid.hpp:138
std::size_t radialExponent
The MHL mapping exponent m.
Definition grid.hpp:125
std::size_t blockTarget
Spatial re-batching target (points per block).
Definition grid.hpp:127
std::array< double, 3 > Point(std::size_t index) const noexcept
std::vector< std::size_t > atomIndex
pointCount owning atoms.
Definition grid.hpp:139
static Result< RadialGrid > Create(std::size_t pointCount, double alpha, std::size_t exponent=2)
std::span< const double > Points() const noexcept
Definition grid.hpp:52
std::size_t pointCount
Points in the block.
Definition grid.hpp:136
std::span< const double > Weights() const noexcept
Definition grid.hpp:58
double alpha
Radial mapping scale, Bohr.
Definition grid.hpp:124
std::size_t Size() const noexcept
Definition grid.hpp:91
double Weight(std::size_t index) const noexcept
std::size_t BlockCount() const noexcept
Definition grid.hpp:160
std::vector< std::array< double, 3 > > points
pointCount positions, Bohr.
Definition grid.hpp:137
double trimWeight
Points with |weight| below this are dropped.
Definition grid.hpp:126
std::size_t Degree() const noexcept
Definition grid.hpp:97
static constexpr std::span< const std::size_t, internal::kLebedevSizeCount > kAvailableSizes
The available point counts, smallest first.
Definition grid.hpp:81
std::span< const Block > Blocks() const noexcept
Definition grid.hpp:166
std::size_t radialPoints
Radial points per atom.
Definition grid.hpp:122
std::size_t Size() const noexcept
Definition grid.hpp:46
std::size_t angularPoints
A Lebedev size (AngularGrid::kAvailableSizes).
Definition grid.hpp:123
static Result< BlockGrid > Create(const Geometry &geometry, const GridParams &params={})
Definition grid.hpp:135
Definition geometry.hpp:24
Definition grid.hpp:121