expansion_mapping_test.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import unittest
  2. import numpy as np
  3. from charged_shells import interactions, parameters, units_and_constants, mapping, potentials, charge_distributions
  4. from functools import partial
  5. EPSILON_0 = units_and_constants.CONSTANTS.epsilon0
  6. class IsotropicTest(unittest.TestCase):
  7. def setUp(self):
  8. self.charge = 560
  9. self.kappaR = np.array([0.1, 1, 3, 5, 10, 20])
  10. self.radius = 150
  11. self.dist = 2 * self.radius
  12. self.sigma0 = self.charge / (4 * np.pi * self.radius ** 2)
  13. self.ex1 = charge_distributions.create_mapped_quad_expansion(0, self.kappaR, 0, l_max=10, sigma0=self.sigma0)
  14. self.ex2 = self.ex1.clone()
  15. self.params = parameters.ModelParams(kappaR=self.kappaR, R=self.radius)
  16. def test_potential(self):
  17. theta = np.linspace(0, np.pi, 100)
  18. def cs_potential_fn(ex, params):
  19. return potentials.charged_shell_potential(theta, 0., self.dist / self.radius, ex, params)
  20. mapped_cs_potential_fn = mapping.parameter_map_single_expansion(cs_potential_fn, 0)
  21. cs_potential = mapped_cs_potential_fn(self.ex1, self.params)
  22. ic_potential = []
  23. for p in mapping.unravel_params(self.params):
  24. ic_potential.append(potentials.inverse_patchy_particle_potential(theta, 2., 0, self.sigma0,
  25. (0., 0.), p, lmax=10))
  26. ic_potential = np.array(ic_potential)
  27. np.testing.assert_almost_equal(cs_potential, ic_potential)
  28. def test_interaction(self):
  29. int_analytic = (self.charge ** 2 / (4 * np.pi * EPSILON_0 * self.params.epsilon) *
  30. (np.exp(self.params.kappaR) / (1 + self.params.kappaR)) ** 2 * np.exp(-self.params.kappa * self.dist) / self.dist)
  31. energy_fn = mapping.parameter_map_two_expansions(partial(interactions.charged_shell_energy,
  32. dist=self.dist/self.radius, units='eV'),
  33. 0)
  34. int_comp = energy_fn(self.ex1, self.ex2, self.params)
  35. print(int_analytic)
  36. print(int_comp)
  37. print(int_comp / int_analytic)
  38. np.testing.assert_almost_equal(int_comp, int_analytic)