ebsdsim 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. ebsdsim/__init__.py +29 -0
  2. ebsdsim/_pg_ops_data.py +92 -0
  3. ebsdsim/_sg_ops_data.py +9 -0
  4. ebsdsim/api.py +478 -0
  5. ebsdsim/binning.py +133 -0
  6. ebsdsim/cif.py +425 -0
  7. ebsdsim/data/__init__.py +1 -0
  8. ebsdsim/data/goldens/kgrid_rasterize_golden.json +1 -0
  9. ebsdsim/data/lightweight_hist_surrogate.npz +0 -0
  10. ebsdsim/data/preset_cifs/GaN.cif +44 -0
  11. ebsdsim/data/preset_cifs/Ni.cif +222 -0
  12. ebsdsim/elements.py +60 -0
  13. ebsdsim/golden.py +46 -0
  14. ebsdsim/gpu/__init__.py +14 -0
  15. ebsdsim/gpu/buffers.py +104 -0
  16. ebsdsim/gpu/device.py +54 -0
  17. ebsdsim/gpu/dynamical.py +1045 -0
  18. ebsdsim/gpu/limits.py +34 -0
  19. ebsdsim/gpu/lu.py +209 -0
  20. ebsdsim/gpu/monte_carlo.py +392 -0
  21. ebsdsim/gpu/pipelines.py +174 -0
  22. ebsdsim/gpu/rasterize.py +376 -0
  23. ebsdsim/integrate.py +305 -0
  24. ebsdsim/kgrid.py +224 -0
  25. ebsdsim/lookup.py +585 -0
  26. ebsdsim/material.py +96 -0
  27. ebsdsim/mploader.py +601 -0
  28. ebsdsim/pg_ops.py +92 -0
  29. ebsdsim/prescan.py +126 -0
  30. ebsdsim/rasterize.py +324 -0
  31. ebsdsim/runner.py +341 -0
  32. ebsdsim/save.py +214 -0
  33. ebsdsim/sgh.py +68 -0
  34. ebsdsim/spacegroup.py +62 -0
  35. ebsdsim/structure.py +216 -0
  36. ebsdsim/surrogate.py +296 -0
  37. ebsdsim/types.py +77 -0
  38. ebsdsim/wgsl/ebsd_assemble_geff_q.wgsl +98 -0
  39. ebsdsim/wgsl/ebsd_bethe_weight_vws_c64.wgsl +50 -0
  40. ebsdsim/wgsl/ebsd_excitation_score.wgsl +90 -0
  41. ebsdsim/wgsl/ebsd_gather_diagonal_c64.wgsl +47 -0
  42. ebsdsim/wgsl/ebsd_gather_sgh_site_c64.wgsl +32 -0
  43. ebsdsim/wgsl/ebsd_gemm_c64_batched.wgsl +64 -0
  44. ebsdsim/wgsl/ebsd_gemv_c64_batched.wgsl +69 -0
  45. ebsdsim/wgsl/ebsd_hash_diff_u32.wgsl +45 -0
  46. ebsdsim/wgsl/ebsd_intensity_contract.wgsl +87 -0
  47. ebsdsim/wgsl/ebsd_lambert_fill.wgsl +71 -0
  48. ebsdsim/wgsl/ebsd_lookup_submatrix_c64.wgsl +56 -0
  49. ebsdsim/wgsl/ebsd_output_writeback_f32.wgsl +29 -0
  50. ebsdsim/wgsl/ebsd_pack_w_c64.wgsl +39 -0
  51. ebsdsim/wgsl/ebsd_prescan_counts.wgsl +122 -0
  52. ebsdsim/wgsl/ebsd_topk_indices.wgsl +134 -0
  53. ebsdsim/wgsl/lu_factor_complex64.wgsl +1 -0
  54. ebsdsim/wgsl/lu_factor_lead_complex64.wgsl +1 -0
  55. ebsdsim/wgsl/lu_factor_trailing_complex64.wgsl +1 -0
  56. ebsdsim/wgsl/lu_factor_upper_complex64.wgsl +1 -0
  57. ebsdsim/wgsl/lu_solve_large_complex64.wgsl +1 -0
  58. ebsdsim/wgsl/lu_solve_shared_complex64.wgsl +1 -0
  59. ebsdsim/wgsl/mc_boundary_modes.wgsl +237 -0
  60. ebsdsim/wk.py +455 -0
  61. ebsdsim/wk_params.py +8 -0
  62. ebsdsim-0.1.0.dist-info/METADATA +359 -0
  63. ebsdsim-0.1.0.dist-info/RECORD +66 -0
  64. ebsdsim-0.1.0.dist-info/WHEEL +5 -0
  65. ebsdsim-0.1.0.dist-info/licenses/LICENSE +21 -0
  66. ebsdsim-0.1.0.dist-info/top_level.txt +1 -0
