19 use_skyrme_(conf.has_value({
"Skyrme"})),
20 use_symmetry_(conf.has_value({
"Symmetry"})) {
72 skyrme_a_ = conf.take({
"Skyrme",
"Skyrme_A"});
73 skyrme_b_ = conf.take({
"Skyrme",
"Skyrme_B"});
74 skyrme_tau_ = conf.take({
"Skyrme",
"Skyrme_Tau"});
99 symmetry_S_Pot_ = conf.take({
"Symmetry",
"S_Pot"});
100 if (conf.has_value({
"Symmetry",
"gamma"})) {
101 symmetry_gamma_ = conf.take({
"Symmetry",
"gamma"});
102 symmetry_is_rhoB_dependent_ =
true;
107 Potentials::~Potentials() {}
109 double Potentials::skyrme_pot(
const double baryon_density)
const {
113 const int sgn = tmp > 0 ? 1 : -1;
115 return 1.0e-3 *
sgn *
116 (skyrme_a_ * std::abs(tmp) +
117 skyrme_b_ * std::pow(std::abs(tmp), skyrme_tau_));
119 double Potentials::symmetry_S(
const double baryon_density)
const {
120 if (symmetry_is_rhoB_dependent_) {
127 double Potentials::symmetry_pot(
const double baryon_isospin_density,
128 const double baryon_density)
const {
130 1.0e-3 * 2. * symmetry_S_Pot_ * baryon_isospin_density /
nuclear_density;
131 if (symmetry_is_rhoB_dependent_) {
132 pot += 1.0e-3 * symmetry_S(baryon_density) * baryon_isospin_density *
133 baryon_isospin_density / (baryon_density * baryon_density);
138 double Potentials::potential(
const ThreeVector &r,
const ParticleList &plist,
140 double total_potential = 0.0;
141 const bool compute_gradient =
false;
142 const bool smearing =
true;
143 const auto scale = force_scale(acts_on);
146 return total_potential;
149 r, plist, param_, DensityType::Baryon, compute_gradient, smearing));
151 total_potential += scale.first * skyrme_pot(rho_B);
154 const double rho_iso = std::get<0>(
156 compute_gradient, smearing));
157 const double sym_pot =
159 total_potential += scale.second * sym_pot;
161 return total_potential;
164 std::pair<double, int> Potentials::force_scale(
const ParticleType &data) {
165 const auto &pdg = data.
pdgcode();
166 const double skyrme_scale =
167 (3 - std::abs(pdg.strangeness())) / 3. * pdg.
baryon_number();
168 const int symmetry_scale = pdg.baryon_number();
169 return std::make_pair(skyrme_scale, symmetry_scale);
172 std::pair<ThreeVector, ThreeVector> Potentials::skyrme_force(
175 ThreeVector E_component(0.0, 0.0, 0.0), B_component(0.0, 0.0, 0.0);
177 const double dV_drho =
178 (skyrme_a_ + skyrme_b_ * skyrme_tau_ *
181 E_component -= dV_drho * (grad_rho + dj_dt);
182 B_component += dV_drho * rot_j;
184 return std::make_pair(E_component, B_component);
187 std::pair<ThreeVector, ThreeVector> Potentials::symmetry_force(
191 ThreeVector E_component(0.0, 0.0, 0.0), B_component(0.0, 0.0, 0.0);
193 E_component -= dVsym_drhoI3(rhoB, rhoI3) * (grad_rhoI3 + djI3_dt) +
194 dVsym_drhoB(rhoB, rhoI3) * (grad_rhoB + djB_dt);
196 dVsym_drhoI3(rhoB, rhoI3) * rot_jI3 + dVsym_drhoB(rhoB, rhoI3) * rot_jB;
198 return std::make_pair(E_component, B_component);
201 double Potentials::dVsym_drhoI3(
const double rhoB,
const double rhoI3)
const {
203 if (symmetry_is_rhoB_dependent_) {
204 double term2 = 2. * rhoI3 * symmetry_S(rhoB) / (rhoB * rhoB);
211 double Potentials::dVsym_drhoB(
const double rhoB,
const double rhoI3)
const {
212 if (symmetry_is_rhoB_dependent_) {
214 double term1 = 8.2 * std::pow(rhoB_over_rho0, -1. / 3.) /
nuclear_density +
215 20. * symmetry_gamma_ *
216 std::pow(rhoB_over_rho0, symmetry_gamma_) / rhoB;
217 double term2 = -2. * symmetry_S(rhoB) / rhoB;
218 return mev_to_gev * (term1 + term2) * rhoI3 * rhoI3 / (rhoB * rhoB);
224 std::tuple<ThreeVector, ThreeVector, ThreeVector, ThreeVector>
225 Potentials::all_forces(
const ThreeVector &r,
const ParticleList &plist)
const {
226 const bool compute_gradient =
true;
227 const bool smearing =
true;
234 r, plist, param_, DensityType::Baryon, compute_gradient, smearing);
235 const double rhoB = std::get<0>(baryon_density_and_gradient);
236 const ThreeVector grad_rhoB = std::get<2>(baryon_density_and_gradient);
237 const ThreeVector djB_dt = std::get<3>(baryon_density_and_gradient);
238 const ThreeVector rot_jB = std::get<4>(baryon_density_and_gradient);
240 F_skyrme = skyrme_force(rhoB, grad_rhoB, djB_dt, rot_jB);
244 const auto density_and_gradient =
246 compute_gradient, smearing);
247 const double rhoI3 = std::get<0>(density_and_gradient);
248 const ThreeVector grad_rhoI3 = std::get<2>(density_and_gradient);
249 const ThreeVector djI3_dt = std::get<3>(density_and_gradient);
250 const ThreeVector rot_jI3 = std::get<4>(density_and_gradient);
251 F_symmetry = symmetry_force(rhoI3, grad_rhoI3, djI3_dt, rot_jI3, rhoB,
252 grad_rhoB, djB_dt, rot_jB);
255 return std::make_tuple(F_skyrme.first, F_skyrme.second, F_symmetry.first,