ampsci
High-precision calculations for one- and two-valence atomic systems
Wavefunction.hpp
1#pragma once
2#include "CI/CSF.hpp"
3#include "HF/HartreeFock.hpp"
4#include "MBPT/CorrelationPotential.hpp"
5#include "Maths/Grid.hpp"
6#include "Physics/AtomData.hpp"
7#include "Physics/PhysConst_constants.hpp"
8#include "Potentials/NuclearPotentials.hpp"
9#include "Potentials/RadPot.hpp"
10#include "Wavefunction/BSplineBasis.hpp"
11#include "Wavefunction/DiracSpinor.hpp"
12#include "json/json.hpp"
13#include <iostream>
14#include <memory>
15#include <numeric>
16#include <optional>
17#include <string>
18#include <utility>
19#include <vector>
20
21namespace SplineBasis {
22struct Parameters;
23}
24
25//==============================================================================
26/*!
27@brief Stores Wavefunction (set of valence orbitals, grid, HF etc.)
28@details
29\par Construction:
30 - Set of GridParameters [see Maths/Grid]
31 - Set of Nuclear::Nucleus [see Physics/NuclearPotentials]
32 - var_alpha = \f$\lambda\f$, \f$\alpha = \lambda\alpha_0\f$
33 - run_label: Optional label for output identity - for distinguishing
34 outputs with different parameters
35
36*/
38
39public:
40 //! Construct with a Grid [shared resource], a nucleus (isotope data etc.),
41 //! and (optional) fractional variation in alpha [alpha = var_alpha *
42 //! alpha_0, alpha_0=~1/137]
43 Wavefunction(std::shared_ptr<const Grid> grid,
44 const Nuclear::Nucleus &nucleus, double var_alpha = 1.0,
45 const std::string &run_label = "");
46 //! As above, but Grid is constructed here using given parameters
47 Wavefunction(const GridParameters &gridparams,
48 const Nuclear::Nucleus &nucleus, double var_alpha = 1.0,
49 const std::string &run_label = "");
50
52
53private:
54 // Radial grid
55 std::shared_ptr<const Grid> rgrid;
56 // Internal value for alpha (alpha = var_alpha * alpha_0, alpha_0=~1/137)
57 double m_alpha;
58 std::string m_run_label;
59 // Holds nuclear parameters (isotope, charge distro etc.)
60 Nuclear::Nucleus m_nucleus;
61 // Valence (single-particle) orbitals
62 std::vector<DiracSpinor> m_valence{};
63 std::vector<DiracSpinor> m_hf_valence{};
64 // Basis, daigonalised over HF core. Used for MBPT
65 std::vector<DiracSpinor> m_basis{};
66 // Sprectrum: like basis, but includes Sigma (correlations).
67 std::vector<DiracSpinor> m_spectrum{};
68 // Nuclear potential // here AND hf?
69 std::vector<double> m_vnuc{};
70 // Hartree-Fock potential
71 std::optional<HF::HartreeFock> m_HF{std::nullopt};
72 // Correlation potential; for now unique_ptr; prefer std::optional
73 std::optional<MBPT::CorrelationPotential> m_Sigma{};
74 // Core configuration (non-rel terms)
75 std::string m_core_string = "";
76 std::string m_aboveFermi_core_string = "";
77
78 std::vector<CI::PsiJPi> m_CIwfs{};
79
80public:
81 //! Returns a const reference to the radial grid
82 const Grid &grid() const { return *rgrid; };
83 //! Copy of shared_ptr to grid [shared resource] - used when we want to
84 //! construct a new object that shares this grid
85 std::shared_ptr<const Grid> grid_sptr() const { return rgrid; };
86
87 //! Local value of fine-structure constant.
88 double alpha() const { return m_alpha; }
89
90 //! Variation in alpha^2 : x = (alpha/alpha_0)^2 - 1
91 double dalpha2() const {
92 // (alpha/alpha_0)^2 -1
93 return (m_alpha * m_alpha / PhysConst::alpha2) - 1.0;
94 }
95
96 //! Returns Nuclear::nucleus object (contains nuc. parameters)
97 const Nuclear::Nucleus &nucleus() const { return m_nucleus; }
98 //! Nuclear charge, Z
99 int Znuc() const { return m_nucleus.z(); }
100 //! Nuclear mass number, A
101 int Anuc() const { return m_nucleus.a(); }
102 //! Nuclear rms charge radii, in fm (femptometres)
103 double get_rrms() const { return m_nucleus.r_rms(); }
104
105 //! Core orbitals (frozen HF core)
106 const std::vector<DiracSpinor> &core() const {
107 static const auto empty = std::vector<DiracSpinor>{}; //?
108 return m_HF ? m_HF->core() : empty;
109 }
110
111 //! Valence orbitals (HF or Brueckner orbitals)
112 const std::vector<DiracSpinor> &valence() const { return m_valence; }
113 std::vector<DiracSpinor> &valence() { return m_valence; }
114
115 const std::vector<DiracSpinor> &hf_valence() const { return m_hf_valence; }
116
117 //! Basis, eigenstates of HF potential. Used for MBPT. Includes Breit and
118 //! QED (if they are included), but not correlations
119 const std::vector<DiracSpinor> &basis() const { return m_basis; }
120 std::vector<DiracSpinor> &basis() { return m_basis; }
121
122 //! Sprectrum: like basis, but includes correlations
123 const std::vector<DiracSpinor> &spectrum() const { return m_spectrum; }
124 std::vector<DiracSpinor> &spectrum() { return m_spectrum; }
125
126 const std::vector<CI::PsiJPi> &CIwfs() const { return m_CIwfs; }
127
128 const CI::PsiJPi *CIwf(int J, int parity) const {
129 for (const auto &ci_wf : m_CIwfs) {
130 if (ci_wf.twoJ() == 2 * J && ci_wf.parity() == parity)
131 return &ci_wf;
132 }
133 return nullptr;
134 }
135
136 //! Nuclear potential. Only provide const version, since HF and WF version of
137 //! vnuc must be kept in sync
138 const std::vector<double> &vnuc() const { return m_vnuc; }
139
140 //! Returns ptr to Hartree Fock (class)
141 const HF::HartreeFock *vHF() const { return m_HF ? &*m_HF : nullptr; }
142 HF::HartreeFock *vHF() { return m_HF ? &*m_HF : nullptr; }
143
144 //! Local part of potential, e.g., Vl = Vnuc + Vdir + Vrad_el(l) - can be
145 //! l-dependent. Returns a copy
146 std::vector<double> vlocal(int l = 0) const;
147
148 //! QED Magnetic form factor. May return empty vector. Not typically
149 //! l-dependent, but may be in future. Returns a copy
150 std::vector<double> Hmag(int l = 0) const;
151
152 //! Pointer to QED radiative potnential. May be nullptr
153 const QED::RadPot *vrad() const { return m_HF ? m_HF->Vrad() : nullptr; }
154 QED::RadPot *vrad() { return m_HF ? m_HF->Vrad() : nullptr; }
155
156 //! Returns ptr to (const) Correlation Potential, Sigma
157 const MBPT::CorrelationPotential *Sigma() const {
158 return m_Sigma ? &*m_Sigma : nullptr;
159 }
160 MBPT::CorrelationPotential *Sigma() { return m_Sigma ? &*m_Sigma : nullptr; }
161
162 //----------------------------------
163
164 //! Number of electrons in the core
165 int Ncore() const;
166
167 //! Finds requested state; returns nullptr if not found
168 //! @details is_valence is optional out-parameter; tells you where orb was
169 //! found
170 const DiracSpinor *getState(int n, int k) const;
171 //! As above, but takes 'short symbol' (e.g., 6s+, 6p-)
172 const DiracSpinor *getState(std::string_view state) const;
173
174 //! Returns energy location of the "Fermi Level", - energy half way between core/valence. Defined: 0.5*( max(e_core) + min(e_valence)). Should be -ve
175 double FermiLevel() const;
176
177 //! Energy gap between lowest valence + highest core state: e(v) - e(c)
178 //! [should be positive]
179 double energy_gap() const;
180
181 //! Returns full core configuration
182 std::string coreConfiguration() const { return m_core_string; }
183
184 //! Returns core configuration, in nice output notation
185 std::string coreConfiguration_nice() const {
186 return AtomData::niceCoreOutput(m_core_string);
187 }
188
189 //! String of atom info (e.g., "Cs, Z=55, A=133")
190 std::string atom() const {
191 return AtomData::atomicSymbol(m_nucleus.z()) +
192 ", Z=" + std::to_string(m_nucleus.z()) +
193 " A=" + std::to_string(m_nucleus.a());
194 }
195
196 //! e.g., "Cs"
197 std::string atomicSymbol() const {
198 return AtomData::atomicSymbol(m_nucleus.z());
199 }
200
201 //! Atomic symbol, including core ionisation degree and run_label
202 std::string identity() const;
203
204 //! Atomic symbol, including core ionisation degree and run_label
205 const std::string &run_label() const { return m_run_label; };
206
207 //! 0 for neutral, 1 for singly-ionised etc.
208 int ion_degree(int num_val) const { return Zion() - num_val; }
209
210 //! I for neutral, II for singly-ionised etc.
211 std::string ion_symbol(int num_val) const {
212 return qip::int_to_roman(Zion() - num_val + 1);
213 }
214
215 //! Effective charge (for core) = Z-N_core
216 int Zion() const { return Znuc() - Ncore(); }
217
218 //! Prints table of core orbitals + energies etc.
219 void printCore() const;
220 //! @brief Prints table of valence orbitals + energies etc.
221 //! @details Can optionally give it any list of orbitals to print
222 void printValence(const std::vector<DiracSpinor> &tmp_orbitals = {}) const;
223
224 //! Prints table of Basis/Spectrum orbitals, compares to HF orbitals
225 void printBasis(const std::vector<DiracSpinor> &the_basis) const;
226
227 //! Check if a state is in the core (or valence) list
228 bool isInCore(int n, int k) const;
229 bool isInValence(int n, int k) const;
230
231 //! Calculates rho(r) = sum_c psi^2(r) for core states, c={n,k,m}
232 std::vector<double> coreDensity() const;
233
234 //! Calculates HF core energy (doesn't include magnetic QED?)
235 double coreEnergyHF() const;
236
237 //------------------------------------------------------------------
238
239 //! Initialises HF object and populates core orbitals (does not solve HF
240 //! equations)
241 void set_HF(const std::string &method = "HartreeFock",
242 const double x_Breit = 0.0, const std::string &in_core = "",
243 double eps_HF = 1.0e-13, bool print = true);
244
245 //! Performs hartree-Fock procedure for core
246 void solve_core(bool print = true);
247
248 //! This version will first set_HF(), then solve_core()
249 void solve_core(const std::string &method, const double x_Breit = 0.0,
250 const std::string &in_core = "", double eps_HF = 1.0e-13,
251 bool print = true);
252
253 //! Performs hartree-Fock procedure for valence: note: poplulates valnece
254 void solve_valence(const std::string &in_valence_str = "",
255 const bool print = true);
256
257 //! @brief Solves for exotic atoms (e.g., muonic), including screening.
258 //! Resulting states are included in valence; the screening also updates core.
259 //! @details
260 //! Note: The exotic states are just added to the valence list, so they can be
261 //! used more simply with all the modules.
262 //! However, be careful; for example, RPA will now be meaningless!
263 void solve_exotic(const std::string &in_exotic_str,
264 double mass = PhysConst::m_muon, bool print = true);
265
266 //! Forms Bruckner valence orbitals: (H_hf + Sigma)|nk> = e|nk>. Replaces
267 //! existing valence states
268 void hartreeFockBrueckner(const bool print = true);
269
270 //! First, fits Sigma to energies, then forms fitted Brueckner orbitals
271 void fitSigma_hfBrueckner(const std::string &valence_list,
272 const std::vector<double> &fit_energies);
273
274 //! OLD: deprecated
275 void radiativePotential(QED::RadPot::Scale s, double rcut, double scale_rN,
276 const std::vector<double> &x_spd,
277 bool do_readwrite = true, bool print = true);
278
279 //! Calculates radiative potential, adds to HF potential
280 void radiativePotential(const IO::InputBlock &qed_input, bool do_readwrite,
281 bool print);
282
283 //! Calculates + populates basis [see BSplineBasis]
284 void formBasis(const SplineBasis::Parameters &params);
285
286 //! Calculates + populates Spectrum [see BSplineBasis]
287 void formSpectrum(const SplineBasis::Parameters &params);
288
289 //! Forms + stores correlation potential Sigma
290 void formSigma(int nmin_core = 1, double r0 = 1.0e-4, double rmax = 30.0,
291 int stride = 4, bool each_valence = false,
292 bool include_G = false, bool include_Breit = false,
293 int n_max_breit = 0, const std::vector<double> &lambdas = {},
294 const std::vector<double> &fk = {},
295 const std::vector<double> &etak = {}, bool read_write = true,
296 const std::string &fname = "", bool FeynmanQ = false,
297 bool ScreeningQ = false, bool hole_particleQ = false,
298 int lmax = 6, double omre = -0.2, double w0 = 0.01,
299 double wratio = 1.5,
300 const std::optional<IO::InputBlock> &ek = std::nullopt);
301
302 // void correlations(const IO::InputBlock &input);
303
304 void copySigma(const MBPT::CorrelationPotential *const Sigma) {
305 if (Sigma != nullptr)
306 m_Sigma = *Sigma;
307 }
308
309 //! Allows extra potential to be added to Vnuc (updates both in Wavefunction
310 // _and_ HartreeFock)
311 void update_Vnuc(const std::vector<double> &v_new) {
312 /// nb: two versions of Vnuc...
313 m_vnuc = v_new;
314 if (m_HF) {
315 m_HF->vnuc() = v_new;
316 }
317 }
318
319 //! @brief Returns [min,max] r values for which the core density (given l) is
320 //! larger than cutoff (= eps*max_value)
321 //! @details Returns the r values (au) for which the value of rho =
322 //! \sum|psi^2|(r) drops below cutoff. Sum goes over all m for given l.
323 //! Cut-off defined as eps*max, where max is maximum value for rho(r).
324 //! Set l<0 to get for all l (entire core)
325 std::tuple<double, double> lminmax_core_range(int l, double eps = 0.0) const;
326
327 //! Returns <a|H|b> for Hamiltonian H (inludes Rad.pot, NOT sigma, Breit, or exchange!)
328 double H0ab(const DiracSpinor &Fa, const DiracSpinor &Fb) const;
329 //! Returns <a|H|b> for Hamiltonian H (inludes Rad.pot, NOT sigma, Breit, or exchange!)
330 double H0ab(const DiracSpinor &Fa, const DiracSpinor &dFa,
331 const DiracSpinor &Fb, const DiracSpinor &dFb) const;
332
333 double Hab(const DiracSpinor &Fa, const DiracSpinor &Fb) const;
334
335 //! Runs the CI+MBPT routines; stores wavefunctions
336 void ConfigurationInteraction(const IO::InputBlock &input);
337
338 //! Writes wavefunction information to json file;
339 //! if out_name given, will print to that file
340 nlohmann::json
341 output_to_json(const std::string &out_name = "ampsci_output.json");
342
343private:
344 double H0ab_impl(const DiracSpinor &Fa, std::vector<double> dga,
345 const DiracSpinor &Fb, std::vector<double> dgb) const;
346
347 // Creates set of blank core orbitals
348 std::vector<DiracSpinor> determineCore(const std::string &str_core_in);
349 bool isInAboveFermiCore(int n, int k) const;
350};
Stores the CI Solutions for given J and parity (only two-electron).
Definition CSF.hpp:63
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:41
Holds grid, including type + Jacobian (dr/du)
Definition Grid.hpp:31
Solves relativistic Hartree-Fock equations for core and valence. Optionally includes Breit and QED ef...
Definition HartreeFock.hpp:71
Holds list of Options, and a list of other InputBlocks. Can be initialised with a list of options,...
Definition InputBlock.hpp:142
Stores set of nuclear parameters (all radii in fm)
Definition NuclearPotentials.hpp:20
Class holds Flambaum-Ginges QED Radiative Potential.
Definition RadPot.hpp:15
Scale factors for Uehling, high, low, magnetic, Wickman-Kroll.
Definition RadPot.hpp:20
Stores Wavefunction (set of valence orbitals, grid, HF etc.)
Definition Wavefunction.hpp:37
void fitSigma_hfBrueckner(const std::string &valence_list, const std::vector< double > &fit_energies)
First, fits Sigma to energies, then forms fitted Brueckner orbitals.
Definition Wavefunction.cpp:610
void solve_valence(const std::string &in_valence_str="", const bool print=true)
Performs hartree-Fock procedure for valence: note: poplulates valnece.
Definition Wavefunction.cpp:185
void formBasis(const SplineBasis::Parameters &params)
Calculates + populates basis [see BSplineBasis].
Definition Wavefunction.cpp:469
void solve_core(bool print=true)
Performs hartree-Fock procedure for core.
Definition Wavefunction.cpp:164
const std::vector< DiracSpinor > & core() const
Core orbitals (frozen HF core)
Definition Wavefunction.hpp:106
void printValence(const std::vector< DiracSpinor > &tmp_orbitals={}) const
Prints table of valence orbitals + energies etc.
Definition Wavefunction.cpp:407
const Grid & grid() const
Returns a const reference to the radial grid.
Definition Wavefunction.hpp:82
double coreEnergyHF() const
Calculates HF core energy (doesn't include magnetic QED?)
Definition Wavefunction.cpp:177
std::tuple< double, double > lminmax_core_range(int l, double eps=0.0) const
Returns [min,max] r values for which the core density (given l) is larger than cutoff (= eps*max_valu...
Definition Wavefunction.cpp:349
const DiracSpinor * getState(int n, int k) const
Finds requested state; returns nullptr if not found.
Definition Wavefunction.cpp:290
int Znuc() const
Nuclear charge, Z.
Definition Wavefunction.hpp:99
double energy_gap() const
Energy gap between lowest valence + highest core state: e(v) - e(c) [should be positive].
Definition Wavefunction.cpp:336
std::string identity() const
Atomic symbol, including core ionisation degree and run_label.
Definition Wavefunction.cpp:682
std::string coreConfiguration() const
Returns full core configuration.
Definition Wavefunction.hpp:182
nlohmann::json output_to_json(const std::string &out_name="ampsci_output.json")
Writes wavefunction information to json file; if out_name given, will print to that file.
Definition Wavefunction.cpp:912
int Zion() const
Effective charge (for core) = Z-N_core.
Definition Wavefunction.hpp:216
std::vector< double > vlocal(int l=0) const
Local part of potential, e.g., Vl = Vnuc + Vdir + Vrad_el(l) - can be l-dependent....
Definition Wavefunction.cpp:663
const std::string & run_label() const
Atomic symbol, including core ionisation degree and run_label.
Definition Wavefunction.hpp:205
std::vector< double > Hmag(int l=0) const
QED Magnetic form factor. May return empty vector. Not typically l-dependent, but may be in future....
Definition Wavefunction.cpp:668
std::vector< double > coreDensity() const
Calculates rho(r) = sum_c psi^2(r) for core states, c={n,k,m}.
Definition Wavefunction.cpp:457
int ion_degree(int num_val) const
0 for neutral, 1 for singly-ionised etc.
Definition Wavefunction.hpp:208
int Anuc() const
Nuclear mass number, A.
Definition Wavefunction.hpp:101
std::string atomicSymbol() const
e.g., "Cs"
Definition Wavefunction.hpp:197
void radiativePotential(QED::RadPot::Scale s, double rcut, double scale_rN, const std::vector< double > &x_spd, bool do_readwrite=true, bool print=true)
OLD: deprecated.
Definition Wavefunction.cpp:220
std::string ion_symbol(int num_val) const
I for neutral, II for singly-ionised etc.
Definition Wavefunction.hpp:211
double get_rrms() const
Nuclear rms charge radii, in fm (femptometres)
Definition Wavefunction.hpp:103
const std::vector< DiracSpinor > & spectrum() const
Sprectrum: like basis, but includes correlations.
Definition Wavefunction.hpp:123
const MBPT::CorrelationPotential * Sigma() const
Returns ptr to (const) Correlation Potential, Sigma.
Definition Wavefunction.hpp:157
std::string coreConfiguration_nice() const
Returns core configuration, in nice output notation.
Definition Wavefunction.hpp:185
void formSpectrum(const SplineBasis::Parameters &params)
Calculates + populates Spectrum [see BSplineBasis].
Definition Wavefunction.cpp:489
const std::vector< DiracSpinor > & valence() const
Valence orbitals (HF or Brueckner orbitals)
Definition Wavefunction.hpp:112
std::shared_ptr< const Grid > grid_sptr() const
Copy of shared_ptr to grid [shared resource] - used when we want to construct a new object that share...
Definition Wavefunction.hpp:85
void printCore() const
Prints table of core orbitals + energies etc.
Definition Wavefunction.cpp:375
bool isInCore(int n, int k) const
Check if a state is in the core (or valence) list.
Definition Wavefunction.cpp:261
std::string atom() const
String of atom info (e.g., "Cs, Z=55, A=133")
Definition Wavefunction.hpp:190
double alpha() const
Local value of fine-structure constant.
Definition Wavefunction.hpp:88
double H0ab(const DiracSpinor &Fa, const DiracSpinor &Fb) const
Returns <a|H|b> for Hamiltonian H (inludes Rad.pot, NOT sigma, Breit, or exchange!...
Definition Wavefunction.cpp:713
const HF::HartreeFock * vHF() const
Returns ptr to Hartree Fock (class)
Definition Wavefunction.hpp:141
void ConfigurationInteraction(const IO::InputBlock &input)
Runs the CI+MBPT routines; stores wavefunctions.
Definition Wavefunction.cpp:772
void update_Vnuc(const std::vector< double > &v_new)
Allows extra potential to be added to Vnuc (updates both in Wavefunction.
Definition Wavefunction.hpp:311
void formSigma(int nmin_core=1, double r0=1.0e-4, double rmax=30.0, int stride=4, bool each_valence=false, bool include_G=false, bool include_Breit=false, int n_max_breit=0, const std::vector< double > &lambdas={}, const std::vector< double > &fk={}, const std::vector< double > &etak={}, bool read_write=true, const std::string &fname="", bool FeynmanQ=false, bool ScreeningQ=false, bool hole_particleQ=false, int lmax=6, double omre=-0.2, double w0=0.01, double wratio=1.5, const std::optional< IO::InputBlock > &ek=std::nullopt)
Forms + stores correlation potential Sigma.
Definition Wavefunction.cpp:508
void set_HF(const std::string &method="HartreeFock", const double x_Breit=0.0, const std::string &in_core="", double eps_HF=1.0e-13, bool print=true)
Initialises HF object and populates core orbitals (does not solve HF equations)
Definition Wavefunction.cpp:122
const std::vector< double > & vnuc() const
Nuclear potential. Only provide const version, since HF and WF version of vnuc must be kept in sync.
Definition Wavefunction.hpp:138
void solve_exotic(const std::string &in_exotic_str, double mass=PhysConst::m_muon, bool print=true)
Solves for exotic atoms (e.g., muonic), including screening. Resulting states are included in valence...
Definition Wavefunction.cpp:781
void hartreeFockBrueckner(const bool print=true)
Forms Bruckner valence orbitals: (H_hf + Sigma)|nk> = e|nk>. Replaces existing valence states.
Definition Wavefunction.cpp:600
int Ncore() const
Number of electrons in the core.
Definition Wavefunction.cpp:674
const Nuclear::Nucleus & nucleus() const
Returns Nuclear::nucleus object (contains nuc. parameters)
Definition Wavefunction.hpp:97
const std::vector< DiracSpinor > & basis() const
Basis, eigenstates of HF potential. Used for MBPT. Includes Breit and QED (if they are included),...
Definition Wavefunction.hpp:119
const QED::RadPot * vrad() const
Pointer to QED radiative potnential. May be nullptr.
Definition Wavefunction.hpp:153
double FermiLevel() const
Returns energy location of the "Fermi Level", - energy half way between core/valence....
Definition Wavefunction.cpp:317
void printBasis(const std::vector< DiracSpinor > &the_basis) const
Prints table of Basis/Spectrum orbitals, compares to HF orbitals.
Definition Wavefunction.cpp:434
double dalpha2() const
Variation in alpha^2 : x = (alpha/alpha_0)^2 - 1.
Definition Wavefunction.hpp:91
std::string niceCoreOutput(const std::string &full_core)
Given a full electron config., returns nicer format by recognising nobel gas.
Definition AtomData.cpp:198
std::string atomicSymbol(int Z)
e.g., 55 -> "Cs"
Definition AtomData.cpp:64
constexpr double m_muon
muon mass in atomic units (m_mu/m_e). Codata 2022: 206.768 2827(46)
Definition PhysConst_constants.hpp:39
Constucts of spinor/orbital basis using B-splines (DKB/Reno/Derevianko-Beloy method)
Definition BSplineBasis.cpp:20
std::string int_to_roman(int a)
Converts integer, a, to Roman Numerals. Assumed that |a|<=4000.
Definition String.hpp:321
Parmaters used to create Grid.
Definition Grid.hpp:9