ebsdsim/__init__.py ADDED
@@ -0,0 +1,29 @@
1
+ """GPU-accelerated dynamical EBSD master-pattern simulation."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from importlib.metadata import PackageNotFoundError, version
6
+
7
+ from ebsdsim.api import Atom, Cell, Material, MasterPattern, master_pattern, master_pattern_from_cif
8
+ from ebsdsim.mploader import LoadedMasterPattern, load_master_pattern, save_png_gray, to_uint8
9
+ from ebsdsim.save import save_master_pattern
10
+
11
+ try:
12
+ __version__ = version("ebsdsim")
13
+ except PackageNotFoundError:
14
+ __version__ = "0.0.0+dev"
15
+
16
+ __all__ = [
17
+ "Atom",
18
+ "Cell",
19
+ "LoadedMasterPattern",
20
+ "Material",
21
+ "MasterPattern",
22
+ "__version__",
23
+ "load_master_pattern",
24
+ "master_pattern",
25
+ "master_pattern_from_cif",
26
+ "save_master_pattern",
27
+ "save_png_gray",
28
+ "to_uint8",
29
+ ]
@@ -0,0 +1,92 @@
1
+ """AUTO-GENERATED from pg-ops-data.ts — do not edit by hand."""
2
+ from __future__ import annotations
3
+
4
+ import numpy as np
5
+
6
+ PG_NUM_TO_SYMBOL = ['1', '-1', '2', 'm', '2/m', '222', 'mm2', 'mmm', '4', '-4', '4/m', '422', '4mm', '-42m', '4/mmm', '3', '-3', '32', '3m', '-3m', '6', '-6', '6/m', '622', '6mm', '-6m2', '6/mmm', '23', 'm-3', '432', '-43m', 'm-3m']
7
+ PG_OPERATORS = {
8
+ '-1': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
9
+ '-3': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
10
+ '-31m': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, -1, -0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, 1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, -1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
11
+ '-3m': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
12
+ '-3m1': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
13
+ '-4': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
14
+ '-42m': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
15
+ '-43m': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, -1, 0, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
16
+ '-4m2': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
17
+ '-6': np.array([-0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, -1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
18
+ '-62m': np.array([-0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, 1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, -1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
19
+ '-6m2': np.array([-1, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, -1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, -1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
20
+ '1': np.array([1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
21
+ '112': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
22
+ '112/m': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
23
+ '11m': np.array([1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
24
+ '12/m1': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
25
+ '121': np.array([-1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
26
+ '1m1': np.array([1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
27
+ '2': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
28
+ '2/m': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
29
+ '2/m11': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
30
+ '211': np.array([1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
31
+ '222': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
32
+ '23': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
33
+ '2mm': np.array([1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
34
+ '3': np.array([-0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
35
+ '312': np.array([-1, 0, 0, 0, 1, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
36
+ '31m': np.array([-0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, 1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
37
+ '32': np.array([-0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
38
+ '321': np.array([-0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
39
+ '3m': np.array([-1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
40
+ '3m1': np.array([-1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
41
+ '4': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
42
+ '4/m': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 1, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
43
+ '4/mmm': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
44
+ '422': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
45
+ '432': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, 0, 1, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, -1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
46
+ '4mm': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
47
+ '6': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
48
+ '6/m': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, -1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
49
+ '6/mmm': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, 1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, -1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, -1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, -1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
50
+ '622': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, -1, -0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, -1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, -1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, -1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
51
+ '6mm': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, -0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, 1, -0.5, -0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, -0.5, 0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, -0.8660254038, -0.5, 0, 0, 0, 1, 0.5, -0.8660254038, 0, 0.8660254038, 0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, -0.8660254038, 0.5, 0, 0, 0, 1, 0.5, 0.8660254038, 0, 0.8660254038, -0.5, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
52
+ 'm': np.array([1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
53
+ 'm-3': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
54
+ 'm-3m': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, -1, 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, -1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
55
+ 'm11': np.array([-1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
56
+ 'm2m': np.array([-1, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
57
+ 'mm2': np.array([-1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
58
+ 'mmm': np.array([-1, 0, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, -1, 0, 0, 0, -1, 1, 0, 0, 0, -1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, -1, 1, 0, 0, 0, 1, 0, 0, 0, 1], dtype=np.float64),
59
+ }
60
+ FS_NORMALS = {
61
+ '-1': np.array([0, 0, 1], dtype=np.float64),
62
+ '-3': np.array([0, 0, 1, 0, 1, 0, 0.8660254038, 0.5, 0], dtype=np.float64),
63
+ '-3m': np.array([0, 0, 1, 0.5, 0.8660254038, 0, 0.5, -0.8660254038, 0], dtype=np.float64),
64
+ '-4': np.array([0, 0, 1, 0, 1, 0, 0, 1, 0], dtype=np.float64),
65
+ '-42m': np.array([0, 0, 1, 0.7071067812, 0.7071067812, 0, 0.7071067812, -0.7071067812, 0], dtype=np.float64),
66
+ '-43m': np.array([1, -1, 0, 1, 1, 0, -1, 0, 1], dtype=np.float64),
67
+ '-6': np.array([0, 0, 1, 0, 1, 0, 0.8660254038, 0.5, 0], dtype=np.float64),
68
+ '-6m2': np.array([0, 0, 1, 0.5, 0.8660254038, 0, 0.5, -0.8660254038, 0], dtype=np.float64),
69
+ '2': np.array([0, 1, 0], dtype=np.float64),
70
+ '2/m': np.array([0, 0, 1, 0, 1, 0], dtype=np.float64),
71
+ '222': np.array([0, 0, 1, 0, 1, 0, 0, 1, 0], dtype=np.float64),
72
+ '23': np.array([1, 1, 0, 1, -1, 0, 0, -1, 1, 0, 1, 1], dtype=np.float64),
73
+ '3': np.array([0, 1, 0, 0.8660254038, 0.5, 0], dtype=np.float64),
74
+ '32': np.array([0, 0, 1, 0, 1, 0, 0.8660254038, 0.5, 0], dtype=np.float64),
75
+ '3m': np.array([0.5, 0.8660254038, 0, 0.5, -0.8660254038, 0], dtype=np.float64),
76
+ '4': np.array([0, 1, 0, 1, 0, 0], dtype=np.float64),
77
+ '4/m': np.array([0, 0, 1, 0, 1, 0, 1, 0, 0], dtype=np.float64),
78
+ '4/mmm': np.array([0, 0, 1, 0, 1, 0, 0.7071067812, -0.7071067812, 0], dtype=np.float64),
79
+ '422': np.array([0, 0, 1, 0, 1, 0, 1, 0, 0], dtype=np.float64),
80
+ '432': np.array([1, 0, 0, 0, -1, 1, -1, 0, 1, 0, 1, 0, 0, 0, 1], dtype=np.float64),
81
+ '4mm': np.array([0, 1, 0, 0.7071067812, -0.7071067812, 0], dtype=np.float64),
82
+ '6': np.array([0, 1, 0, 0.8660254038, -0.5, 0], dtype=np.float64),
83
+ '6/m': np.array([0, 0, 1, 0, 1, 0, 0.8660254038, -0.5, 0], dtype=np.float64),
84
+ '6/mmm': np.array([0, 0, 1, 0, 1, 0, 0.5, -0.8660254038, 0], dtype=np.float64),
85
+ '622': np.array([0, 0, 1, 0, 1, 0, 0.8660254038, -0.5, 0], dtype=np.float64),
86
+ '6mm': np.array([0, 1, 0, 0.5, -0.8660254038, 0], dtype=np.float64),
87
+ 'm': np.array([0, 0, 1], dtype=np.float64),
88
+ 'm-3': np.array([1, 0, 0, 0, -1, 1, -1, 0, 1, 0, 1, 0, 0, 0, 1], dtype=np.float64),
89
+ 'm-3m': np.array([1, -1, 0, -1, 0, 1, 0, 1, 0], dtype=np.float64),
90
+ 'mm2': np.array([1, 0, 0, 0, 1, 0], dtype=np.float64),
91
+ 'mmm': np.array([0, 0, 1, 0, 1, 0, 1, 0, 0], dtype=np.float64),
92
+ }