energy_gap.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from charged_shells import expansion, interactions, mapping, charge_distributions
  4. from charged_shells.parameters import ModelParams
  5. from functools import partial
  6. from matplotlib import cm
  7. from mpl_toolkits.axes_grid1 import make_axes_locatable
  8. from matplotlib.colors import TwoSlopeNorm
  9. from matplotlib.ticker import FuncFormatter
  10. from config import *
  11. Expansion = expansion.Expansion
  12. def energy_gap(ex1: Expansion, params: ModelParams, dist=2., match_expansion_axis_to_params=None):
  13. ex2 = ex1.clone()
  14. ex3 = ex1.clone()
  15. ex2.rotate_euler(alpha=0, beta=np.pi/2, gamma=0) # to get EP config between ex1 and ex2
  16. energy_fn = mapping.parameter_map_two_expansions(partial(interactions.charged_shell_energy, dist=dist),
  17. match_expansion_axis_to_params)
  18. energy_ep = energy_fn(ex1, ex2, params)
  19. energy_pp = energy_fn(ex1, ex3, params)
  20. return (energy_pp - energy_ep) / energy_pp
  21. def abar_kappaR_dependence(save_as=None):
  22. kappaR = np.linspace(0.01, 25, 25)
  23. a_bar = np.array([0.2, 0.4, 0.6, 0.8])
  24. params = ModelParams(R=150, kappaR=kappaR)
  25. ex = charge_distributions.create_mapped_quad_expansion(a_bar[:, None], kappaR[None, :], 0.001)
  26. # ex = expansion.MappedExpansionQuad(a_bar, kappaR, 0.001)
  27. gap = energy_gap(ex, params, match_expansion_axis_to_params=1)
  28. fig, ax = plt.subplots(figsize=plt.figaspect(0.5))
  29. for g, lbl in zip(gap, [rf'$\bar a={a}$' for a in a_bar]):
  30. ax.plot(kappaR, g, label=lbl)
  31. ax.legend(fontsize=17)
  32. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=12)
  33. ax.set_xlabel(r'$\kappa R$', fontsize=15)
  34. ax.set_ylabel(r'$\frac{V_{pp}-V_{ep}}{V_{pp}}$', fontsize=20)
  35. plt.tight_layout()
  36. if save_as is not None:
  37. plt.savefig(save_as, dpi=600)
  38. plt.show()
  39. def abar_kappaR_dependence2(save_as=None):
  40. kappaR = np.array([1, 3, 10, 30])
  41. a_bar = np.linspace(0.2, 0.8, 30)
  42. params = ModelParams(R=150, kappaR=kappaR)
  43. ex = charge_distributions.create_mapped_quad_expansion(a_bar[:, None], kappaR[None, :], 0.001)
  44. # ex = expansion.MappedExpansionQuad(a_bar, kappaR, 0.001)
  45. gap = energy_gap(ex, params, match_expansion_axis_to_params=1)
  46. fig, ax = plt.subplots(figsize=plt.figaspect(0.5))
  47. for g, lbl in zip(gap.T, [rf'$\kappa R={kR}$' for kR in kappaR]):
  48. ax.plot(a_bar, g, label=lbl)
  49. ax.legend(fontsize=17)
  50. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=12)
  51. ax.set_xlabel(r'$\bar a$', fontsize=15)
  52. ax.set_ylabel(r'$\frac{V_{pp}-V_{ep}}{V_{pp}}$', fontsize=20)
  53. plt.tight_layout()
  54. if save_as is not None:
  55. plt.savefig(save_as, dpi=600)
  56. plt.show()
  57. def charge_kappaR_dependence(a_bar, min_charge, max_charge, save_as=None, cmap=cm.jet):
  58. kappaR = np.linspace(0.01, 10, 50)
  59. sigma_tilde = 0.001
  60. params = ModelParams(R=150, kappaR=kappaR)
  61. charge = np.linspace(min_charge, max_charge, 100)
  62. ex = charge_distributions.create_mapped_quad_expansion(a_bar, kappaR, sigma_tilde, sigma0=charge)
  63. # ex = expansion.MappedExpansionQuad(a_bar, kappaR, 0.001)
  64. gap = energy_gap(ex, params, match_expansion_axis_to_params=0)
  65. colors = cmap(np.linspace(0, 1, len(charge)))
  66. sm = cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=np.min(charge) / sigma_tilde,
  67. vmax=np.max(charge) / sigma_tilde))
  68. sm.set_array([])
  69. fig, ax = plt.subplots(figsize=plt.figaspect(0.5))
  70. for g, c in zip(gap.T, colors):
  71. ax.plot(kappaR, g, c=c)
  72. # ax.legend(fontsize=17)
  73. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=15)
  74. ax.set_xlabel(r'$\kappa R$', fontsize=20)
  75. ax.set_ylabel(r'$(V_{pp}-V_{ep})/V_{pp}$', fontsize=20)
  76. divider = make_axes_locatable(ax)
  77. cax = divider.append_axes('right', size='5%', pad=0.05)
  78. cax.tick_params(labelsize=15)
  79. cbar = fig.colorbar(sm, cax=cax, orientation='vertical')
  80. cbar.set_label(r'$\eta$', rotation=0, labelpad=15, fontsize=20)
  81. # plt.tight_layout()
  82. plt.subplots_adjust(left=0.1, right=0.9, top=0.95, bottom=0.12)
  83. if save_as is not None:
  84. plt.savefig(save_as, dpi=600)
  85. plt.show()
  86. def charge_kappaR_dependence_heatmap(a_bar, min_charge, max_charge, save_as=None, cmap=cm.jet):
  87. kappaR = np.linspace(0.01, 10, 50)
  88. params = ModelParams(R=150, kappaR=kappaR)
  89. charge = np.linspace(min_charge, max_charge, 100)
  90. ex = charge_distributions.create_mapped_quad_expansion(a_bar, kappaR, 0.001, sigma0=charge)
  91. # ex = expansion.MappedExpansionQuad(a_bar, kappaR, 0.001)
  92. gap = energy_gap(ex, params, match_expansion_axis_to_params=0)
  93. norm = TwoSlopeNorm(vmin=np.min(gap), vcenter=0, vmax=np.max(gap))
  94. sm = cm.ScalarMappable(cmap=cmap, norm=norm)
  95. sm.set_array([])
  96. def y_formatter(x, pos):
  97. return f"{charge[int(x)-1]:.2f}"
  98. def x_formatter(x, pos):
  99. return f"{kappaR[int(x)-1]:.2f}"
  100. fig, ax = plt.subplots(figsize=plt.figaspect(1))
  101. ax.imshow(gap.T, cmap=cmap, origin='lower',
  102. # extent=[kappaR.min(), kappaR.max(), charge.min(), charge.max()]
  103. )
  104. # ax.legend(fontsize=17)
  105. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=12)
  106. ax.set_xlabel(r'$\kappa R$', fontsize=15)
  107. ax.set_ylabel(r'$\tilde \sigma_0$', fontsize=15)
  108. plt.gca().xaxis.set_major_formatter(FuncFormatter(x_formatter))
  109. plt.gca().yaxis.set_major_formatter(FuncFormatter(y_formatter))
  110. # ax.set_xticks(kappaR)
  111. # ax.set_yticks(charge)
  112. divider = make_axes_locatable(ax)
  113. cax = divider.append_axes('right', size='5%', pad=0.05)
  114. cbar = fig.colorbar(sm, cax=cax, orientation='vertical')
  115. cbar.set_label(r'$\frac{V_{pp}-V_{ep}}{V_{pp}}$', rotation=90, labelpad=20, fontsize=12)
  116. plt.tight_layout()
  117. if save_as is not None:
  118. plt.savefig(save_as, dpi=600)
  119. plt.show()
  120. def IC_gap_plot(save_as=None):
  121. em_data_path = (ICI_DATA_PATH.joinpath("FIG_10"))
  122. em_data = np.load(em_data_path.joinpath("relative_gap.npz"))
  123. for k in list(em_data.keys()):
  124. data = em_data[k]
  125. print(k, data.shape)
  126. for i in range(3):
  127. print(np.unique(data[:, i]))
  128. print('\n')
  129. def IC_gap_kappaR(save_as=None):
  130. em_data_path = (ICI_DATA_PATH.joinpath("FIG_10"))
  131. em_data = np.load(em_data_path.joinpath("relative_gap.npz"))
  132. data = em_data['fixA']
  133. print(data)
  134. sort = np.argsort(data[:, 2])
  135. xdata = data[:, 2][sort]
  136. ydata = data[:, 3][sort]
  137. plt.plot(xdata, ydata)
  138. plt.xlabel('kappaR')
  139. plt.ylabel('gap')
  140. plt.show()
  141. def IC_gap_abar(save_as=None):
  142. em_data_path = (ICI_DATA_PATH.joinpath("FIG_10"))
  143. em_data = np.load(em_data_path.joinpath("relative_gap.npz"))
  144. data = em_data['fixM']
  145. print(data)
  146. sort = np.argsort(data[:, 1])
  147. xdata = data[:, 1][sort]
  148. ydata = data[:, 3][sort]
  149. plt.plot(xdata, ydata)
  150. plt.xlabel('abar')
  151. plt.ylabel('gap')
  152. plt.show()
  153. def IC_gap_charge_at_abar(a_bar, save_as=None, cmap=cm.coolwarm, which_change='changezp',
  154. eta_min: float = None, eta_max: float = None):
  155. em_data_path = (ICI_DATA_PATH.joinpath("FIG_10"))
  156. em_data = np.load(em_data_path.joinpath("relative_gap_ZC.npz"))
  157. data = em_data[which_change]
  158. sigma_tilde = 0.001
  159. relevant_indices = data[:, 1] == a_bar
  160. if not np.any(relevant_indices):
  161. raise ValueError(f'No results for given a_bar = {a_bar}. Possible values: {np.unique(data[:, 1])}')
  162. data = data[relevant_indices]
  163. charge, inverse, counts = np.unique(data[:, 0], return_counts=True, return_inverse=True)
  164. # print(f'All charge: {charge}')
  165. eta = charge / sigma_tilde
  166. if eta_min is None:
  167. eta_min = np.min(eta)
  168. if eta_max is None:
  169. eta_max = np.max(eta)
  170. def map_eta_to_unit(x):
  171. return (x - eta_min) / (eta_max - eta_min)
  172. # print(eta[0], eta[1])
  173. # print(map_eta_to_unit(eta[0]), map_eta_to_unit(eta[-1]))
  174. colors_linspace = np.linspace(map_eta_to_unit(eta[0]), map_eta_to_unit(eta[-1]), len(charge))
  175. colors_linspace[colors_linspace > 1] = 1
  176. colors_linspace[colors_linspace < 0] = 0
  177. colors = cmap(colors_linspace)
  178. sm = cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=eta_min, vmax=eta_max))
  179. sm.set_array([])
  180. fig, ax = plt.subplots(figsize=plt.figaspect(0.5))
  181. for i, c in enumerate(colors):
  182. idx, = np.nonzero(inverse == i)
  183. kR = data[idx, 2]
  184. gap = data[idx, 3]
  185. sort = np.argsort(kR)
  186. ax.plot(kR[sort], gap[sort], c=c)
  187. ax.tick_params(which='both', direction='in', top=True, right=True, labelsize=15)
  188. ax.set_xlabel(r'$\kappa R$', fontsize=20)
  189. ax.set_ylabel(r'$(V_{pp}-V_{ep})/V_{pp}$', fontsize=20)
  190. ax.set_xlim(-0.25, 10.25)
  191. ax.set_ylim(-4, 5)
  192. divider = make_axes_locatable(ax)
  193. cax = divider.append_axes('right', size='5%', pad=0.05)
  194. cax.tick_params(labelsize=15)
  195. cbar = fig.colorbar(sm, cax=cax, orientation='vertical')
  196. cbar.set_label(r'$\eta$', rotation=0, labelpad=15, fontsize=20)
  197. # plt.tight_layout()
  198. plt.subplots_adjust(left=0.1, right=0.9, top=0.95, bottom=0.12)
  199. if save_as is not None:
  200. plt.savefig(save_as, dpi=600)
  201. plt.show()
  202. def test_gap(a_bar, kappaR, charge):
  203. params = ModelParams(R=150, kappaR=kappaR)
  204. ex = charge_distributions.create_mapped_quad_expansion(a_bar, kappaR, 0.001, sigma0=charge)
  205. gap = energy_gap(ex, params, match_expansion_axis_to_params=None)
  206. print(gap)
  207. def main():
  208. # test_gap(0.3, 10, charge=-0.003)
  209. # abar_kappaR_dependence(Path("/home/andraz/ChargedShells/Figures/full_amplitude_kappaR_dep.png"))
  210. # abar_kappaR_dependence2(Path("/home/andraz/ChargedShells/Figures/full_amplitude_abar_dep.png"))
  211. # charge_kappaR_dependence(a_bar=0.8, min_charge=-0.002, max_charge=0.002,
  212. # save_as=Path("/home/andraz/ChargedShells/Figures/full_amplitude_charge_abar08.png"),
  213. # cmap=cm.coolwarm)
  214. # charge_kappaR_dependence_heatmap(a_bar=0.5, min_charge=-0.003, max_charge=0.003,
  215. # save_as=Path("/home/andraz/ChargedShells/Figures/full_amplitude_heatmap_abar05.png"),
  216. # cmap=cm.bwr)
  217. # IC_gap_plot()
  218. # IC_gap_kappaR()
  219. # IC_gap_abar()
  220. IC_gap_charge_at_abar(0.3, which_change='changezc', eta_min=-2, eta_max=2,
  221. save_as=FIGURES_PATH.joinpath('ICi_data').joinpath('IC_full_amplitude_charge_abar03.png')
  222. )
  223. if __name__ == '__main__':
  224. main()