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.
- anisotropy/__init__.py +28 -0
- anisotropy/anisotropy.py +13 -0
- anisotropy/evaluation.py +70 -0
- anisotropy/model.py +200 -0
- anisotropy/predefined.py +202 -0
- anisotropy/py.typed +1 -0
- anisotropy/values.py +84 -0
- mag_material/__init__.py +3 -0
- mag_material/mag_material.py +231 -0
- mag_material/parameters.py +150 -0
- mag_material/py.typed +1 -0
- nmag/__init__.py +36 -0
- nmag/backends.py +493 -0
- nmag/checkpoint.py +327 -0
- nmag/config.py +174 -0
- nmag/demag/__init__.py +39 -0
- nmag/demag/bem_operator.py +149 -0
- nmag/demag/geometry.py +134 -0
- nmag/demag/lindholm.py +133 -0
- nmag/demag/lindholm_fast.py +463 -0
- nmag/demag/linear.py +489 -0
- nmag/dynamics/__init__.py +255 -0
- nmag/output.py +27 -0
- nmag/parallel.py +45 -0
- nmag/py.typed +1 -0
- nmag/resources.py +38 -0
- nmag/simulation/__init__.py +519 -0
- nmag/simulation/anisotropy/__init__.py +5 -0
- nmag/simulation/anisotropy/fields.py +56 -0
- nmag/simulation/anisotropy/materials.py +138 -0
- nmag/simulation/demag/__init__.py +1 -0
- nmag/simulation/demag/bem/__init__.py +11 -0
- nmag/simulation/demag/bem/diagnostics.py +73 -0
- nmag/simulation/demag/bem/dirichlet.py +85 -0
- nmag/simulation/demag/bem/hierarchical.py +74 -0
- nmag/simulation/demag/bem/operator.py +292 -0
- nmag/simulation/demag/fem/__init__.py +11 -0
- nmag/simulation/demag/fem/assembly.py +114 -0
- nmag/simulation/demag/fem/charges.py +38 -0
- nmag/simulation/demag/fem/geometry.py +261 -0
- nmag/simulation/demag/fields/__init__.py +11 -0
- nmag/simulation/demag/fields/auxiliary.py +186 -0
- nmag/simulation/demag/fields/probe.py +77 -0
- nmag/simulation/demag/fields/recovery.py +207 -0
- nmag/simulation/demag/solver.py +17 -0
- nmag/simulation/dynamics/__init__.py +92 -0
- nmag/simulation/dynamics/advance.py +199 -0
- nmag/simulation/dynamics/integrator.py +263 -0
- nmag/simulation/exchange/__init__.py +13 -0
- nmag/simulation/exchange/coefficients.py +185 -0
- nmag/simulation/exchange/fields.py +106 -0
- nmag/simulation/exchange/llg_rhs.py +218 -0
- nmag/simulation/fields/__init__.py +19 -0
- nmag/simulation/fields/arrays.py +111 -0
- nmag/simulation/fields/availability.py +188 -0
- nmag/simulation/fields/averages.py +293 -0
- nmag/simulation/fields/derived.py +164 -0
- nmag/simulation/fields/maxangle.py +163 -0
- nmag/simulation/fields/probes.py +106 -0
- nmag/simulation/implicit_dynamics.py +221 -0
- nmag/simulation/mesh/__init__.py +13 -0
- nmag/simulation/mesh/geometry.py +153 -0
- nmag/simulation/mesh/materials.py +299 -0
- nmag/simulation/mesh/probe.py +234 -0
- nmag/simulation/restart.py +103 -0
- nmag/simulation/support.py +224 -0
- nmag_python_3-0.0.2.dist-info/METADATA +157 -0
- nmag_python_3-0.0.2.dist-info/RECORD +147 -0
- nmag_python_3-0.0.2.dist-info/WHEEL +5 -0
- nmag_python_3-0.0.2.dist-info/licenses/LICENSE +339 -0
- nmag_python_3-0.0.2.dist-info/top_level.txt +8 -0
- nmesh/__init__.py +130 -0
- nmesh/backend.py +286 -0
- nmesh/geometry/__init__.py +52 -0
- nmesh/geometry/boolean_operations.py +157 -0
- nmesh/geometry/primitives.py +453 -0
- nmesh/geometry/transform.py +126 -0
- nmesh/io/__init__.py +50 -0
- nmesh/io/ascii.py +132 -0
- nmesh/io/legacy_nmesh_hdf5.py +318 -0
- nmesh/io/meshio_support.py +170 -0
- nmesh/mesh_generation.py +182 -0
- nmesh/mesh_io.py +227 -0
- nmesh/mesh_model.py +147 -0
- nmesh/mesh_utilities.py +79 -0
- nmesh/mesher/__init__.py +21 -0
- nmesh/mesher/driver.py +146 -0
- nmesh/mesher/meshing_defaults.py +252 -0
- nmesh/mesher/meshing_parameters.py +185 -0
- nmesh/mesher/parity.py +21 -0
- nmesh/mesher/parity_canonical.py +142 -0
- nmesh/mesher/parity_comparison.py +191 -0
- nmesh/mesher/parity_metrics.py +114 -0
- nmesh/mesher/periodic.py +97 -0
- nmesh/mesher/relaxation/__init__.py +14 -0
- nmesh/mesher/relaxation/_constants.py +20 -0
- nmesh/mesher/relaxation/_types.py +15 -0
- nmesh/mesher/relaxation/density.py +170 -0
- nmesh/mesher/relaxation/engine/__init__.py +18 -0
- nmesh/mesher/relaxation/engine/state.py +155 -0
- nmesh/mesher/relaxation/engine/steps.py +248 -0
- nmesh/mesher/relaxation/engine/topology.py +230 -0
- nmesh/mesher/relaxation/forces/__init__.py +96 -0
- nmesh/mesher/relaxation/forces/jit.py +102 -0
- nmesh/mesher/relaxation/forces/neighbors.py +186 -0
- nmesh/mesher/relaxation/forces/simplex.py +302 -0
- nmesh/mesher/relaxation/forces/summary.py +207 -0
- nmesh/mesher/relaxation/forces/types.py +92 -0
- nmesh/mesher/relaxation/geometry/__init__.py +6 -0
- nmesh/mesher/relaxation/geometry/builder.py +154 -0
- nmesh/mesher/relaxation/geometry/model.py +194 -0
- nmesh/mesher/relaxation/seeding/__init__.py +74 -0
- nmesh/mesher/relaxation/seeding/periodic.py +88 -0
- nmesh/mesher/relaxation/seeding/points.py +88 -0
- nmesh/mesher/relaxation/seeding/sampling.py +142 -0
- nmesh/mesher/relaxation/topology/__init__.py +297 -0
- nmesh/mesher/relaxation/topology/finalize.py +78 -0
- nmesh/mesher/relaxation/topology/recovery.py +310 -0
- nmesh/mesher/sectioned_config.py +70 -0
- nmesh/nmesh.py +99 -0
- nmesh/py.typed +1 -0
- nmesh/utils/__init__.py +33 -0
- nmesh/utils/array_list_utils.py +128 -0
- nmesh/utils/constants.py +22 -0
- nmesh/utils/timing_memory_utils.py +51 -0
- nmesh/utils/types.py +13 -0
- si/constants.py +49 -0
- si/physical.py +722 -0
- si/py.typed +1 -0
- simulation/__init__.py +1 -0
- simulation/clock.py +237 -0
- simulation/data_writer.py +273 -0
- simulation/data_writer_collection.py +267 -0
- simulation/hysteresis.py +74 -0
- simulation/hysteresis_runner.py +286 -0
- simulation/hysteresis_schedule.py +180 -0
- simulation/inference/__init__.py +3 -0
- simulation/inference/inference.py +95 -0
- simulation/py.typed +1 -0
- simulation/quantity.py +88 -0
- simulation/simulation_core.py +458 -0
- throttler/__init__.py +3 -0
- throttler/py.typed +1 -0
- throttler/throttler.py +55 -0
- when/__init__.py +3 -0
- when/py.typed +1 -0
- 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,,
|