nmag-python-3 0.0.2__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 (147) hide show
  1. anisotropy/__init__.py +28 -0
  2. anisotropy/anisotropy.py +13 -0
  3. anisotropy/evaluation.py +70 -0
  4. anisotropy/model.py +200 -0
  5. anisotropy/predefined.py +202 -0
  6. anisotropy/py.typed +1 -0
  7. anisotropy/values.py +84 -0
  8. mag_material/__init__.py +3 -0
  9. mag_material/mag_material.py +231 -0
  10. mag_material/parameters.py +150 -0
  11. mag_material/py.typed +1 -0
  12. nmag/__init__.py +36 -0
  13. nmag/backends.py +493 -0
  14. nmag/checkpoint.py +327 -0
  15. nmag/config.py +174 -0
  16. nmag/demag/__init__.py +39 -0
  17. nmag/demag/bem_operator.py +149 -0
  18. nmag/demag/geometry.py +134 -0
  19. nmag/demag/lindholm.py +133 -0
  20. nmag/demag/lindholm_fast.py +463 -0
  21. nmag/demag/linear.py +489 -0
  22. nmag/dynamics/__init__.py +255 -0
  23. nmag/output.py +27 -0
  24. nmag/parallel.py +45 -0
  25. nmag/py.typed +1 -0
  26. nmag/resources.py +38 -0
  27. nmag/simulation/__init__.py +519 -0
  28. nmag/simulation/anisotropy/__init__.py +5 -0
  29. nmag/simulation/anisotropy/fields.py +56 -0
  30. nmag/simulation/anisotropy/materials.py +138 -0
  31. nmag/simulation/demag/__init__.py +1 -0
  32. nmag/simulation/demag/bem/__init__.py +11 -0
  33. nmag/simulation/demag/bem/diagnostics.py +73 -0
  34. nmag/simulation/demag/bem/dirichlet.py +85 -0
  35. nmag/simulation/demag/bem/hierarchical.py +74 -0
  36. nmag/simulation/demag/bem/operator.py +292 -0
  37. nmag/simulation/demag/fem/__init__.py +11 -0
  38. nmag/simulation/demag/fem/assembly.py +114 -0
  39. nmag/simulation/demag/fem/charges.py +38 -0
  40. nmag/simulation/demag/fem/geometry.py +261 -0
  41. nmag/simulation/demag/fields/__init__.py +11 -0
  42. nmag/simulation/demag/fields/auxiliary.py +186 -0
  43. nmag/simulation/demag/fields/probe.py +77 -0
  44. nmag/simulation/demag/fields/recovery.py +207 -0
  45. nmag/simulation/demag/solver.py +17 -0
  46. nmag/simulation/dynamics/__init__.py +92 -0
  47. nmag/simulation/dynamics/advance.py +199 -0
  48. nmag/simulation/dynamics/integrator.py +263 -0
  49. nmag/simulation/exchange/__init__.py +13 -0
  50. nmag/simulation/exchange/coefficients.py +185 -0
  51. nmag/simulation/exchange/fields.py +106 -0
  52. nmag/simulation/exchange/llg_rhs.py +218 -0
  53. nmag/simulation/fields/__init__.py +19 -0
  54. nmag/simulation/fields/arrays.py +111 -0
  55. nmag/simulation/fields/availability.py +188 -0
  56. nmag/simulation/fields/averages.py +293 -0
  57. nmag/simulation/fields/derived.py +164 -0
  58. nmag/simulation/fields/maxangle.py +163 -0
  59. nmag/simulation/fields/probes.py +106 -0
  60. nmag/simulation/implicit_dynamics.py +221 -0
  61. nmag/simulation/mesh/__init__.py +13 -0
  62. nmag/simulation/mesh/geometry.py +153 -0
  63. nmag/simulation/mesh/materials.py +299 -0
  64. nmag/simulation/mesh/probe.py +234 -0
  65. nmag/simulation/restart.py +103 -0
  66. nmag/simulation/support.py +224 -0
  67. nmag_python_3-0.0.2.dist-info/METADATA +157 -0
  68. nmag_python_3-0.0.2.dist-info/RECORD +147 -0
  69. nmag_python_3-0.0.2.dist-info/WHEEL +5 -0
  70. nmag_python_3-0.0.2.dist-info/licenses/LICENSE +339 -0
  71. nmag_python_3-0.0.2.dist-info/top_level.txt +8 -0
  72. nmesh/__init__.py +130 -0
  73. nmesh/backend.py +286 -0
  74. nmesh/geometry/__init__.py +52 -0
  75. nmesh/geometry/boolean_operations.py +157 -0
  76. nmesh/geometry/primitives.py +453 -0
  77. nmesh/geometry/transform.py +126 -0
  78. nmesh/io/__init__.py +50 -0
  79. nmesh/io/ascii.py +132 -0
  80. nmesh/io/legacy_nmesh_hdf5.py +318 -0
  81. nmesh/io/meshio_support.py +170 -0
  82. nmesh/mesh_generation.py +182 -0
  83. nmesh/mesh_io.py +227 -0
  84. nmesh/mesh_model.py +147 -0
  85. nmesh/mesh_utilities.py +79 -0
  86. nmesh/mesher/__init__.py +21 -0
  87. nmesh/mesher/driver.py +146 -0
  88. nmesh/mesher/meshing_defaults.py +252 -0
  89. nmesh/mesher/meshing_parameters.py +185 -0
  90. nmesh/mesher/parity.py +21 -0
  91. nmesh/mesher/parity_canonical.py +142 -0
  92. nmesh/mesher/parity_comparison.py +191 -0
  93. nmesh/mesher/parity_metrics.py +114 -0
  94. nmesh/mesher/periodic.py +97 -0
  95. nmesh/mesher/relaxation/__init__.py +14 -0
  96. nmesh/mesher/relaxation/_constants.py +20 -0
  97. nmesh/mesher/relaxation/_types.py +15 -0
  98. nmesh/mesher/relaxation/density.py +170 -0
  99. nmesh/mesher/relaxation/engine/__init__.py +18 -0
  100. nmesh/mesher/relaxation/engine/state.py +155 -0
  101. nmesh/mesher/relaxation/engine/steps.py +248 -0
  102. nmesh/mesher/relaxation/engine/topology.py +230 -0
  103. nmesh/mesher/relaxation/forces/__init__.py +96 -0
  104. nmesh/mesher/relaxation/forces/jit.py +102 -0
  105. nmesh/mesher/relaxation/forces/neighbors.py +186 -0
  106. nmesh/mesher/relaxation/forces/simplex.py +302 -0
  107. nmesh/mesher/relaxation/forces/summary.py +207 -0
  108. nmesh/mesher/relaxation/forces/types.py +92 -0
  109. nmesh/mesher/relaxation/geometry/__init__.py +6 -0
  110. nmesh/mesher/relaxation/geometry/builder.py +154 -0
  111. nmesh/mesher/relaxation/geometry/model.py +194 -0
  112. nmesh/mesher/relaxation/seeding/__init__.py +74 -0
  113. nmesh/mesher/relaxation/seeding/periodic.py +88 -0
  114. nmesh/mesher/relaxation/seeding/points.py +88 -0
  115. nmesh/mesher/relaxation/seeding/sampling.py +142 -0
  116. nmesh/mesher/relaxation/topology/__init__.py +297 -0
  117. nmesh/mesher/relaxation/topology/finalize.py +78 -0
  118. nmesh/mesher/relaxation/topology/recovery.py +310 -0
  119. nmesh/mesher/sectioned_config.py +70 -0
  120. nmesh/nmesh.py +99 -0
  121. nmesh/py.typed +1 -0
  122. nmesh/utils/__init__.py +33 -0
  123. nmesh/utils/array_list_utils.py +128 -0
  124. nmesh/utils/constants.py +22 -0
  125. nmesh/utils/timing_memory_utils.py +51 -0
  126. nmesh/utils/types.py +13 -0
  127. si/constants.py +49 -0
  128. si/physical.py +722 -0
  129. si/py.typed +1 -0
  130. simulation/__init__.py +1 -0
  131. simulation/clock.py +237 -0
  132. simulation/data_writer.py +273 -0
  133. simulation/data_writer_collection.py +267 -0
  134. simulation/hysteresis.py +74 -0
  135. simulation/hysteresis_runner.py +286 -0
  136. simulation/hysteresis_schedule.py +180 -0
  137. simulation/inference/__init__.py +3 -0
  138. simulation/inference/inference.py +95 -0
  139. simulation/py.typed +1 -0
  140. simulation/quantity.py +88 -0
  141. simulation/simulation_core.py +458 -0
  142. throttler/__init__.py +3 -0
  143. throttler/py.typed +1 -0
  144. throttler/throttler.py +55 -0
  145. when/__init__.py +3 -0
  146. when/py.typed +1 -0
  147. when/when.py +416 -0
