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.
180
181That is, it calculates:
182
183\f[
184 GQ * t^k
185\f]
186
187with:
188
189\f[
190 t^k =
191 \frac{-1}{r^{k+1}}\,F(r)
192 \begin{cases}
193 C^k & \text{electric (even k)} \\
194 \sqrt{\frac{k+1}{k}}
195 \mathbf{\alpha}\!\cdot\!\mathbf{C}^{(0)}_k
196 & \text{magnetic (odd k)}
197 \end{cases}
198\f]
199
200where F(r) is nuclear k-pole distribution (=1 for pointlike).
201
202Convert to hyperfine constant by taking stretched state, and multiply by:
203
204\f[
205 M =
206 \begin{cases}
207 1/J & k = 1 \\
208 2 & k = 2 \\
209 -1 & k = 3 \\
210 1 & k \geq 4 \\
211 \end{cases}
212\f]
213
214This factor (including the steched 3j symbol) is returned by \ref Hyperfine::convert_RME_to_HFSconstant()
215
216Units:
217- Assumes nuclear moments in units of:
218- magnetic moments: @f$\mu_N\, b^{(k-1)/2}@f$
219- electric moments: @f$b^{k/2}@f$
220- Matrix element are in MHz by default, otherwise in atomic units.
221
222Here \f$ \mu_N \f$ is the nuclear magneton and \f$ b \f$ is the barn.
223
224See, e.g., Xiao _et al._, [Phys. Rev. A 102, 022810 (2020).](http://arxiv.org/abs/2007.06798)
225
226The radial part is constructed from \ref Hyperfine::tk_radial().
227*/
228class hfs final : public TensorOperator {
229 using RadialFunction = std::function<double(double, double)>;
230
231public:
232 //! @brief Constructs hyperfine operator of multipolarity k.
233 /*! @details
234 Initialises the hyperfine interaction operator.
235
236 @param in_k Tensor rank k (multipolarity) of the hyperfine interaction
237 (e.g., 1,2,3,... for M1, E2, M3,... etc.)
238 @param GQ Nuclear g-factor for k=1, general moment for k>1
239 @param rN_au Nuclear radius (a.u.), used for finite-size magnetisation models.
240 @param rgrid Radial grid used to define the radial functions.
241 @param hfs_F Radial magnetisation distribution function
242 (see @ref DiracOperator::Hyperfine).
243 @param MHzQ If true outputs in MHz units; otherwise in atomic units.
244
245 @see See also: \ref DiracOperator::Hyperfine
246 */
247 hfs(int in_k, double GQ, double rN_au, const Grid &rgrid,
248 const RadialFunction &hfs_F = Hyperfine::pointlike_F(), bool MHzQ = true)
249 : TensorOperator(in_k, Parity::even, GQ,
250 Hyperfine::tk_radial(in_k, rN_au, rgrid.r(), hfs_F)),
251 k(in_k),
252 magnetic(k % 2 != 0),
253 cfg(magnetic ? 1.0 : 0.0),
254 cff(magnetic ? 0.0 : 1.0),
255 mMHzQ(MHzQ) {
256
257 const auto power = magnetic ? (k - 1) / 2 : k / 2;
258
259 // Assumes nuclear moment in muN*b^(k-1)/2 for magnetic,
260 // and b^k/2 for electric
261 const auto unit_au =
262 magnetic ? PhysConst::muN_CGS * std::pow(PhysConst::barn_au, power) :
263 std::pow(PhysConst::barn_au, power);
264 m_unit = mMHzQ ? unit_au * PhysConst::Hartree_MHz : unit_au;
265 }
266
267 std::string name() const override final {
268 return "hfs" + std::to_string(k) + "";
269 }
270 std::string units() const override final { return mMHzQ ? "MHz" : "au"; }
271
272 double angularF(const int ka, const int kb) const override final {
273 return magnetic ? -double(ka + kb) / double(k) *
274 Angular::Ck_kk(k, ka, -kb) * m_unit :
275 -Angular::Ck_kk(k, ka, kb) * m_unit;
276 }
277
278 double angularCff(int, int) const override final { return cff; }
279 double angularCgg(int, int) const override final { return cff; }
280 double angularCfg(int, int) const override final { return cfg; }
281 double angularCgf(int, int) const override final { return cfg; }
282
283private:
284 int k;
285 bool magnetic;
286 double cfg;
287 double cff;
288 bool mMHzQ;
289 double m_unit{1.0};
290};
291
292//==============================================================================
293//==============================================================================
294inline std::unique_ptr<DiracOperator::TensorOperator>
295generate_hfs(const IO::InputBlock &input, const Wavefunction &wf) {
296 using namespace DiracOperator;
297
298 input.check(
299 {{"", "Most following will be taken from the default nucleus if "
300 "not explicitely given"},
301 {"mu", "Magnetic moment in mu_N"},
302 {"Q", "Nuclear quadrupole moment, in barns. Also used as overall "
303 "constant for any higher-order moments [1.0]"},
304 {"k", "Multipolarity. 1=mag. dipole, 2=elec. quad, etc. [1]"},
305 {"rrms",
306 "nuclear (magnetic) rms radius, in Fermi (fm) (defult is charge rms)"},
307 {"units", "Units for output (only for k=1,k=2). MHz or au [MHz]"},
308 {"F", "F(r): Nuclear moment distribution: ball, point, shell, "
309 "SingleParticle, or doublyOddSP [ball]"},
310 {"F(r)", "Obselete; use 'F' from now - will be removed"},
311 {"nuc_mag", "Obselete; use 'F' from now - will be removed"},
312 {"printF", "Writes F(r) to a text file [false]"},
313 {"print", "Write F(r) info to screen [true]"},
314 {"", "The following are only for F=SingleParticle or doublyOddSP"},
315 {"I", "Nuclear spin. Taken from nucleus"},
316 {"parity", "Nulcear parity: +/-1"},
317 {"l", "l for unpaired nucleon (automatically derived from I and "
318 "parity; best to leave as default)"},
319 {"gl", "=1 for proton, =0 for neutron"},
320 {"", "The following are only used if F=doublyOddSP"},
321 {"mu1", "mag moment of 'first' unpaired nucleon"},
322 {"gl1", "gl of 'first' unpaired nucleon"},
323 {"l1", "l of 'first' unpaired nucleon"},
324 {"l2", "l of 'second' unpaired nucleon"},
325 {"I1", "total spin (J) of 'first' unpaired nucleon"},
326 {"I2", "total spin (J) of 'second' unpaired nucleon"},
327 {"", "The following are only for u(r) function"},
328 {"u", "u1 or u2 : u1(r) = (R-r)^n, u2(r) = r^n [u1]"},
329 {"n", "n that appears above. Should be between 0 and 2 [0]"}});
330 if (input.has_option("help")) {
331 return nullptr;
332 }
333
334 const auto nuc = wf.nucleus();
335 const auto isotope = Nuclear::findIsotopeData(nuc.z(), nuc.a());
336 auto mu = input.get("mu", isotope.mu ? *isotope.mu : 1.0);
337 auto I_nuc = input.get("I", isotope.I_N ? *isotope.I_N : 1.0);
338 const auto print = input.get("print", true);
339 const auto k = input.get("k", 1);
340
341 const auto use_MHz =
342 qip::ci_compare(input.get<std::string>("units", "MHz"), "MHz");
343
344 if (k <= 0) {
345 fmt2::styled_print(fg(fmt::color::red), "\nError 246:\n");
346 std::cout << "In hyperfine: invalid K=" << k << "! meaningless results\n";
347 }
348 if (I_nuc <= 0 && k == 1) {
349 fmt2::styled_print(fg(fmt::color::orange), "\nWarning 253:\n");
350 std::cout << "In hyperfine: invalid I_nuc=" << I_nuc
351 << "! meaningless results\nSetting I=1\n";
352 I_nuc = 1;
353 }
354 if (mu == 0.0 && k == 1) {
355 fmt2::styled_print(fg(fmt::color::orange), "\nWarning 352:\n");
356 std::cout << "Setting mu=1\n";
357 mu = 1;
358 }
359
360 const auto g_or_Q = (k == 1) ? (mu / I_nuc) :
361 (k == 2) ? input.get("Q", isotope.q ? *isotope.q : 1.0) :
362 input.get("Q", 1.0);
363
364 enum class DistroType {
365 point,
366 ball,
367 shell,
368 SingleParticle,
369 doublyOddSP,
370 spu,
371 Error
372 };
373
374 std::string default_distribution = "ball";
375
376 // For compatability with old notation of 'F(r)' input option
377 const auto Fr_str =
378 input.has_option("F") ?
379 input.get<std::string>("F", default_distribution) :
380 input.has_option("nuc_mag") ?
381 input.get<std::string>("nuc_mag", default_distribution) :
382 input.get<std::string>("F(r)", default_distribution);
383
384 const auto distro_type =
385 (qip::ci_wc_compare(Fr_str, "point*") || qip::ci_compare(Fr_str, "1")) ?
386 DistroType::point :
387 qip::ci_compare(Fr_str, "ball") ? DistroType::ball :
388 qip::ci_compare(Fr_str, "shell") ? DistroType::shell :
389 qip::ci_wc_compare(Fr_str, "Single*") ? DistroType::SingleParticle :
390 qip::ci_wc_compare(Fr_str, "doublyOdd*") ? DistroType::doublyOddSP :
391 qip::ci_compare(Fr_str, "spu") ? DistroType::spu :
392 DistroType::Error;
393 if (distro_type == DistroType::Error) {
394 fmt2::styled_print(fg(fmt::color::red), "\nError 271:\n");
395 std::cout << "\nIn hyperfine. Unkown F(r) - " << Fr_str << "\n";
396 std::cout << "Defaulting to pointlike!\n";
397 }
398
399 const auto r_rmsfm =
400 distro_type == DistroType::point ? 0.0 : input.get("rrms", nuc.r_rms());
401 const auto r_nucfm = std::sqrt(5.0 / 3) * r_rmsfm;
402 const auto r_nucau = r_nucfm / PhysConst::aB_fm;
403
404 if (print) {
405 std::cout << "\nHyperfine structure: " << wf.atom() << "\n";
406 std::cout << "K=" << k << " ("
407 << (k == 1 ? "magnetic dipole" :
408 k == 2 ? "electric quadrupole" :
409 k % 2 == 0 ? "electric multipole" :
410 "magnetic multipole")
411 << ")\n";
412 std::cout << "Using " << Fr_str << " nuclear distro for F(r)\n"
413 << "w/ r_N = " << r_nucfm << "fm = " << r_nucau
414 << "au (r_rms=" << r_rmsfm << "fm)\n";
415 std::cout << "Points inside nucleus: " << wf.grid().getIndex(r_nucau)
416 << "\n";
417 if (k == 1) {
418 std::cout << "mu = " << mu << ", I = " << I_nuc << ", g = " << g_or_Q
419 << "\n";
420 } else {
421 std::cout << "Q = " << g_or_Q << "\n";
422 }
423 }
424
425 // default is BALL:
426 auto Fr = Hyperfine::sphericalBall_F(k);
427 if (distro_type == DistroType::ball) {
429 } else if (distro_type == DistroType::shell) {
431 } else if (distro_type == DistroType::SingleParticle) {
432 const auto pi = input.get("parity", isotope.parity ? *isotope.parity : 0);
433 const auto l_tmp = int(I_nuc + 0.5 + 0.0001);
434 auto l = ((l_tmp % 2 == 0) == (pi == 1)) ? l_tmp : l_tmp - 1;
435 l = input.get("l", l); // can override derived 'l' (not recommended)
436 const auto gl_default = wf.Znuc() % 2 == 0 ? 0 : 1; // unparied proton?
437 const auto gl = input.get<int>("gl", gl_default);
438 if (print) {
439 std::cout << "Single-Particle (Volotka formula) for unpaired";
440 if (gl == 1)
441 std::cout << " proton ";
442 else if (gl == 0)
443 std::cout << " neturon ";
444 else
445 std::cout << " gl=" << gl << "??? program will run, but prob wrong!\n";
446 std::cout << "with l=" << l << " (pi=" << pi << ")\n";
447 }
448 Fr = Hyperfine::VolotkaSP_F(mu, I_nuc, l, gl, print);
449 } else if (distro_type == DistroType::spu) {
450 const auto pi = input.get("parity", isotope.parity ? *isotope.parity : 0);
451 const auto u_func = input.get("u", std::string{"u1"}); // u1=(R-r)^n, u2=r^n
452 const bool u_option = u_func == std::string{"u1"};
453 const auto n = input.get("n", 0.0); // u1=(R-r)^n, u2=r^n
454 const auto l_tmp = int(I_nuc + 0.5 + 0.0001);
455 auto l = ((l_tmp % 2 == 0) == (pi == 1)) ? l_tmp : l_tmp - 1;
456 l = input.get("l", l); // can override derived 'l' (not recommended)
457 const auto gl_default = wf.Znuc() % 2 == 0 ? 0 : 1; // unparied proton?
458 const auto gl = input.get<int>("gl", gl_default);
459 if (print) {
460 std::cout << "Single-Particle (Volotka formula) with u(r) for unpaired";
461 if (gl == 1)
462 std::cout << " proton ";
463 else if (gl == 0)
464 std::cout << " neturon ";
465 else
466 std::cout << " gl=" << gl << "??? program will run, but prob wrong!\n";
467 std::cout << "with l=" << l << " (pi=" << pi << ")\n";
468 }
469 Fr = Hyperfine::uSP(mu, I_nuc, l, gl, n, r_nucau, u_option, print);
470 } else if (distro_type == DistroType::doublyOddSP) {
471 const auto mu1 = input.get<double>("mu1", 1.0);
472 const auto gl1 = input.get<int>("gl1", -1); // 1 or 0 (p or n)
473 if (gl1 != 0 && gl1 != 1) {
474 fmt2::styled_print(fg(fmt::color::red), "\nError 324:\n");
475 std::cout << "In " << input.name() << " " << Fr_str
476 << "; have gl1=" << gl1 << " but need 1 or 0\n";
477 return std::make_unique<NullOperator>(NullOperator());
478 }
479 const auto l1 = input.get<double>("l1", -1.0);
480 const auto l2 = input.get<double>("l2", -1.0);
481 const auto I1 = input.get<double>("I1", -1.0);
482 const auto I2 = input.get<double>("I2", -1.0);
483
484 Fr = Hyperfine::doublyOddSP_F(mu, I_nuc, mu1, I1, l1, gl1, I2, l2, print);
485 }
486
487 // Optionally print F(r) function to file
488 if (input.get<bool>("printF", false)) {
489 std::ofstream of(wf.identity() + "_" + Fr_str + ".txt");
490 of << "r/fm F(r)\n";
491 for (auto r : wf.grid()) {
492 of << r * PhysConst::aB_fm << " "
493 << Fr(r * PhysConst::aB_fm, r_nucau * PhysConst::aB_fm) << "\n";
494 }
495 }
496
497 return std::make_unique<hfs>(k, g_or_Q, r_nucau, wf.grid(), Fr, use_MHz);
498}
499
500} // namespace DiracOperator
Speacial operator: 0.
Definition TensorOperator.hpp:324
General operator (virtual base class); operators derive from this.
Definition TensorOperator.hpp:65
Generalised hyperfine-structure operator, including relevant nuclear moment.
Definition hfs.hpp:228
double angularCgg(int, int) const override final
Angular factor for g_a*g_b part of radial integral.
Definition hfs.hpp:279
double angularCgf(int, int) const override final
Angular factor for g_a*f_b part of radial integral.
Definition hfs.hpp:281
double angularCfg(int, int) const override final
Angular factor for f_a*g_b part of radial integral.
Definition hfs.hpp:280
std::string units() const override final
Returns units of operator (usually au, may be MHz, etc.)
Definition hfs.hpp:270
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition hfs.hpp:267
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:247
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:272
double angularCff(int, int) const override final
Angular factor for f_a*f_b part of radial integral.
Definition hfs.hpp:278
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:306
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:204
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:18
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