19 use_skyrme_(conf.has_value({
"Skyrme"})),
20 use_symmetry_(conf.has_value({
"Symmetry"})),
21 use_coulomb_(conf.has_value({
"Coulomb"})),
22 use_vdf_(conf.has_value({
"VDF"})) {
82 skyrme_a_ = conf.take({
"Skyrme",
"Skyrme_A"});
83 skyrme_b_ = conf.take({
"Skyrme",
"Skyrme_B"});
84 skyrme_tau_ = conf.take({
"Skyrme",
"Skyrme_Tau"});
109 symmetry_S_Pot_ = conf.take({
"Symmetry",
"S_Pot"});
110 if (conf.has_value({
"Symmetry",
"gamma"})) {
111 symmetry_gamma_ = conf.take({
"Symmetry",
"gamma"});
112 symmetry_is_rhoB_dependent_ =
true;
141 coulomb_r_cut_ = conf.take({
"Coulomb",
"R_Cut"});
213 saturation_density_ = conf.take({
"VDF",
"Sat_rhoB"});
214 std::vector<double> aux_coeffs = conf.take({
"VDF",
"Coeffs"});
215 std::vector<double> aux_powers = conf.take({
"VDF",
"Powers"});
216 if (aux_coeffs.size() != aux_powers.size()) {
217 throw std::invalid_argument(
218 "The number of coefficients should equal the number of powers.");
220 const int n_terms = aux_powers.size();
221 for (
int i = 0; i < n_terms; i++) {
222 if (aux_powers[i] < 0.0) {
223 throw std::invalid_argument(
"Powers need to be positive real numbers.");
226 coeffs_.push_back(aux_coeffs[i] *
mev_to_gev);
227 powers_.push_back(aux_powers[i]);
232 Potentials::~Potentials() {}
234 double Potentials::skyrme_pot(
const double baryon_density)
const {
238 const int sgn = tmp > 0 ? 1 : -1;
241 (skyrme_a_ * std::abs(tmp) +
242 skyrme_b_ * std::pow(std::abs(tmp), skyrme_tau_));
244 double Potentials::symmetry_S(
const double baryon_density)
const {
245 if (symmetry_is_rhoB_dependent_) {
252 double Potentials::symmetry_pot(
const double baryon_isospin_density,
253 const double baryon_density)
const {
254 double pot =
mev_to_gev * 2. * symmetry_S_Pot_ * baryon_isospin_density /
256 if (symmetry_is_rhoB_dependent_) {
257 pot +=
mev_to_gev * symmetry_S(baryon_density) * baryon_isospin_density *
258 baryon_isospin_density / (baryon_density * baryon_density);
267 const int sgn = rhoB > 0 ? 1 : -1;
268 double abs_rhoB = std::abs(rhoB);
276 for (
int i = 0; i < number_of_terms(); i++) {
277 F_2 += coeffs_[i] * std::pow(abs_rhoB, powers_[i] - 2.0) /
278 std::pow(saturation_density_, powers_[i] - 1.0);
282 return F_2 * jmuB_net;
285 double Potentials::potential(
const ThreeVector &r,
const ParticleList &plist,
287 double total_potential = 0.0;
288 const bool compute_gradient =
false;
289 const bool smearing =
true;
290 const auto scale = force_scale(acts_on);
293 return total_potential;
296 r, plist, param_, DensityType::Baryon, compute_gradient, smearing);
297 const double rhoB = std::get<0>(baryon_density_and_gradient);
299 total_potential += scale.first * skyrme_pot(rhoB);
302 const double rho_iso = std::get<0>(
304 compute_gradient, smearing));
305 const double sym_pot = symmetry_pot(rho_iso, rhoB) * acts_on.
isospin3_rel();
306 total_potential += scale.second * sym_pot;
310 const FourVector jmuB = std::get<1>(baryon_density_and_gradient);
311 const FourVector VDF_potential = vdf_pot(rhoB, jmuB);
312 total_potential += scale.first * VDF_potential.
x0();
315 return total_potential;
318 std::pair<double, int> Potentials::force_scale(
const ParticleType &data) {
319 const auto &pdg = data.
pdgcode();
320 const double skyrme_or_VDF_scale =
321 (3 - std::abs(pdg.strangeness())) / 3. * pdg.
baryon_number();
322 const int symmetry_scale = pdg.baryon_number();
323 return std::make_pair(skyrme_or_VDF_scale, symmetry_scale);
326 std::pair<ThreeVector, ThreeVector> Potentials::skyrme_force(
329 ThreeVector E_component(0.0, 0.0, 0.0), B_component(0.0, 0.0, 0.0);
331 const int sgn = rhoB > 0 ? 1 : -1;
332 const double abs_rhoB = std::abs(rhoB);
333 const double dV_drho =
sgn *
334 (skyrme_a_ + skyrme_b_ * skyrme_tau_ *
338 E_component -= dV_drho * (grad_j0B + dvecjB_dt);
339 B_component += dV_drho * curl_vecjB;
341 return std::make_pair(E_component, B_component);
344 std::pair<ThreeVector, ThreeVector> Potentials::symmetry_force(
349 ThreeVector E_component(0.0, 0.0, 0.0), B_component(0.0, 0.0, 0.0);
351 E_component -= dVsym_drhoI3(rhoB, rhoI3) * (grad_j0I3 + dvecjI3_dt) +
352 dVsym_drhoB(rhoB, rhoI3) * (grad_j0B + dvecjB_dt);
353 B_component += dVsym_drhoI3(rhoB, rhoI3) * curl_vecjI3 +
354 dVsym_drhoB(rhoB, rhoI3) * curl_vecjB;
356 return std::make_pair(E_component, B_component);
359 std::pair<ThreeVector, ThreeVector> Potentials::vdf_force(
360 double rhoB,
const double drhoB_dt,
const ThreeVector grad_rhoB,
361 const ThreeVector gradrhoB_cross_vecjB,
const double j0B,
366 const int sgn = rhoB > 0 ? 1 : -1;
367 ThreeVector E_component(0.0, 0.0, 0.0), B_component(0.0, 0.0, 0.0);
369 double abs_rhoB = std::abs(rhoB);
377 for (
int i = 0; i < number_of_terms(); i++) {
378 F_1 += coeffs_[i] * (powers_[i] - 2.0) *
379 std::pow(abs_rhoB, powers_[i] - 3.0) /
380 std::pow(saturation_density_, powers_[i] - 1.0);
385 for (
int i = 0; i < number_of_terms(); i++) {
386 F_2 += coeffs_[i] * std::pow(abs_rhoB, powers_[i] - 2.0) /
387 std::pow(saturation_density_, powers_[i] - 1.0);
391 E_component -= (F_1 * (grad_rhoB * j0B + drhoB_dt * vecjB) +
392 F_2 * (grad_j0B + dvecjB_dt));
393 B_component += F_1 * gradrhoB_cross_vecjB + F_2 * curl_vecjB;
395 return std::make_pair(E_component, B_component);
399 std::pair<ThreeVector, ThreeVector> Potentials::vdf_force(
402 ThreeVector E_component(0.0, 0.0, 0.0), B_component(0.0, 0.0, 0.0);
404 E_component -= (grad_A_0 + dA_dt);
405 B_component += curl_A;
407 return std::make_pair(E_component, B_component);
410 double Potentials::dVsym_drhoI3(
const double rhoB,
const double rhoI3)
const {
412 if (symmetry_is_rhoB_dependent_) {
413 double term2 = 2. * rhoI3 * symmetry_S(rhoB) / (rhoB * rhoB);
420 double Potentials::dVsym_drhoB(
const double rhoB,
const double rhoI3)
const {
421 if (symmetry_is_rhoB_dependent_) {
423 double term1 = 8.2 * std::pow(rhoB_over_rho0, -1. / 3.) /
nuclear_density +
424 20. * symmetry_gamma_ *
425 std::pow(rhoB_over_rho0, symmetry_gamma_) / rhoB;
426 double term2 = -2. * symmetry_S(rhoB) / rhoB;
427 return mev_to_gev * (term1 + term2) * rhoI3 * rhoI3 / (rhoB * rhoB);
433 std::tuple<ThreeVector, ThreeVector, ThreeVector, ThreeVector>
434 Potentials::all_forces(
const ThreeVector &r,
const ParticleList &plist)
const {
435 const bool compute_gradient =
true;
436 const bool smearing =
true;
437 auto F_skyrme_or_VDF =
443 r, plist, param_, DensityType::Baryon, compute_gradient, smearing);
444 double rhoB = std::get<0>(baryon_density_and_gradient);
445 const ThreeVector grad_j0B = std::get<2>(baryon_density_and_gradient);
446 const ThreeVector curl_vecjB = std::get<3>(baryon_density_and_gradient);
447 const FourVector djmuB_dt = std::get<4>(baryon_density_and_gradient);
450 skyrme_force(rhoB, grad_j0B, djmuB_dt.
threevec(), curl_vecjB);
454 const auto density_and_gradient =
456 compute_gradient, smearing);
457 const double rhoI3 = std::get<0>(density_and_gradient);
458 const ThreeVector grad_j0I3 = std::get<2>(density_and_gradient);
459 const ThreeVector curl_vecjI3 = std::get<3>(density_and_gradient);
460 const FourVector dvecjI3_dt = std::get<4>(density_and_gradient);
462 symmetry_force(rhoI3, grad_j0I3, dvecjI3_dt.
threevec(), curl_vecjI3,
463 rhoB, grad_j0B, djmuB_dt.
threevec(), curl_vecjB);
467 const FourVector jmuB = std::get<1>(baryon_density_and_gradient);
468 const FourVector djmuB_dx = std::get<5>(baryon_density_and_gradient);
469 const FourVector djmuB_dy = std::get<6>(baryon_density_and_gradient);
470 const FourVector djmuB_dz = std::get<7>(baryon_density_and_gradient);
473 const int sgn = rhoB > 0 ? 1 : -1;
478 const double drhoB_dt =
479 (1 / rhoB) * (jmuB.
x0() * djmuB_dt.
x0() - jmuB.
x1() * djmuB_dt.
x1() -
480 jmuB.
x2() * djmuB_dt.
x2() - jmuB.
x3() * djmuB_dt.
x3());
482 const double drhoB_dx =
483 (1 / rhoB) * (jmuB.
x0() * djmuB_dx.
x0() - jmuB.
x1() * djmuB_dx.
x1() -
484 jmuB.
x2() * djmuB_dx.
x2() - jmuB.
x3() * djmuB_dx.
x3());
486 const double drhoB_dy =
487 (1 / rhoB) * (jmuB.
x0() * djmuB_dy.
x0() - jmuB.
x1() * djmuB_dy.
x1() -
488 jmuB.
x2() * djmuB_dy.
x2() - jmuB.
x3() * djmuB_dy.
x3());
490 const double drhoB_dz =
491 (1 / rhoB) * (jmuB.
x0() * djmuB_dz.
x0() - jmuB.
x1() * djmuB_dz.
x1() -
492 jmuB.
x2() * djmuB_dz.
x2() - jmuB.
x3() * djmuB_dz.
x3());
494 const FourVector drhoB_dxnu = {drhoB_dt, drhoB_dx, drhoB_dy, drhoB_dz};
500 F_skyrme_or_VDF = vdf_force(
501 rhoB, drhoB_dt, drhoB_dxnu.
threevec(), Drho_cross_vecj, jmuB.
x0(),
505 return std::make_tuple(F_skyrme_or_VDF.first, F_skyrme_or_VDF.second,
506 F_symmetry.first, F_symmetry.second);
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
ThreeVector threevec() const
Particle type contains the static properties of a particle species.
double isospin3_rel() const
int baryon_number() const
Potentials(Configuration conf, const DensityParameters ¶meters)
Potentials constructor.
The ThreeVector class represents a physical three-vector with the components .
ThreeVector cross_product(const ThreeVector &b) const
Collection of useful constants that are known at compile time.
int sgn(T val)
Signum function.
constexpr double mev_to_gev
MeV to GeV conversion factor.
std::tuple< double, FourVector, ThreeVector, ThreeVector, FourVector, FourVector, FourVector, FourVector > current_eckart(const ThreeVector &r, const ParticleList &plist, const DensityParameters &par, DensityType dens_type, bool compute_gradient, bool smearing)
Calculates Eckart rest frame density and 4-current of a given density type and optionally the gradien...
constexpr double very_small_double
A very small double, used to avoid division by zero.
constexpr double nuclear_density
Ground state density of symmetric nuclear matter [fm^-3].