@@ -0,0 +1,224 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+ from collections.abc import Callable, Iterable, Sequence
5
+ from functools import cache, lru_cache
6
+ from typing import Any, cast
7
+
8
+ import numpy as np
9
+
10
+ from si.physical import SI
11
+
12
+
13
+ @cache
14
+ def _si_unit(unit: str) -> SI:
15
+ return SI(1, unit)
16
+
17
+
18
+ @lru_cache(maxsize=1)
19
+ def _si_dimensionless() -> SI:
20
+ return SI(1)
21
+
22
+
23
+ Vector = Sequence[float]
24
+ VectorField = Callable[[Sequence[float]], Sequence[float]]
25
+ VectorFieldInput = Sequence[float] | np.ndarray | VectorField
26
+ ScalarField = Callable[[Sequence[float]], float | SI]
27
+ ScalarFieldInput = float | SI | Sequence[float] | np.ndarray | ScalarField
28
+ MU0 = 4.0 * np.pi * 1.0e-7
29
+ MU0_OVER_4PI = 1.0 / (4.0 * np.pi)
30
+ # Legacy Nmag's default simulation units make one magnetisation unit 1e6 A/m.
31
+ # Its exported dmdt field uses that global reference rather than a material's Ms.
32
+ LEGACY_DMDT_MAGNETISATION_SCALE = 1.0e6
33
+ # Legacy Nmag's fixed simulation base length is one nanometre. The demag
34
+ # solver's weak divergence is boxed with this base volume when exporting rho,
35
+ # independently of the unit_length supplied for a particular mesh.
36
+ LEGACY_RHO_BOXED_VOLUME_M3 = 1.0e-27
37
+ DERIVED_FIELD_NAMES = {
38
+ "M",
39
+ "H_total",
40
+ "H_anis",
41
+ "H_exch",
42
+ "dmdt",
43
+ "E_total",
44
+ "E_ext",
45
+ "E_anis",
46
+ "E_exch",
47
+ "E_demag",
48
+ "phi",
49
+ "rho",
50
+ "pin",
51
+ "dm_dcurrent",
52
+ }
53
+ _MESH_EDGE_SET_THRESHOLD = 4096
54
+ _NO_CONSTANT_AVERAGE = object()
55
+ _NO_COMPOSED_AVERAGE = object()
56
+
57
+
58
+ def _copy_average_value(value: object) -> object:
59
+ if isinstance(value, np.ndarray):
60
+ return cast(list[Any], value.tolist())
61
+ if isinstance(value, list):
62
+ return list(cast(list[Any], value))
63
+ return value
64
+
65
+
66
+ def _as_vector3(values: Sequence[Any], *, unit: SI | None = None) -> list[float]:
67
+ if len(values) != 3:
68
+ raise ValueError(f"Expected a 3-vector, got {len(values)} components.")
69
+
70
+ if unit is not None:
71
+ scale = unit.in_units_of(_si_unit("A/m"))
72
+ return [float(value) * scale for value in values]
73
+
74
+ result: list[float] = []
75
+ for value in values:
76
+ if isinstance(value, SI):
77
+ result.append(value.in_units_of(_si_unit("A/m")))
78
+ else:
79
+ result.append(float(value))
80
+ return result
81
+
82
+
83
+ def _normalise_m(values: Sequence[Any]) -> list[float]:
84
+ vector = np.asarray(values, dtype=float)
85
+ if vector.shape != (3,):
86
+ raise ValueError(f"Magnetisation must be a 3-vector, got shape {vector.shape}.")
87
+
88
+ norm = float(np.linalg.norm(vector))
89
+ if norm == 0.0:
90
+ raise ValueError("Magnetisation vectors must be non-zero.")
91
+
92
+ return cast(list[float], (vector / norm).tolist())
93
+
94
+
95
+ def _dimensionless_value(value: Any, *, fieldname: str) -> float:
96
+ result = value.in_units_of(_si_dimensionless()) if isinstance(value, SI) else float(value)
97
+ if not np.isfinite(result):
98
+ raise ValueError(f"{fieldname} values must be finite.")
99
+ return result
100
+
101
+
102
+ def _scalar_nodal_field(
103
+ values: ScalarFieldInput,
104
+ points: Sequence[Sequence[float]],
105
+ *,
106
+ fieldname: str,
107
+ ) -> np.ndarray:
108
+ point_count = len(points)
109
+ if callable(values):
110
+ return np.asarray(
111
+ [_dimensionless_value(values(point), fieldname=fieldname) for point in points],
112
+ dtype=float,
113
+ )
114
+ if isinstance(values, SI) or np.isscalar(values):
115
+ return np.full(
116
+ point_count,
117
+ _dimensionless_value(values, fieldname=fieldname),
118
+ dtype=float,
119
+ )
120
+
121
+ array = np.asarray(values, dtype=float)
122
+ if array.shape != (point_count,):
123
+ raise ValueError(
124
+ f"{fieldname} must be a scalar, callable, or one value per mesh point; "
125
+ f"expected shape ({point_count},), got {array.shape}."
126
+ )
127
+ if not np.all(np.isfinite(array)):
128
+ raise ValueError(f"{fieldname} values must be finite.")
129
+ return np.array(array, dtype=float, copy=True)
130
+
131
+
132
+ def _vector_in_units(
133
+ values: Sequence[Any],
134
+ *,
135
+ unit: SI | None,
136
+ expected_unit: SI,
137
+ fieldname: str,
138
+ ) -> np.ndarray:
139
+ if len(values) != 3:
140
+ raise ValueError(f"{fieldname} values must be 3-vectors, got {len(values)} components.")
141
+ if unit is not None:
142
+ vector = np.asarray(values, dtype=float) * unit.in_units_of(expected_unit)
143
+ else:
144
+ vector = np.asarray(
145
+ [
146
+ value.in_units_of(expected_unit) if isinstance(value, SI) else float(value)
147
+ for value in values
148
+ ],
149
+ dtype=float,
150
+ )
151
+ if not np.all(np.isfinite(vector)):
152
+ raise ValueError(f"{fieldname} values must be finite.")
153
+ return vector
154
+
155
+
156
+ def _vector_nodal_field(
157
+ values: VectorFieldInput,
158
+ points: Sequence[Sequence[float]],
159
+ *,
160
+ unit: SI | None,
161
+ expected_unit: SI,
162
+ fieldname: str,
163
+ ) -> np.ndarray:
164
+ if callable(values):
165
+ return np.asarray(
166
+ [
167
+ _vector_in_units(
168
+ values(point),
169
+ unit=unit,
170
+ expected_unit=expected_unit,
171
+ fieldname=fieldname,
172
+ )
173
+ for point in points
174
+ ],
175
+ dtype=float,
176
+ )
177
+
178
+ array = np.asarray(values, dtype=object if unit is None else float)
179
+ if array.shape == (3,):
180
+ vector = _vector_in_units(
181
+ cast(Sequence[Any], values),
182
+ unit=unit,
183
+ expected_unit=expected_unit,
184
+ fieldname=fieldname,
185
+ )
186
+ return np.tile(vector, (len(points), 1))
187
+ if array.shape != (len(points), 3):
188
+ raise ValueError(
189
+ f"{fieldname} must be a 3-vector, callable, or one vector per mesh point; "
190
+ f"expected shape ({len(points)}, 3), got {array.shape}."
191
+ )
192
+ return np.asarray(
193
+ [
194
+ _vector_in_units(
195
+ cast(Sequence[Any], row),
196
+ unit=unit,
197
+ expected_unit=expected_unit,
198
+ fieldname=fieldname,
199
+ )
200
+ for row in array
201
+ ],
202
+ dtype=float,
203
+ )
204
+
205
+
206
+ def _flatten_materials(region_materials: Iterable[tuple[str, Any]]) -> list[Any]:
207
+ materials: list[Any] = []
208
+ seen_names: set[str] = set()
209
+ for _, entry in region_materials:
210
+ region_mats: list[Any] = cast(list[Any], entry) if isinstance(entry, list) else [entry]
211
+ for material in region_mats:
212
+ if material.name not in seen_names:
213
+ seen_names.add(material.name)
214
+ materials.append(material)
215
+ return materials
216
+
217
+
218
+ def _simulation_compatibility_binding(
219
+ name: str, fallback: Callable[..., Any]
220
+ ) -> Callable[..., Any]:
221
+ """Use a legacy simulation-module override when tests or extensions provide one."""
222
+
223
+ simulation_module = sys.modules.get("nmag.simulation")
224
+ return getattr(simulation_module, name, fallback) if simulation_module is not None else fallback
@@ -0,0 +1,157 @@
1
+ Metadata-Version: 2.4
2
+ Name: nmag-python-3
3
+ Version: 0.0.2
4
+ Summary: Standalone Python 3 implementation of the Nmag micromagnetic simulation interface
5
+ Author-email: TriMagnetix <info@trimagnetix.com>
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: Operating System :: OS Independent
8
+ Requires-Python: >=3.10
9
+ Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: pint
12
+ Requires-Dist: numpy
13
+ Requires-Dist: scipy
14
+ Requires-Dist: numba
15
+ Requires-Dist: tabulate
16
+ Requires-Dist: meshio
17
+ Requires-Dist: h5py
18
+ Provides-Extra: test
19
+ Requires-Dist: pytest; extra == "test"
20
+ Requires-Dist: pytest-cov; extra == "test"
21
+ Requires-Dist: pytest-watch; extra == "test"
22
+ Provides-Extra: rust
23
+ Requires-Dist: maturin<2,>=1.14; extra == "rust"
24
+ Provides-Extra: docs
25
+ Requires-Dist: mkdocs==1.6.1; extra == "docs"
26
+ Requires-Dist: mkdocs-material==9.7.7; extra == "docs"
27
+ Requires-Dist: mkdocstrings==1.0.6; extra == "docs"
28
+ Requires-Dist: mkdocstrings-python==2.0.5; extra == "docs"
29
+ Provides-Extra: dev
30
+ Requires-Dist: maturin<2,>=1.14; extra == "dev"
31
+ Requires-Dist: h5py-stubs<0.2,>=0.1.2; extra == "dev"
32
+ Requires-Dist: pyright<2,>=1.1.400; extra == "dev"
33
+ Requires-Dist: pytest; extra == "dev"
34
+ Requires-Dist: pytest-cov; extra == "dev"
35
+ Requires-Dist: pytest-watch; extra == "dev"
36
+ Requires-Dist: ruff<1,>=0.12; extra == "dev"
37
+ Dynamic: license-file
38
+
39
+ # Nmag for Python 3
40
+
41
+ `nmag-python-3` is a standalone Python implementation of the Nmag finite-element
42
+ micromagnetic simulation interface. It supports tetrahedral meshes, magnetic
43
+ materials, static effective fields, adaptive LLG dynamics and relaxation,
44
+ NDT/HDF5 output, field probing, and native restart checkpoints.
45
+
46
+ The human documentation is available at
47
+ **<https://trimagnetix.github.io/nmag-python-3/>**. Start with the
48
+ [installation guide](https://trimagnetix.github.io/nmag-python-3/getting-started/installation/)
49
+ and [quickstart](https://trimagnetix.github.io/nmag-python-3/getting-started/quickstart/).
50
+
51
+ ## Requirements
52
+
53
+ - Linux
54
+ - Python 3.10 or newer
55
+ - A C compiler for Python dependencies without a platform wheel
56
+ - Rust and the matching Python development library only for optional native
57
+ acceleration
58
+
59
+ ## Installation
60
+
61
+ From a clone of this repository:
62
+
63
+ ```bash
64
+ ./scripts/setup.sh
65
+ ```
66
+
67
+ The setup script creates or reuses `.venv`, offers to build the optional Rust
68
+ accelerator, and runs the standard checks. Run a simulation with:
69
+
70
+ ```bash
71
+ .venv/bin/python {{simulation_file_name.py}}
72
+ ```
73
+
74
+ ## Minimal simulation
75
+
76
+ ```python
77
+ import nmag
78
+ import nmesh
79
+
80
+ mesh = nmesh.mesh_from_points_and_simplices(
81
+ points=[[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]],
82
+ simplices_indices=[[0, 1, 2, 3]],
83
+ simplices_regions=[1],
84
+ )
85
+ mesh.save("sample.nmesh.h5")
86
+
87
+ material = nmag.MagMaterial(
88
+ name="Py",
89
+ Ms=nmag.SI(1e6, "A/m"),
90
+ exchange_coupling=nmag.SI(13e-12, "J/m"),
91
+ )
92
+
93
+ simulation = nmag.Simulation(name="sample")
94
+ simulation.load_mesh(
95
+ "sample.nmesh.h5",
96
+ [("magnetic", material)],
97
+ unit_length=nmag.SI(1e-9, "m"),
98
+ )
99
+ simulation.set_m([1, 0, 0])
100
+ simulation.set_H_ext([0, 0, 0], nmag.SI("A/m"))
101
+ simulation.save_data(fields="all")
102
+ ```
103
+
104
+ For a tested, rerunnable version and a canonical sphere example, see the
105
+ [getting-started guide](https://trimagnetix.github.io/nmag-python-3/getting-started/quickstart/).
106
+
107
+ ## Status
108
+
109
+ The supported solver covers 3D tetrahedral demagnetization, exchange, uniform
110
+ applied fields, uniaxial and cubic anisotropy, custom polynomial anisotropy,
111
+ pinning, Zhang-Li current torque, adaptive dynamics and relaxation, checkpoints,
112
+ and resource-aware demagnetization storage.
113
+
114
+ Thermal dynamics, Slonczewski torque, periodic micromagnetic boundaries,
115
+ material-specific magnetization at incompatible shared nodes, local
116
+ inter-material coupling, and full legacy hysteresis compatibility are not yet
117
+ supported. Validate new geometries and material models before relying on
118
+ production results. The complete and current list is maintained in the
119
+ [supported-scope guide](https://trimagnetix.github.io/nmag-python-3/guides/supported-scope/).
120
+
121
+ ## Configuration and acceleration
122
+
123
+ Each simulation accepts an immutable `NmagConfig`. `accelerator="auto"` uses
124
+ installed Rust kernels where helpful, `"off"` keeps Python/Numba paths, and
125
+ `"rust"` requires the extension. Advanced callers can use
126
+ `accelerator_overrides={nmag.RustKernel.LLG: "rust"}`.
127
+
128
+ For a simulation created without an explicit configuration,
129
+ `NMAG_ACCELERATOR=auto|off|rust` selects the process default. Prefer
130
+ `NmagConfig` in reusable programs. See the
131
+ [configuration guide](https://trimagnetix.github.io/nmag-python-3/guides/configuration/)
132
+ for storage, memory, and integrator choices.
133
+
134
+ ## Development checks
135
+
136
+ ```bash
137
+ ./scripts/verify.sh
138
+ ./scripts/verify.sh --rust
139
+ ```
140
+
141
+ Build the documentation locally with:
142
+
143
+ ```bash
144
+ .venv/bin/python -m pip install -e '.[docs]'
145
+ .venv/bin/mkdocs build --strict
146
+ ```
147
+
148
+ ## Project lineage
149
+
150
+ This project modernizes the original
151
+ [nmag-project/nmag-src](https://github.com/nmag-project/nmag-src). The
152
+ [historical Nmag 0.2 manual](https://nmag.readthedocs.io/en/latest/) remains a
153
+ useful background reference, but its Python 2 runtime and some of its features
154
+ do not describe this rewrite.
155
+
156
+ Nmag for Python 3 is distributed under the GNU General Public License version 2
157
+ or, at your option, any later version. See [LICENSE](LICENSE).
@@ -0,0 +1,147 @@
1
+ anisotropy/__init__.py,sha256=r3Tb3JG3xwHHJxlIi4ARHRKMI_jxJxJHP-AZYi0apKg,663
2
+ anisotropy/anisotropy.py,sha256=5GiBbFXMdWwVkxLJVqCsDKMc8zY9mqxd3mYwliLHBgo,350
3
+ anisotropy/evaluation.py,sha256=ecAMk5ePzhui2vGum5zoy-DEjwMfiH2m-YVp2kpwDcI,2253
4
+ anisotropy/model.py,sha256=Ivn40QaLbxYPZcv_YjbKRpNlE1WOERsAYh2Y0NX2ql0,8499
5
+ anisotropy/predefined.py,sha256=79RqdJ99d6CscEeUzrEF3zNpkeYFVVaCZkdpj0RdfAM,7776
6
+ anisotropy/py.typed,sha256=GOJzfT--I5WXaP7ohUQllUQsQIgGVdJh2w-iL5dW-vM,46
7
+ anisotropy/values.py,sha256=Wkp9RvlTz3bAtVYIFDzgWJt_NgtQqtzQ8M7gfN-hAxI,3074
8
+ mag_material/__init__.py,sha256=_bZqAVD-qXHu0l4Ymg6D9kvOwYp498pb3G2hCUqiLvY,65
9
+ mag_material/mag_material.py,sha256=1kUJ2-53X5Vje1aqboPPCh7XVkL0vgnXOl_fmPti1Tc,8491
10
+ mag_material/parameters.py,sha256=NfyEYhtLbL5Q_Vsd_As0iaqKP4jCchtwQamUtcScjck,5495
11
+ mag_material/py.typed,sha256=GOJzfT--I5WXaP7ohUQllUQsQIgGVdJh2w-iL5dW-vM,46
12
+ nmag/__init__.py,sha256=Wn292AZkH_LfUTYP6TtIZVqljf7fzADQnKliWLL2ioU,935
13
+ nmag/backends.py,sha256=PlLthhwVRPME6QBhfDx5MeKhMhhocbnXDgpSxiUlf5c,17230
14
+ nmag/checkpoint.py,sha256=9X0-y8qlG8XR_LQNxXE28EJeCMsAWEv7ilvYZbeB2Ok,14018
15
+ nmag/config.py,sha256=qnAZBizQARNkzNIiceh74UNfcFJNszQkjUd_K-rk6aA,7405
16
+ nmag/output.py,sha256=4B7hpX6sYXkO3aBWADQWwvKd7_-s4J66W6fIvoFTfsY,972
17
+ nmag/parallel.py,sha256=gQlbE11ODt3X0Auv5OdPEFonkb7H5CEyITJbqrGmpv4,1614
18
+ nmag/py.typed,sha256=GOJzfT--I5WXaP7ohUQllUQsQIgGVdJh2w-iL5dW-vM,46
19
+ nmag/resources.py,sha256=mvfh7h0vWStyHN5jK1o6Lz6DWIh1znBCc456b9CRXlM,1284
20
+ nmag/demag/__init__.py,sha256=PoigX74IJT3jDEQ7DwEoclsC8awEZ69KtMqCS1-A328,1192
21
+ nmag/demag/bem_operator.py,sha256=MQEwMdZaty5FA0NtyvLeiFDhN9bFbsOf792Nz9ld73g,4934
22
+ nmag/demag/geometry.py,sha256=IyUKtTziDCc5kwrYWcjul1XS-kgv_zch-15AAkrycj8,4716
23
+ nmag/demag/lindholm.py,sha256=1G5o7QVuUoFJGX-n02j8o1mq9EKEtaIIQeIcAjyBVl4,4720
24
+ nmag/demag/lindholm_fast.py,sha256=qcpeQGJH61Bp4h663yGN6xdjwvK60KuHOlAomkreqSM,15456
25
+ nmag/demag/linear.py,sha256=Q79t74O7lFwsRmefUR76d8632VHXO18VfDkh7O26Rfg,16387
26
+ nmag/dynamics/__init__.py,sha256=oaJyBbA7_Thy2QkQkohX37AEPt4UBeiUoPjsnMcQQmw,10042
27
+ nmag/simulation/__init__.py,sha256=91ThDmvv4AP8UNdg3tVr3TUaN5ZQHfvK7jBnA6aKpTc,21130
28
+ nmag/simulation/implicit_dynamics.py,sha256=tNlDDSy3KRoZpBE-0_U-n77XpQZHTvxHF8tNI-9sqC8,8914
29
+ nmag/simulation/restart.py,sha256=b6tTd2HeMoEbjmlWWAgtq8rfbH0IYzeGyarvlLuHNd8,4079
30
+ nmag/simulation/support.py,sha256=PURw9d-kTjF93fzPE7hpvUPkM1525wC7uBMu1vYZDlM,6856
31
+ nmag/simulation/anisotropy/__init__.py,sha256=2m62U71AlffeQ1pB3mVk8goa7sywFIQ-YHXLF060rcw,148
32
+ nmag/simulation/anisotropy/fields.py,sha256=8x5mT_vP0C4rySGuuTEHZuIkVvIOMFmVimV7IlbXBRg,2248
33
+ nmag/simulation/anisotropy/materials.py,sha256=MCpBdlejAqUt5e9-9zUTALRou3016SFAi9b6Bjd5qGg,5509
34
+ nmag/simulation/demag/__init__.py,sha256=M43vg0nm_yeOrEunkM_kHeje_kdddynvnlplkUhcoaw,74
35
+ nmag/simulation/demag/solver.py,sha256=3oBnChUBIlXH9iHfxkY1y_3aASgSvafjtq-P8wiZsTM,529
36
+ nmag/simulation/demag/bem/__init__.py,sha256=RFTDdPDtzjPcmLjVf-seuZxVYOpLspp028_h8yv6emA,369
37
+ nmag/simulation/demag/bem/diagnostics.py,sha256=qwgbKVFt7Xurzf-Fhwgm8N2v0LSGhyc9uawvBX-K0hs,2352
38
+ nmag/simulation/demag/bem/dirichlet.py,sha256=AdWDGfzaPGnCZzJ_YiWqHtEAPyUdH3FnD2wWzJytJTs,3603
39
+ nmag/simulation/demag/bem/hierarchical.py,sha256=zKVuCw3Eg7-S-ZM0VPMfqQ2OPHUfUTV-ZOc_zi3qKr8,2921
40
+ nmag/simulation/demag/bem/operator.py,sha256=7QLzr1aRvA1YEZPnX7_nUtlLPtsAQJhYcO8iAjxCdv0,11897
41
+ nmag/simulation/demag/fem/__init__.py,sha256=fMjXvCQDzWw2RzRccfEI_bxS8ixCqyJCkQ7W6rnrBYQ,369
42
+ nmag/simulation/demag/fem/assembly.py,sha256=HixQNUlbz7xW3ESUCk0REraAQY7a6pNNAtV4huEEH4k,3672
43
+ nmag/simulation/demag/fem/charges.py,sha256=JzVTp0nAm27JmJlv29ushoNJ1Vt5gm7ht7LJ3wrueUE,1320
44
+ nmag/simulation/demag/fem/geometry.py,sha256=hOZy_VXm3M904I18ZQs2MWnL0mDeXkdlVAFJWMph5Bo,9928
45
+ nmag/simulation/demag/fields/__init__.py,sha256=ygENeCf4IEaw0dm-gsgIGCdgrpIttOoI8PGFk8IrAaw,376
46
+ nmag/simulation/demag/fields/auxiliary.py,sha256=z1STjxry6RCtI-CNJ2LQUQLwjtzVZWxgUXm_cox__kU,7589
47
+ nmag/simulation/demag/fields/probe.py,sha256=B61Y5Dm_DTTNUtnMiylEDlNx7P3svxAWO1PJZ9UWFq8,2938
48
+ nmag/simulation/demag/fields/recovery.py,sha256=ACA_l0Q9tVDI-9NyYLPvDcQiV-t7O8FVvVPCDha87C0,7919
49
+ nmag/simulation/dynamics/__init__.py,sha256=V4zvEz-1HLIFww9jBa_eOr4cpRO0vC8LtthqzKJyItg,3259
50
+ nmag/simulation/dynamics/advance.py,sha256=kNKGa-Sq39H0nBQoH1Qyv5E-HdEMKSd8HAUMQHhq_1g,7697
51
+ nmag/simulation/dynamics/integrator.py,sha256=T_9t7P7aXWD0GXhAefAuvJeFHQYHHbwvJJjwYdpdL94,10320
52
+ nmag/simulation/exchange/__init__.py,sha256=ONqkq_NrH8ZqJtnUiisgwXUtnzJL5_3GPUuQLNbacng,445
53
+ nmag/simulation/exchange/coefficients.py,sha256=EPDAYa3eZS6CjFwTnRL77V-Tct-apXXKQzn7h_2tQTk,7782
54
+ nmag/simulation/exchange/fields.py,sha256=7ocujbconk5N6Lk6ES51QJhpYGdNVIHzo_h3bxdVsj4,4044
55
+ nmag/simulation/exchange/llg_rhs.py,sha256=XMvnHhVuSXJqEuHg2ecEu89kjbhasWpeiMzF7TDxFOM,8378
56
+ nmag/simulation/fields/__init__.py,sha256=-wzKRQiRGvhutDuO3p8IWOhr2mWDq4L9qd-ycMKWmFQ,690
57
+ nmag/simulation/fields/arrays.py,sha256=Pa6LxMXA98hdCbP-pmbA5rkPWtmGeI0Sw4KsiBiXdME,4088
58
+ nmag/simulation/fields/availability.py,sha256=9AQTn2xcqAsXCnfLWTtI-4nEPksmvUO0n3Xn9Mz5o30,7194
59
+ nmag/simulation/fields/averages.py,sha256=AAvql_dS3uVXif4W9KMe7M527PFPGbwHk-e2eQSQOoo,11646
60
+ nmag/simulation/fields/derived.py,sha256=gYwuneeH_9wj1KTwwYdMbjcIbGwDGMRrQYBtmdrq7zo,6030
61
+ nmag/simulation/fields/maxangle.py,sha256=xd_z6E8kO8RIpIZBNuhwN756DJD0fInVgEKm3Wc2r6Y,6380
62
+ nmag/simulation/fields/probes.py,sha256=R9aChj4eld87fp11WOT2F0xnoSLitY7OFUJSe3fagvc,3790
63
+ nmag/simulation/mesh/__init__.py,sha256=ajrIpZq0zs_OECVz6N1qTLCJaGwDGaPN00mS7-rXMhU,417
64
+ nmag/simulation/mesh/geometry.py,sha256=dHYNdjOsP6enQ4HF5bdECur58iDl4JZOwI8qvo4BT2A,6563
65
+ nmag/simulation/mesh/materials.py,sha256=U6cDHoXTZmIqU_uzSqnD4dgvIvd4_0JmjLWGyGNDI6g,11822
66
+ nmag/simulation/mesh/probe.py,sha256=B-g64S0R5YAoJVhRfkFvmtOKWWxutTDWUYaAtN9N7Tk,8682
67
+ nmag_python_3-0.0.2.dist-info/licenses/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
68
+ nmesh/__init__.py,sha256=mEr5yQFBJ9Mfsj3s2T3WlqgLxcLWXYMh2eGRjNVoda8,2573
69
+ nmesh/backend.py,sha256=ads5vOPf9u7il2tgeJMmTfIy1pyWQZ05BFMCy3IqA3o,10760
70
+ nmesh/mesh_generation.py,sha256=_sv3zqhvYNxRsC4tiDMnS5_bYHVkfhA9jpJJDCEDowk,6660
71
+ nmesh/mesh_io.py,sha256=6oVDgGm26AdCw_sYAi7Xv3eHqwNISH2h-75awfQAhHc,7423
72
+ nmesh/mesh_model.py,sha256=T99hZLKE5CZiWuMHUX3f_dvdoDw8yzZwaHJoGXL1LaY,5017
73
+ nmesh/mesh_utilities.py,sha256=CmvQx4kV41kQT91I4KtMcmiTKUYwtRXyNnWwZ-TMjjE,2362
74
+ nmesh/nmesh.py,sha256=l0H6cEIs3oQKWr0YOqIrLncloa4OKbSZfoQYjsUtclA,2160
75
+ nmesh/py.typed,sha256=GOJzfT--I5WXaP7ohUQllUQsQIgGVdJh2w-iL5dW-vM,46
76
+ nmesh/geometry/__init__.py,sha256=yD0zDhtyv73NBYwWCXcbRR6yELzOxMayJzYJBkOYvpk,1060
77
+ nmesh/geometry/boolean_operations.py,sha256=oVeFg-agCBFQYpMlFDoOdQ2yLMg3YIHUqHoJsSawNLU,5126
78
+ nmesh/geometry/primitives.py,sha256=3jCy8kpHYeEvJv0pd5gC91J1Z7zV_nRrGYCjVb31URI,16706
79
+ nmesh/geometry/transform.py,sha256=d_Hb8NCOT1Rbr2oTQcGTf_EZgbxnBAiIWEaP64GvN04,4499
80
+ nmesh/io/__init__.py,sha256=EfvOieElK7ykZAHRUpyF8AN3-4K-VDnSyZV0jl8eiDE,1417
81
+ nmesh/io/ascii.py,sha256=2DdaCLWXxgb84ggegiW68d_H04WoDsfD5n6HXhCwtUs,4197
82
+ nmesh/io/legacy_nmesh_hdf5.py,sha256=orVKKQCMyfooE8AUE4eD52WkShTQFbFJpZQVn3l_Zx4,11347
83
+ nmesh/io/meshio_support.py,sha256=sVWvG067vlYVFPfcT-TH_Pt-jE7lAg1nGSqEJa9ebbk,5353
84
+ nmesh/mesher/__init__.py,sha256=TbGKSC7wTdBbl_lA8RGJa0Xo_d7rPOjD6v36GLkrCsA,416
85
+ nmesh/mesher/driver.py,sha256=0L9JCgy9XY45tcFebqc9c4CK-BwA2EHpq40VdVuwvIs,5079
86
+ nmesh/mesher/meshing_defaults.py,sha256=q6qYhGDm3d_e3Oyy9Vnh6DXfCp6wa5F8RfeUjupC45I,8615
87
+ nmesh/mesher/meshing_parameters.py,sha256=dVT8i4XVPRzUOAWCQfQBNFBvRtLUzO9qhTosY_BUw0s,6536
88
+ nmesh/mesher/parity.py,sha256=6Nmq9XVq1UZ7Q7GwaQ1IkzHCSDfr_OnRh2S5ausmBS4,604
89
+ nmesh/mesher/parity_canonical.py,sha256=btYkn6lPdjAwkfO2DqEUe6IqDE5lEXTN2lVEKMM9K_U,4824
90
+ nmesh/mesher/parity_comparison.py,sha256=hgKaQKfwQCcxM7jtiYOxu1UNfy3mE5EmS93xQuCcYUE,5710
91
+ nmesh/mesher/parity_metrics.py,sha256=3MlmA7UOaFgzx1RrNg7M-ZVQMrTRLvuNMpmaOgSkv4k,3739
92
+ nmesh/mesher/periodic.py,sha256=DB5bi5k6kL9ffkGJZBaeLJF-2WQRn-8xs1V7udSl5eU,2811
93
+ nmesh/mesher/sectioned_config.py,sha256=3FU1ERYAV8tkaM4LAOrPHDPTzhk3bSADveQFq0W1VQI,2268
94
+ nmesh/mesher/relaxation/__init__.py,sha256=5KldaMJer5v5uWvhVeIkzhP33ke-ML88iwLbnqKvfiE,438
95
+ nmesh/mesher/relaxation/_constants.py,sha256=tt4Gy3NiMDii40SpgC-v7RfPKGwxAF82EJ3Q733yevQ,389
96
+ nmesh/mesher/relaxation/_types.py,sha256=LtuqBAJ325o0zpyEeoRFEAvzMLKzvUBTCS-UwjTItBs,490
97
+ nmesh/mesher/relaxation/density.py,sha256=6zL-MiKKyUy5McO6nlvHqC5DbawOTccmgBqgzYtZfaI,5572
98
+ nmesh/mesher/relaxation/engine/__init__.py,sha256=ST0GmA5so8yiNzKJMiLewV6UcfYaWHth-0BjMbfz02U,517
99
+ nmesh/mesher/relaxation/engine/state.py,sha256=GJirfosbHqWfWm0bQ8Gc1X-0YdWnZQqAZxpF7kbIYH0,5447
100
+ nmesh/mesher/relaxation/engine/steps.py,sha256=TLmrKj0iOPKPMPH1l7N1YIjNJV9BEfLrh-YuWgtg_7o,8940
101
+ nmesh/mesher/relaxation/engine/topology.py,sha256=J54WRL5BvV437j1hwYRmSfWBYkAfXlocvXayRanNrG8,9594
102
+ nmesh/mesher/relaxation/forces/__init__.py,sha256=lctj-PTxx-Oz4asxw-Fo4pCDVEld9Ena4Z1QiP2Nr_k,2494
103
+ nmesh/mesher/relaxation/forces/jit.py,sha256=gPu93S0jjpeirkHUUTXUrJrpTCSAYOjD0g4dkQhrN9U,3577
104
+ nmesh/mesher/relaxation/forces/neighbors.py,sha256=HlkjcxWu8ons7QrOY309heSQVTFK7vuQJak0JOISndk,6353
105
+ nmesh/mesher/relaxation/forces/simplex.py,sha256=3Z9a14Axcdo542ACcooraNRjN3P-XcBLdJfPYYylDXs,10708
106
+ nmesh/mesher/relaxation/forces/summary.py,sha256=YxGphI3i8cGDulmxdF8ybX9jfvVjsWwOj3c7_iEv7fQ,6775
107
+ nmesh/mesher/relaxation/forces/types.py,sha256=p-mF9-WBmYz2uzuF3gDl_LhJehQrCIvKLD7tAOCguSg,3177
108
+ nmesh/mesher/relaxation/geometry/__init__.py,sha256=A0dbdZZxhmMn2xUsBLzfkY5qcQUDP-HGRJuHeFp1dMo,193
109
+ nmesh/mesher/relaxation/geometry/builder.py,sha256=AWJuj1QPyAyWf4Jpz1ti58k4b1UyNk-whAZ7K37YWQE,5704
110
+ nmesh/mesher/relaxation/geometry/model.py,sha256=-FmSkbx0creT5KNc-T7tt9rjCC1lMFJSbPB-ooBN9kQ,7959
111
+ nmesh/mesher/relaxation/seeding/__init__.py,sha256=M3bTsnNmezXdgjlPSjY8FMOM1wtrLWfN8WZ6mL0I2xw,2838
112
+ nmesh/mesher/relaxation/seeding/periodic.py,sha256=dTtZ1rkDZB45zv55iKqOg1NCW-IQp-sd-xdDO436uhE,3032
113
+ nmesh/mesher/relaxation/seeding/points.py,sha256=fJEcYySn4aDUM-AVyWV7M9Kg_XIUJ-9gRG0dzZwSCws,3206
114
+ nmesh/mesher/relaxation/seeding/sampling.py,sha256=Dzf_nmZFppluzbwSgQjypfIp0ejLVkcS1F3ijmcYOl8,5116
115
+ nmesh/mesher/relaxation/topology/__init__.py,sha256=oSInLcg5v6Q6hIm-oS1sOOubsxm0c4h-Uxbs9Yp82NA,10713
116
+ nmesh/mesher/relaxation/topology/finalize.py,sha256=PsTxumFdQ3IE_ZfyvBMpZIf4kaAX6QTfCqoF6Tk-XCM,3016
117
+ nmesh/mesher/relaxation/topology/recovery.py,sha256=wFp5wdCdGhw2xWPRLd0QQwHWstBEHB0yXjmhyh_n8Vg,10480
118
+ nmesh/utils/__init__.py,sha256=BzoGj3p-MD3dsvmEyR7cyUQYcUVYdiHKbUtgkH5Qz0k,761
119
+ nmesh/utils/array_list_utils.py,sha256=9afxJFETC30UvEl4vtFqWR39qa1yLRGiGIJZO46qm5A,3207
120
+ nmesh/utils/constants.py,sha256=6PKqWKU-E6i63u4eSMnVKmK5Px2_5yOGunbC5EQy4V4,653
121
+ nmesh/utils/timing_memory_utils.py,sha256=7u4ppspfUJWQ9mTTWCZOwNUMM2upB6_n2QS_j2fBQgw,1500
122
+ nmesh/utils/types.py,sha256=XsCW6B-x6N3Hl6twAgc-i8-NCMNUDQdftmU-q9jIafM,365
123
+ si/constants.py,sha256=TLba7vLDXZ1SNdwzwF38Ya5o2b4JWtol70LDrDM6s9g,1540
124
+ si/physical.py,sha256=P9ASoJA1uBPNTCtY75AXJxsPME6p5hhfVVS8jNhBe2s,26430
125
+ si/py.typed,sha256=GOJzfT--I5WXaP7ohUQllUQsQIgGVdJh2w-iL5dW-vM,46
126
+ simulation/__init__.py,sha256=tuyZH4HRgnKZIN_ECKcfv3nJFvTfAUyTL4_My9DNgvE,64
127
+ simulation/clock.py,sha256=758F1XtpN_SJbQs2PBy1GB4vXbObNe7OKsOOLlrzqjs,9261
128
+ simulation/data_writer.py,sha256=kENmfUz6RjsWPcMmb1EwU7IBn85V5N83KRFWmbbaMNY,10789
129
+ simulation/data_writer_collection.py,sha256=CloSqh0ssnBNVlkK2QCADE1vJHg-eFlZRCJdki7KIwI,8651
130
+ simulation/hysteresis.py,sha256=bxrKJ_Oz6a4pEi1QROLKe3GUy0qhm1XpTSXDydYPu8s,1918
131
+ simulation/hysteresis_runner.py,sha256=GcGgCs3Ez8wzNRVMLExMai-aXsVus6MiEOI5HmMJPWI,9571
132
+ simulation/hysteresis_schedule.py,sha256=0-YWebauvkf9KAN2jFk-zTRiT5vsRj8YgN_lmyabaa4,6277
133
+ simulation/py.typed,sha256=GOJzfT--I5WXaP7ohUQllUQsQIgGVdJh2w-iL5dW-vM,46
134
+ simulation/quantity.py,sha256=DTni24AYlcslnEsQuTJ_ztpTSx2As556UASFgfFeLi8,3450
135
+ simulation/simulation_core.py,sha256=ZiOi_KWK7ukfpKP0yHpZOusatNNGuOireOuSMNnmqrk,15556
136
+ simulation/inference/__init__.py,sha256=46Y9si-M2z4OJVZM5S3vBU7hjr3lAuC4KFAI2dDqjJw,106
137
+ simulation/inference/inference.py,sha256=krpQTIiHfNOuTB76OFuo_gOGrvMLe-HuxOm1LkR3L48,3325
138
+ throttler/__init__.py,sha256=XbUN-2RTJq4qc6goEc24iEWSOGhRWnUEN0LtBInp_6w,58
139
+ throttler/py.typed,sha256=GOJzfT--I5WXaP7ohUQllUQsQIgGVdJh2w-iL5dW-vM,46
140
+ throttler/throttler.py,sha256=d3WfvydFVYwe14sMq2QSJNct5nrIw83I_0-AHT3jD8U,1921
141
+ when/__init__.py,sha256=ipmS4ydLkbH0SvaWanfpcfr808iioyCSthL2ac2YabA,129
142
+ when/py.typed,sha256=GOJzfT--I5WXaP7ohUQllUQsQIgGVdJh2w-iL5dW-vM,46
143
+ when/when.py,sha256=caOzizbppDryE9IdKKZo_x_CHhz0LHakiJiDSE0fsjU,12214
144
+ nmag_python_3-0.0.2.dist-info/METADATA,sha256=sqP-4G7Y8BjlTJVgsTA3g5QUTvg_KP-N1wHaXTlfTxs,5301
145
+ nmag_python_3-0.0.2.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
146
+ nmag_python_3-0.0.2.dist-info/top_level.txt,sha256=0rAfvr3Y2amdt2wtdGMXFKvCEcEPmMSaiKVjNa_sxWM,64
147
+ nmag_python_3-0.0.2.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+