quadrupole_model_mappings.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from charged_shells import patch_size, parameters, charge_distributions
  2. from charged_shells import functions as fn
  3. from scipy.special import eval_legendre
  4. import numpy as np
  5. ModelParams = parameters.ModelParams
  6. Array = np.ndarray
  7. def point_to_gauss_magnitude(sigma_tilde: Array, a_bar: Array, lbd: Array, kappaR: Array):
  8. return (sigma_tilde * fn.coefficient_Cim(2, kappaR) / fn.coefficient_Cpm(2, kappaR)
  9. * np.sinh(lbd) / (lbd * fn.sph_bessel_i(2, lbd)) * a_bar ** 2)
  10. def point_to_cap_magnitude(sigma_tilde: Array, a_bar: Array, theta0: Array, kappaR: Array):
  11. return (sigma_tilde * 10 * fn.coefficient_Cim(2, kappaR) / fn.coefficient_Cpm(2, kappaR) *
  12. a_bar ** 2 / (eval_legendre(1, np.cos(theta0)) - eval_legendre(3, np.cos(theta0))))
  13. def ic_to_gauss(sigma_tilde, a_bar, params: ModelParams, l_max: int = 30,
  14. sigma0: float = 0) -> charge_distributions.create_gaussian_charge_expansion:
  15. ex_mapped = charge_distributions.create_mapped_quad_expansion(a_bar=a_bar, kappaR=params.kappaR,
  16. sigma_tilde=sigma_tilde, l_max=30, sigma0=sigma0)
  17. target_patch_size = patch_size.potential_patch_size(ex_mapped, params)
  18. sigma0_mapped = charge_distributions.net_charge_map(sigma0, params.kappaR)
  19. def fn_gauss(x):
  20. return charge_distributions.create_gaussian_charge_expansion(lambda_k=x, omega_k=np.array([[0, 0], [np.pi, 0]]),
  21. sigma1=sigma_tilde, l_max=l_max, sigma0=sigma0_mapped)
  22. lbd = patch_size.inverse_potential_patch_size(target_patch_size, fn_gauss, 5, params)
  23. gauss_sigma = point_to_gauss_magnitude(sigma_tilde, a_bar, lbd, params.kappaR)
  24. return charge_distributions.create_gaussian_charge_expansion(lambda_k=lbd, omega_k=np.array([[0, 0], [np.pi, 0]]),
  25. sigma1=gauss_sigma, l_max=l_max, sigma0=sigma0_mapped)
  26. def ic_to_cap(sigma_tilde, a_bar, params: ModelParams, l_max: int = 30, sigma0: float = 0) -> charge_distributions.create_spherical_cap_expansion:
  27. ex_mapped = charge_distributions.create_mapped_quad_expansion(a_bar=a_bar, kappaR=params.kappaR,
  28. sigma_tilde=sigma_tilde, l_max=30, sigma0=sigma0)
  29. target_patch_size = patch_size.potential_patch_size(ex_mapped, params)
  30. sigma0_mapped = charge_distributions.net_charge_map(sigma0, params.kappaR)
  31. def fn_cap(x):
  32. return charge_distributions.create_spherical_cap_expansion(theta0_k=x, sigma1=sigma_tilde, l_max=l_max,
  33. omega_k=np.array([[0, 0], [np.pi, 0]]), sigma0=sigma0_mapped)
  34. theta0 = patch_size.inverse_potential_patch_size(target_patch_size, fn_cap, 0.5, params)
  35. cap_sigma = point_to_cap_magnitude(sigma_tilde, a_bar, theta0, params.kappaR)
  36. return charge_distributions.create_spherical_cap_expansion(theta0_k=theta0, sigma1=cap_sigma,
  37. omega_k=np.array([[0, 0], [np.pi, 0]]), l_max=l_max, sigma0=0)