ampsci
High-precision calculations for one- and two-valence atomic systems
hfs.hpp
1#pragma once
2#include "DiracOperator/TensorOperator.hpp"
3#include "IO/InputBlock.hpp"
4#include "Wavefunction/Wavefunction.hpp"
5#include "fmt/color.hpp"
6#include "qip/Maths.hpp"
7#include <functional>
8
9namespace DiracOperator {
10
11//==============================================================================
12//! Auxillary Functions for hyperfine operatrs; F(r) [nuclear distribution] and similar
13//! @details See \ref DiracOperator::hfs for operator
14namespace Hyperfine {
15
16//! Type for radial function F(r,rN) (type alias to save typing)
17/*! @details
18 - F(r,rN) contains only finite nuclear size correction, not HFS radial function.
19 - F(r,rN) -> 1 for r > rN
20 - r and rN always in atomic units
21*/
22using RadialFunction = std::function<double(double r, double r_Nuc)>;
23
24//==============================================================================
25/*! Forms the hyperfine radial function: F(r,rN)/r^{k+1}
26 @details
27 \f[
28 t^k_{\rm radial}[r_i] = \frac{F(r_i,r_N)}{r_i^{k+1}}
29 \f]
30
31 @param k Multipole rank (1 = M1, 2 = E2, ...)
32 @param rN Nuclear radius (a.u.); passed to F(r,r_N)
33 @param r Radial grid (a.u.)
34 @param hfs_F Finite nuclear magnetisation function F(r,r_N)
35 @return Radial values of t^k(r)
36
37 @note
38 - Angular factors and signs are handled elsewhere.
39 - F(r,r_N) contains only the finite nuclear-size correction.
40 - Default F corresponds to the spherical-ball model.
41 - F(r,r_N) -> 1 for r > r_N.
42*/
43std::vector<double> tk_radial(int k, double rN, const std::vector<double> &r,
44 const RadialFunction &hfs_F);
45
46//==============================================================================
47//! Spherical ball model for F(r,rN) [default]. Uniformly distributed point k-poles.
48/*! @details
49Based on a simple multipole expansion, assuming nucleus is made up from
50uniformly distributed point k-poles. Note: not everyone seems to define this
51the same way!
52
53\f[
54 F(r,r_N) =
55 \begin{cases}
56 (r/r_N)^{2k+1} & r<r_N \\
57 1 & r>r_N \\
58 \end{cases}
59\f]
60*/
62
63//! Spherical shell F(r): 0 for r<rN, 1 for r>rN
65
66//! Pointlike F(r): 1
68
69//! Volotka single-particle nuclear model: F(r,rN)
70/*! @details
71Calculates the BohrWeisskopf magnetisation distribution using the `Volotka'
72single-particle model of Phys. Rev. Lett. 125, 063002 (2020).
73Returns a RadialFunction F(r,r_N).
74F goes to 1 as r_N->0, and F=1 for r>rN.
75Assumes radial nuclear density is a step function.
76
77 @param mu Nuclear magnetic moment (in nuclear magnetons)
78 @param I_nuc Nuclear spin
79 @param l_pn Orbital angular momentum of valence nucleon
80 @param gl Orbital g-factor (1 = proton, 0 = neutron)
81 @param print Print model details
82
83 @return Radial function \f$ F_{\mathrm{BW}}(r, r_N) \f$
84*/
85RadialFunction VolotkaSP_F(double mu, double I_nuc, double l_pn, int gl,
86 bool print = true);
87
88//! Elizarov single-particle magnetisation model [extended Volotka]
89/*! @details
90Returns the radial magnetisation function F(r,r_N) for the model of
91Elizarov, A. A. et al., Opt. Spectrosc. 100, 361 (2006).
92Uses nuclear radial density u(r), with:
93
94\f[
95 u(r) =
96 \begin{cases}
97 u_0 (R-r)^n & \text{u1(r)} \\
98 u_0 r^n & \text{u2(r)}
99 \end{cases}
100\f]
101
102n=0 should correspond to Volotka model.
103
104 @param mu Nuclear magnetic moment (in nuclear magnetons)
105 @param I_nuc Nuclear spin
106 @param l_pn Orbital angular momentum of valence nucleon
107 @param gl Orbital g-factor (1 = proton, 0 = neutron)
108 @param n Power in usually 0,1,2, but can be anything. 0 => Volotka
109 @param R Nuclear radius
110 @param u_option Selects returned radial form: true means u1(r)
111 @param print Print model details
112 @return Radial magnetisation function
113 @warning Does normalisation by numerical integration; may be unstable.
114 Check that returns to Volotka as n->0
115*/
116RadialFunction uSP(double mu, double I_nuc, double l_pn, int gl, double n,
117 double R, bool u_option, bool print = true);
118
119//! Volotka single-particle model for doubly-odd nuclei
120/*! @details
121 From: [Phys. Rev. Lett. 125, 063002 (2020).](http://arxiv.org/abs/2001.01907)
122
123 Total magnetisation:
124 \f[
125 g F(r) = 0.5 \left[ g_1 F_1(r) + g_2 F_2(r)
126 + (g_1 F_1(r) - g_2 F_2(r)) K \right]
127 \f]
128
129 with
130
131 \f[
132 K = \frac{[ I_1(I_1+1) - I_2(I_2+1) ]}{[ I(I+1) ]}
133 \f]
134
135 Returns F(r) (i.e., divided by total g).
136
137 g2 is obtained from
138 g = 0.5 [ g1 + g2 + (g1 - g2) K ].
139
140 @note F1, F2 are the Volotka single-particle functions (see \ref VolotkaSP_F).
141
142 @param mut Total nuclear magnetic moment (in nuclear magnetons)
143 @param It Total nuclear spin
144 @param mu1 Magnetic moment of nucleon 1
145 @param I1 Spin of nucleon 1
146 @param l1 Orbital angular momentum of nucleon 1
147 @param gl1 Orbital g-factor of nucleon 1 (1 = proton, 0 = neutron)
148 @param I2 Spin of nucleon 2
149 @param l2 Orbital angular momentum of nucleon 2
150 @param print Print model details
151
152 @return Radial function F(r)
153*/
154RadialFunction doublyOddSP_F(double mut, double It, double mu1, double I1,
155 double l1, int gl1, double I2, double l2,
156 bool print = true);
157
158//------------------------------------------------------------------------------
159//! Converts reduced matrix element to A/B coeficients (takes k, 2J, 2J)
160double convert_RME_to_HFSconstant_2J(int k, int tja, int tjb);
161
162//! Converts reduced matrix element to A/B coeficients (takes k, kappa, kappa)
163double convert_RME_to_HFSconstant(int k, int ka, int kb);
164
165} // namespace Hyperfine
166
167//==============================================================================
168//==============================================================================
169//==============================================================================
170
171//! Generalised hyperfine-structure operator, including relevant nuclear moment
172/*! @details
173
174Implements the nuclear multipole hyperfine operator of rank @p k using a
175specified finite-nucleus radial model.
176
177By default, includes the nuclear moment, and relevant factors.
178Input parameter @p GQ is the g-factor (k=1) or nuclear moment (k>1),
179in units of nuclear magnetons * barns^power.
180If 'units' set to 'au', usually should set mu=I=Q=1 then to get raw t^k matrix elements.
181
182That is, it calculates:
183
184\f[
185 GQ * t^k
186\f]
187
188with:
189
190\f[
191 t^k =
192 \frac{-1}{r^{k+1}}\,F(r)
193 \begin{cases}
194 C^k & \text{electric (even k)} \\
195 \sqrt{\frac{k+1}{k}}
196 \mathbf{\alpha}\!\cdot\!\mathbf{C}^{(0)}_k
197 & \text{magnetic (odd k)}
198 \end{cases}
199\f]
200
201where F(r) is nuclear k-pole distribution (=1 for pointlike).
202
203Convert to hyperfine constant by taking stretched state, and multiply by:
204
205\f[
206 M =
207 \begin{cases}
208 1/J & k = 1 \\
209 2 & k = 2 \\
210 -1 & k = 3 \\
211 1 & k \geq 4 \\
212 \end{cases}
213\f]
214
215This factor (including the steched 3j symbol) is returned by \ref Hyperfine::convert_RME_to_HFSconstant()
216
217Units:
218- Assumes nuclear moments in units of:
219- magnetic moments: @f$\mu_N\, b^{(k-1)/2}@f$
220- electric moments: @f$b^{k/2}@f$
221- Matrix element are in MHz by default, otherwise in atomic units.
222
223Here \f$ \mu_N \f$ is the nuclear magneton and \f$ b \f$ is the barn.
224
225See, e.g., Xiao _et al._, [Phys. Rev. A 102, 022810 (2020).](http://arxiv.org/abs/2007.06798)
226
227The radial part is constructed from \ref Hyperfine::tk_radial().
228*/
229class hfs final : public TensorOperator {
230 using RadialFunction = std::function<double(double, double)>;
231
232public:
233 //! @brief Constructs hyperfine operator of multipolarity k.
234 /*! @details
235 Initialises the hyperfine interaction operator.
236
237 @param in_k Tensor rank k (multipolarity) of the hyperfine interaction
238 (e.g., 1,2,3,... for M1, E2, M3,... etc.)
239 @param GQ Nuclear g-factor for k=1, general moment for k>1
240 @param rN_au Nuclear radius (a.u.), used for finite-size magnetisation models.
241 @param rgrid Radial grid used to define the radial functions.
242 @param hfs_F Radial magnetisation distribution function
243 (see @ref DiracOperator::Hyperfine).
244 @param MHzQ If true outputs in MHz units (assuming input g etc. in muN.barns); otherwise in raw atomic units (pure t^k matrix elements).
245
246 @see See also: \ref DiracOperator::Hyperfine
247 */
248 hfs(int in_k, double GQ, double rN_au, const Grid &rgrid,
249 const RadialFunction &hfs_F = Hyperfine::pointlike_F(), bool MHzQ = true)
250 : TensorOperator(in_k, Parity::even, GQ,
251 Hyperfine::tk_radial(in_k, rN_au, rgrid.r(), hfs_F)),
252 k(in_k),
253 magnetic(k % 2 != 0),
254 cfg(magnetic ? 1.0 : 0.0),
255 cff(magnetic ? 0.0 : 1.0),
256 mMHzQ(MHzQ) {
257
258 const auto power = magnetic ? (k - 1) / 2 : k / 2;
259
260 // Assumes nuclear moment in muN*b^(k-1)/2 for magnetic,
261 // and b^k/2 for electric
262 const auto unit_au =
263 magnetic ? PhysConst::muN_CGS * std::pow(PhysConst::barn_au, power) :
264 std::pow(PhysConst::barn_au, power);
265 m_unit = mMHzQ ? unit_au * PhysConst::Hartree_MHz : 1.0;
266 }
267
268 std::string name() const override final {
269 return "hfs" + std::to_string(k) + "";
270 }
271 std::string units() const override final { return mMHzQ ? "MHz" : "au"; }
272
273 double angularF(const int ka, const int kb) const override final {
274 return magnetic ? -double(ka + kb) / double(k) *
275 Angular::Ck_kk(k, ka, -kb) * m_unit :
276 -Angular::Ck_kk(k, ka, kb) * m_unit;
277 }
278
279 double angularCff(int, int) const override final { return cff; }
280 double angularCgg(int, int) const override final { return cff; }
281 double angularCfg(int, int) const override final { return cfg; }
282 double angularCgf(int, int) const override final { return cfg; }
283
284private:
285 int k;
286 bool magnetic;
287 double cfg;
288 double cff;
289 bool mMHzQ;
290 double m_unit{1.0};
291};
292
293//==============================================================================
294//==============================================================================
295inline std::unique_ptr<DiracOperator::TensorOperator>
296generate_hfs(const IO::InputBlock &input, const Wavefunction &wf) {
297 using namespace DiracOperator;
298
299 input.check(
300 {{"", "Most following will be taken from the default nucleus if "
301 "not explicitely given"},
302 {"mu", "Magnetic moment in mu_N"},
303 {"Q", "Nuclear quadrupole moment, in barns. Also used as overall "
304 "constant for any higher-order moments [1.0]"},
305 {"k", "Multipolarity. 1=mag. dipole, 2=elec. quad, etc. [1]"},
306 {"rrms",
307 "nuclear (magnetic) rms radius, in Fermi (fm) (defult is charge rms)"},
308 {"units", "Units for output (only for k=1,k=2). MHz or au. For MHz, "
309 "assumes nuclear moments g/Q are in mu_N*barns^p. For atomic "
310 "units, best to set g=Q=1 to get raw t^k matrix elements [MHz]"},
311 {"F", "F(r): Nuclear moment distribution: ball, point, shell, "
312 "SingleParticle, or doublyOddSP [ball]"},
313 {"F(r)", "Obselete; use 'F' from now - will be removed"},
314 {"nuc_mag", "Obselete; use 'F' from now - will be removed"},
315 {"printF", "Writes F(r) to a text file [false]"},
316 {"print", "Write F(r) info to screen [true]"},
317 {"", "The following are only for F=SingleParticle or doublyOddSP"},
318 {"I", "Nuclear spin. Taken from nucleus"},
319 {"parity", "Nulcear parity: +/-1"},
320 {"l", "l for unpaired nucleon (automatically derived from I and "
321 "parity; best to leave as default)"},
322 {"gl", "=1 for proton, =0 for neutron"},
323 {"", "The following are only used if F=doublyOddSP"},
324 {"mu1", "mag moment of 'first' unpaired nucleon"},
325 {"gl1", "gl of 'first' unpaired nucleon"},
326 {"l1", "l of 'first' unpaired nucleon"},
327 {"l2", "l of 'second' unpaired nucleon"},
328 {"I1", "total spin (J) of 'first' unpaired nucleon"},
329 {"I2", "total spin (J) of 'second' unpaired nucleon"},
330 {"", "The following are only for u(r) function"},
331 {"u", "u1 or u2 : u1(r) = (R-r)^n, u2(r) = r^n [u1]"},
332 {"n", "n that appears above. Should be between 0 and 2 [0]"}});
333 if (input.has_option("help")) {
334 return nullptr;
335 }
336
337 const auto nuc = wf.nucleus();
338 const auto isotope = Nuclear::findIsotopeData(nuc.z(), nuc.a());
339 auto mu = input.get("mu", isotope.mu ? *isotope.mu : 1.0);
340 auto I_nuc = input.get("I", isotope.I_N ? *isotope.I_N : 1.0);
341 const auto print = input.get("print", true);
342 const auto k = input.get("k", 1);
343
344 const auto use_MHz =
345 qip::ci_compare(input.get<std::string>("units", "MHz"), "MHz");
346
347 if (k <= 0) {
348 fmt2::styled_print(fg(fmt::color::red), "\nError 246:\n");
349 std::cout << "In hyperfine: invalid K=" << k << "! meaningless results\n";
350 }
351 if (I_nuc <= 0 && k == 1) {
352 fmt2::styled_print(fg(fmt::color::orange), "\nWarning 253:\n");
353 std::cout << "In hyperfine: invalid I_nuc=" << I_nuc
354 << "! meaningless results\nSetting I=1\n";
355 I_nuc = 1;
356 }
357 if (mu == 0.0 && k == 1) {
358 fmt2::styled_print(fg(fmt::color::orange), "\nWarning 352:\n");
359 std::cout << "Setting mu=1\n";
360 mu = 1;
361 }
362
363 const auto g_or_Q = (k == 1) ? (mu / I_nuc) :
364 (k == 2) ? input.get("Q", isotope.q ? *isotope.q : 1.0) :
365 input.get("Q", 1.0);
366
367 enum class DistroType {
368 point,
369 ball,
370 shell,
371 SingleParticle,
372 doublyOddSP,
373 spu,
374 Error
375 };
376
377 std::string default_distribution = "ball";
378
379 // For compatability with old notation of 'F(r)' input option
380 const auto Fr_str =
381 input.has_option("F") ?
382 input.get<std::string>("F", default_distribution) :
383 input.has_option("nuc_mag") ?
384 input.get<std::string>("nuc_mag", default_distribution) :
385 input.get<std::string>("F(r)", default_distribution);
386
387 const auto distro_type =
388 (qip::ci_wc_compare(Fr_str, "point*") || qip::ci_compare(Fr_str, "1")) ?
389 DistroType::point :
390 qip::ci_compare(Fr_str, "ball") ? DistroType::ball :
391 qip::ci_compare(Fr_str, "shell") ? DistroType::shell :
392 qip::ci_wc_compare(Fr_str, "Single*") ? DistroType::SingleParticle :
393 qip::ci_wc_compare(Fr_str, "doublyOdd*") ? DistroType::doublyOddSP :
394 qip::ci_compare(Fr_str, "spu") ? DistroType::spu :
395 DistroType::Error;
396 if (distro_type == DistroType::Error) {
397 fmt2::styled_print(fg(fmt::color::red), "\nError 271:\n");
398 std::cout << "\nIn hyperfine. Unkown F(r) - " << Fr_str << "\n";
399 std::cout << "Defaulting to pointlike!\n";
400 }
401
402 const auto r_rmsfm =
403 distro_type == DistroType::point ? 0.0 : input.get("rrms", nuc.r_rms());
404 const auto r_nucfm = std::sqrt(5.0 / 3) * r_rmsfm;
405 const auto r_nucau = r_nucfm / PhysConst::aB_fm;
406
407 if (print) {
408 std::cout << "\nHyperfine structure: " << wf.atom() << "\n";
409 std::cout << "K=" << k << " ("
410 << (k == 1 ? "magnetic dipole" :
411 k == 2 ? "electric quadrupole" :
412 k % 2 == 0 ? "electric multipole" :
413 "magnetic multipole")
414 << ")\n";
415 std::cout << "Using " << Fr_str << " nuclear distro for F(r)\n"
416 << "w/ r_N = " << r_nucfm << "fm = " << r_nucau
417 << "au (r_rms=" << r_rmsfm << "fm)\n";
418 std::cout << "Points inside nucleus: " << wf.grid().getIndex(r_nucau)
419 << "\n";
420 if (k == 1) {
421 std::cout << "mu = " << mu << ", I = " << I_nuc << ", g = " << g_or_Q
422 << "\n";
423 } else {
424 std::cout << "Q = " << g_or_Q << "\n";
425 }
426 }
427
428 // default is BALL:
429 auto Fr = Hyperfine::sphericalBall_F(k);
430 if (distro_type == DistroType::ball) {
432 } else if (distro_type == DistroType::shell) {
434 } else if (distro_type == DistroType::SingleParticle) {
435 const auto pi = input.get("parity", isotope.parity ? *isotope.parity : 0);
436 const auto l_tmp = int(I_nuc + 0.5 + 0.0001);
437 auto l = ((l_tmp % 2 == 0) == (pi == 1)) ? l_tmp : l_tmp - 1;
438 l = input.get("l", l); // can override derived 'l' (not recommended)
439 const auto gl_default = wf.Znuc() % 2 == 0 ? 0 : 1; // unparied proton?
440 const auto gl = input.get<int>("gl", gl_default);
441 if (print) {
442 std::cout << "Single-Particle (Volotka formula) for unpaired";
443 if (gl == 1)
444 std::cout << " proton ";
445 else if (gl == 0)
446 std::cout << " neturon ";
447 else
448 std::cout << " gl=" << gl << "??? program will run, but prob wrong!\n";
449 std::cout << "with l=" << l << " (pi=" << pi << ")\n";
450 }
451 Fr = Hyperfine::VolotkaSP_F(mu, I_nuc, l, gl, print);
452 } else if (distro_type == DistroType::spu) {
453 const auto pi = input.get("parity", isotope.parity ? *isotope.parity : 0);
454 const auto u_func = input.get("u", std::string{"u1"}); // u1=(R-r)^n, u2=r^n
455 const bool u_option = u_func == std::string{"u1"};
456 const auto n = input.get("n", 0.0); // u1=(R-r)^n, u2=r^n
457 const auto l_tmp = int(I_nuc + 0.5 + 0.0001);
458 auto l = ((l_tmp % 2 == 0) == (pi == 1)) ? l_tmp : l_tmp - 1;
459 l = input.get("l", l); // can override derived 'l' (not recommended)
460 const auto gl_default = wf.Znuc() % 2 == 0 ? 0 : 1; // unparied proton?
461 const auto gl = input.get<int>("gl", gl_default);
462 if (print) {
463 std::cout << "Single-Particle (Volotka formula) with u(r) for unpaired";
464 if (gl == 1)
465 std::cout << " proton ";
466 else if (gl == 0)
467 std::cout << " neturon ";
468 else
469 std::cout << " gl=" << gl << "??? program will run, but prob wrong!\n";
470 std::cout << "with l=" << l << " (pi=" << pi << ")\n";
471 }
472 Fr = Hyperfine::uSP(mu, I_nuc, l, gl, n, r_nucau, u_option, print);
473 } else if (distro_type == DistroType::doublyOddSP) {
474 const auto mu1 = input.get<double>("mu1", 1.0);
475 const auto gl1 = input.get<int>("gl1", -1); // 1 or 0 (p or n)
476 if (gl1 != 0 && gl1 != 1) {
477 fmt2::styled_print(fg(fmt::color::red), "\nError 324:\n");
478 std::cout << "In " << input.name() << " " << Fr_str
479 << "; have gl1=" << gl1 << " but need 1 or 0\n";
480 return std::make_unique<NullOperator>(NullOperator());
481 }
482 const auto l1 = input.get<double>("l1", -1.0);
483 const auto l2 = input.get<double>("l2", -1.0);
484 const auto I1 = input.get<double>("I1", -1.0);
485 const auto I2 = input.get<double>("I2", -1.0);
486
487 Fr = Hyperfine::doublyOddSP_F(mu, I_nuc, mu1, I1, l1, gl1, I2, l2, print);
488 }
489
490 // Optionally print F(r) function to file
491 if (input.get<bool>("printF", false)) {
492 std::ofstream of(wf.identity() + "_" + Fr_str + ".txt");
493 of << "r/fm F(r)\n";
494 for (auto r : wf.grid()) {
495 of << r * PhysConst::aB_fm << " "
496 << Fr(r * PhysConst::aB_fm, r_nucau * PhysConst::aB_fm) << "\n";
497 }
498 }
499
500 return std::make_unique<hfs>(k, g_or_Q, r_nucau, wf.grid(), Fr, use_MHz);
501}
502
503} // namespace DiracOperator
Speacial operator: 0.
Definition TensorOperator.hpp:362
General operator (virtual base class); operators derive from this.
Definition TensorOperator.hpp:66
Generalised hyperfine-structure operator, including relevant nuclear moment.
Definition hfs.hpp:229
double angularCgg(int, int) const override final
Angular factor for g_a*g_b part of radial integral.
Definition hfs.hpp:280
double angularCgf(int, int) const override final
Angular factor for g_a*f_b part of radial integral.
Definition hfs.hpp:282
double angularCfg(int, int) const override final
Angular factor for f_a*g_b part of radial integral.
Definition hfs.hpp:281
std::string units() const override final
Returns units of operator (usually au, may be MHz, etc.)
Definition hfs.hpp:271
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition hfs.hpp:268
hfs(int in_k, double GQ, double rN_au, const Grid &rgrid, const RadialFunction &hfs_F=Hyperfine::pointlike_F(), bool MHzQ=true)
Constructs hyperfine operator of multipolarity k.
Definition hfs.hpp:248
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition hfs.hpp:273
double angularCff(int, int) const override final
Angular factor for f_a*f_b part of radial integral.
Definition hfs.hpp:279
l (orbital angular momentum) operator
Definition jls.hpp:27
Holds grid, including type + Jacobian (dr/du)
Definition Grid.hpp:31
std::size_t getIndex(double x, bool require_nearest=false) const
Given value, returns grid index. if not require_nearest, returns lower.
Definition Grid.cpp:76
Holds list of Options, and a list of other InputBlocks. Can be initialised with a list of options,...
Definition InputBlock.hpp:153
bool check(std::initializer_list< std::string > blocks, const std::vector< std::pair< std::string, std::string > > &list, bool print=false) const
Check all the options and blocks in this; if any of them are not present in 'list',...
Definition InputBlock.hpp:606
bool has_option(std::string_view key) const
Check is option is present (even if not set) in current block.
Definition InputBlock.hpp:212
T get(std::string_view key, T default_value) const
If 'key' exists in the options, returns value. Else, returns default_value. Note: If two keys with sa...
Definition InputBlock.hpp:428
Stores Wavefunction (set of valence orbitals, grid, HF etc.)
Definition Wavefunction.hpp:37
const Grid & grid() const
Returns a const reference to the radial grid.
Definition Wavefunction.hpp:82
int Znuc() const
Nuclear charge, Z.
Definition Wavefunction.hpp:99
std::string identity() const
Atomic symbol, including core ionisation degree and run_label.
Definition Wavefunction.cpp:682
std::string atom() const
String of atom info (e.g., "Cs, Z=55, A=133")
Definition Wavefunction.hpp:190
const Nuclear::Nucleus & nucleus() const
Returns Nuclear::nucleus object (contains nuc. parameters)
Definition Wavefunction.hpp:97
double Ck_kk(int k, int ka, int kb)
Reduced (relativistic) angular ME: <ka||C^k||kb> [takes k and kappa].
Definition Wigner369j.hpp:372
double convert_RME_to_HFSconstant_2J(int k, int tja, int tjb)
Converts reduced matrix element to A/B coeficients (takes k, 2J, 2J)
Definition hfs.cpp:169
RadialFunction doublyOddSP_F(double mut, double It, double mu1, double I1, double l1, int gl1, double I2, double l2, bool print)
Volotka single-particle model for doubly-odd nuclei.
Definition hfs.cpp:150
std::vector< double > tk_radial(int k, double rN, const std::vector< double > &r, const RadialFunction &hfs_F)
Definition hfs.cpp:14
double convert_RME_to_HFSconstant(int k, int ka, int kb)
Converts reduced matrix element to A/B coeficients (takes k, kappa, kappa)
Definition hfs.cpp:203
RadialFunction pointlike_F()
Pointlike F(r): 1.
Definition hfs.cpp:38
RadialFunction sphericalBall_F(int k)
Spherical ball model for F(r,rN) [default]. Uniformly distributed point k-poles.
Definition hfs.cpp:26
RadialFunction sphericalShell_F()
Spherical shell F(r): 0 for r<rN, 1 for r>rN.
Definition hfs.cpp:33
RadialFunction uSP(double mu, double I_nuc, double l_pn, int gl, double n, double R, bool u_option, bool print)
Elizarov single-particle magnetisation model [extended Volotka].
Definition hfs.cpp:81
std::function< double(double r, double r_Nuc)> RadialFunction
Type for radial function F(r,rN) (type alias to save typing)
Definition hfs.hpp:22
RadialFunction VolotkaSP_F(double mu, double I_nuc, double l_pn, int gl, bool print)
Volotka single-particle nuclear model: F(r,rN)
Definition hfs.cpp:44
Dirac Operators: General + derived.
Definition GenerateOperator.cpp:3
Parity
Parity of operator.
Definition TensorOperator.hpp:19
Isotope findIsotopeData(int z, int a)
Looks up + returns an isotope from the list. If not in list, partially blank.
Definition NuclearData.cpp:6
constexpr double muN_CGS
Nulcear magneton (in Gaussian CGS-derived atomic units):
Definition PhysConst_constants.hpp:101
qip library: A collection of useful functions
Definition Array.hpp:9
bool ci_wc_compare(std::string_view s1, std::string_view s2)
Compares two strings, s1 and s2. s2 may contain ONE wildcard ('*') which will match anything....
Definition String.hpp:140
bool ci_compare(std::string_view s1, std::string_view s2)
Case insensitive string compare. Essentially: LowerCase(s1)==LowerCase(s2)
Definition String.hpp:132