ampsci
High-precision calculations for one- and two-valence atomic systems
Grid.hpp
1#pragma once
2#include <string>
3#include <vector>
4
5//==============================================================================
6
7//! Grid type: determines how r is distributed along the uniform u grid
8enum class GridType {
9 //! Log-linear: logarithmic for small r, linear for large r (default)
10 loglinear,
11 //! Purely logarithmic: r = r0 * exp(u)
12 logarithmic,
13 //! Purely linear: r = r0 + u * du
14 linear
15};
16
17//==============================================================================
18
19/*!
20 @brief Parameters used to construct a Grid.
21 @details
22 Bundles all grid construction parameters. Either specify the number of points
23 directly, or set `innum_points = 0` and provide `indu` to have the number of
24 points calculated automatically.
25*/
27 std::size_t num_points;
28 double r0; //!< Minimum grid point
29 double rmax; //!< Maximum grid point
30 double b; //!< Log-linear turning point (~logarithmic for r<b, linear for r>b)
31 GridType type;
32
33 /*!
34 @brief Construct GridParameters.
35 @param innum_points Number of grid points. If 0, calculated from `indu`.
36 @param inr0 Minimum grid point.
37 @param inrmax Maximum grid point.
38 @param inb Log-linear turning point.
39 @param intype Grid type (loglinear, logarithmic, linear).
40 @param indu Uniform step size; only used if `innum_points == 0`.
41 */
42 GridParameters(std::size_t innum_points = 1, double inr0 = 1.0,
43 double inrmax = 1.0, double inb = 4.0,
44 GridType intype = GridType::loglinear, double indu = 0);
45
46 /*!
47 @brief Construct GridParameters with grid type given as a string.
48 @param innum_points Number of grid points. If 0, calculated from `indu`.
49 @param inr0 Minimum grid point.
50 @param inrmax Maximum grid point.
51 @param inb Log-linear turning point.
52 @param str_type Grid type as string: "loglinear", "logarithmic", or "linear".
53 @param indu Uniform step size; only used if `innum_points == 0`.
54 */
55 GridParameters(std::size_t innum_points, double inr0, double inrmax,
56 double inb, const std::string &str_type = "loglinear",
57 double indu = 0);
58
59 //! Converts a string ("loglinear", "logarithmic", "linear") to GridType
60 static GridType parseType(const std::string &str_type);
61 //! Converts a GridType to its string representation
62 static std::string parseType(GridType type);
63};
64
65//==============================================================================
66//==============================================================================
67
68/*!
69 @brief Non-uniform radial grid with Jacobian, suitable for atomic structure
70 calculations.
71 @details
72 Defines a mapping from a uniform grid u = {0, du, 2du, ...} to a
73 non-uniform grid r(u), along with the Jacobian dr/du and the convenience
74 quantity (1/r)(dr/du).
75
76 Three grid types are supported (see `GridType`):
77 - **loglinear** (default): logarithmic at small r, linear at large r;
78 controlled by the turning point `b`.
79 - **logarithmic**: r = r0 * exp(u); good for tightly bound states.
80 - **linear**: uniform spacing in r.
81
82 Grid points and Jacobians are stored as `std::vector<double>` and can be
83 iterated over directly (const iterators only).
84*/
85class Grid {
86
87private:
88 // Minimum grid value
89 double m_r0;
90 // Uniform (u) grid step size
91 double m_du;
92 // GridType: loglinear, logarithmic, linear [enum]
93 GridType gridtype;
94 // log-linear grid 'turning point'
95 double m_b;
96 // Grid values r[i] = r(u)
97 std::vector<double> m_r;
98 // Convinient: (1/r)*(dr/du)[i]
99 std::vector<double> m_drduor;
100 // Jacobian (dr/du)[i]
101 std::vector<double> m_drdu;
102
103public:
104 //! Construct grid directly from parameters
105 Grid(double in_r0, double in_rmax, std::size_t in_num_points,
106 GridType in_gridtype, double in_b = 0);
107
108 //! Construct grid from a GridParameters struct
109 Grid(const GridParameters &in);
110
111 //! Minimum (first) grid point r[0]
112 auto r0() const { return m_r.front(); }
113 //! Minimum (first) grid point r[0]; alias for r0()
114 auto front() const { return m_r.front(); }
115 //! Maximum (last) grid point r[N-1]
116 auto rmax() const { return m_r.back(); }
117 //! Maximum (last) grid point r[N-1]; alias for rmax()
118 auto back() const { return m_r.back(); }
119 //! Number of grid points
120 auto num_points() const { return m_r.size(); }
121 //! Number of grid points; alias for num_points()
122 auto size() const { return num_points(); }
123 //! Uniform step size du
124 auto du() const { return m_du; }
125 //! Grid type (loglinear, logarithmic, or linear)
126 auto type() const { return gridtype; }
127 //! Log-linear turning point b: roughly logarithmic for r<b, linear for r>b
128 auto loglin_b() const { return m_b; }
129
130 //! Full grid vector r
131 const std::vector<double> &r() const { return m_r; }
132 //! Grid point r[i], with range checking
133 auto r(std::size_t i) const { return m_r.at(i); };
134 //! Grid point r[i], with range checking; alias for r(i)
135 auto at(std::size_t i) const { return m_r.at(i); };
136 //! Grid point r[i], with range checking; alias for r(i)
137 auto operator()(std::size_t i) const { return r(i); }
138
139 //! Full Jacobian vector dr/du
140 const std::vector<double> &drdu() const { return m_drdu; };
141 //! Jacobian (dr/du)[i], with range checking
142 auto drdu(std::size_t i) const { return m_drdu.at(i); };
143
144 //! Full vector of (1/r)(dr/du)
145 const std::vector<double> &drduor() const { return m_drduor; };
146 //! (1/r)(dr/du)[i], with range checking
147 auto drduor(std::size_t i) const { return m_drduor.at(i); };
148
149 //! Returns the grid index closest to x. If `require_nearest` is false,
150 //! returns the index of the largest grid point x.
151 std::size_t getIndex(double x, bool require_nearest = false) const;
152
153 //! Returns a human-readable string of grid parameters
154 std::string gridParameters() const;
155
156 //! Returns a vector of r^k for each grid point
157 std::vector<double> rpow(double k) const;
158
159 //! Const iterator to first grid point
160 auto begin() const { return m_r.cbegin(); }
161 //! Const iterator past last grid point
162 auto end() const { return m_r.cend(); }
163 //! Const iterator to first grid point
164 auto cbegin() const { return m_r.cbegin(); }
165 //! Const iterator past last grid point
166 auto cend() const { return m_r.cend(); }
167 //! Const reverse iterator to last grid point
168 auto rbegin() const { return m_r.crbegin(); }
169 //! Const reverse iterator before first grid point
170 auto rend() const { return m_r.crend(); }
171 //! Const reverse iterator to last grid point
172 auto crbegin() const { return m_r.crbegin(); }
173 //! Const reverse iterator before first grid point
174 auto crend() const { return m_r.crend(); }
175
176 /*!
177 @brief Extends the grid to at least `new_rmax`.
178 @details
179 This is the only mutating function; use with caution. The extended grid
180 is not guaranteed to end exactly at `new_rmax` it will typically extend
181 slightly beyond, as new points must land on the existing uniform u grid.
182 */
183 void extend_to(double new_rmax);
184
185 //! Returns a GridParameters struct that can be used to reconstruct this grid
187 return GridParameters{num_points(), m_r0, rmax(), m_b, gridtype, m_du};
188 }
189
190 //! Given r0, rmax, and num_points, calculates the uniform step size du
191 static double calc_du_from_num_points(double in_r0, double in_rmax,
192 std::size_t in_num_points,
193 GridType in_gridtype, double in_b = 0);
194 //! Given r0, rmax, and du, calculates the number of grid points
195 static std::size_t calc_num_points_from_du(double in_r0, double in_rmax,
196 double in_du, GridType in_gridtype,
197 double in_b = 0);
198
199private: // helper fns
200 static double next_r_loglin(double b, double u, double r_guess);
201 static std::vector<double> form_r(const GridType type, const double r0,
202 const std::size_t num_points,
203 const double du, const double b);
204 static std::vector<double> form_drduor(const GridType type,
205 const std::vector<double> &in_r,
206 const double b);
207 static std::vector<double> form_drdu(const GridType type,
208 const std::vector<double> &in_r,
209 const std::vector<double> &in_drduor);
210};
Non-uniform radial grid with Jacobian, suitable for atomic structure calculations.
Definition Grid.hpp:85
const std::vector< double > & r() const
Full grid vector r.
Definition Grid.hpp:131
auto crend() const
Const reverse iterator before first grid point.
Definition Grid.hpp:174
auto drduor(std::size_t i) const
(1/r)(dr/du)[i], with range checking
Definition Grid.hpp:147
auto size() const
Number of grid points; alias for num_points()
Definition Grid.hpp:122
auto rbegin() const
Const reverse iterator to last grid point.
Definition Grid.hpp:168
auto r0() const
Minimum (first) grid point r[0].
Definition Grid.hpp:112
auto begin() const
Const iterator to first grid point.
Definition Grid.hpp:160
auto at(std::size_t i) const
Grid point r[i], with range checking; alias for r(i)
Definition Grid.hpp:135
std::vector< double > rpow(double k) const
Returns a vector of r^k for each grid point.
Definition Grid.cpp:120
auto du() const
Uniform step size du.
Definition Grid.hpp:124
auto rend() const
Const reverse iterator before first grid point.
Definition Grid.hpp:170
void extend_to(double new_rmax)
Extends the grid to at least new_rmax.
Definition Grid.cpp:132
std::string gridParameters() const
Returns a human-readable string of grid parameters.
Definition Grid.cpp:102
static double calc_du_from_num_points(double in_r0, double in_rmax, std::size_t in_num_points, GridType in_gridtype, double in_b=0)
Given r0, rmax, and num_points, calculates the uniform step size du.
Definition Grid.cpp:257
auto operator()(std::size_t i) const
Grid point r[i], with range checking; alias for r(i)
Definition Grid.hpp:137
auto cbegin() const
Const iterator to first grid point.
Definition Grid.hpp:164
static std::size_t calc_num_points_from_du(double in_r0, double in_rmax, double in_du, GridType in_gridtype, double in_b=0)
Given r0, rmax, and du, calculates the number of grid points.
Definition Grid.cpp:277
auto front() const
Minimum (first) grid point r[0]; alias for r0()
Definition Grid.hpp:114
auto crbegin() const
Const reverse iterator to last grid point.
Definition Grid.hpp:172
auto cend() const
Const iterator past last grid point.
Definition Grid.hpp:166
const std::vector< double > & drduor() const
Full vector of (1/r)(dr/du)
Definition Grid.hpp:145
auto r(std::size_t i) const
Grid point r[i], with range checking.
Definition Grid.hpp:133
auto back() const
Maximum (last) grid point r[N-1]; alias for rmax()
Definition Grid.hpp:118
auto end() const
Const iterator past last grid point.
Definition Grid.hpp:162
auto type() const
Grid type (loglinear, logarithmic, or linear)
Definition Grid.hpp:126
const std::vector< double > & drdu() const
Full Jacobian vector dr/du.
Definition Grid.hpp:140
auto num_points() const
Number of grid points.
Definition Grid.hpp:120
auto rmax() const
Maximum (last) grid point r[N-1].
Definition Grid.hpp:116
std::size_t getIndex(double x, bool require_nearest=false) const
Returns the grid index closest to x. If require_nearest is false, returns the index of the largest gr...
Definition Grid.cpp:76
auto loglin_b() const
Log-linear turning point b: roughly logarithmic for r<b, linear for r>b.
Definition Grid.hpp:128
auto drdu(std::size_t i) const
Jacobian (dr/du)[i], with range checking.
Definition Grid.hpp:142
GridParameters params() const
Returns a GridParameters struct that can be used to reconstruct this grid.
Definition Grid.hpp:186
Parameters used to construct a Grid.
Definition Grid.hpp:26
double b
Log-linear turning point (~logarithmic for r<b, linear for r>b)
Definition Grid.hpp:30
static GridType parseType(const std::string &str_type)
Converts a string ("loglinear", "logarithmic", "linear") to GridType.
Definition Grid.cpp:35
double rmax
Maximum grid point.
Definition Grid.hpp:29
double r0
Minimum grid point.
Definition Grid.hpp:28