PyOpenMagnetics 1.7.30__tar.gz → 1.7.31__tar.gz

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 (95) hide show
  1. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/PKG-INFO +1 -1
  2. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/pyproject.toml +1 -1
  3. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/core.cpp +33 -0
  4. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/core.h +1 -0
  5. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_core.py +20 -0
  6. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/.github/workflows/ci.yml +0 -0
  7. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/.github/workflows/publish.yml +0 -0
  8. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/.gitignore +0 -0
  9. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/AGENTS.md +0 -0
  10. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/CMakeLists.txt +0 -0
  11. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/LICENSE +0 -0
  12. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/PyOpenMagnetics.pyi +0 -0
  13. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/README.md +0 -0
  14. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/_packaging/__init__.py +0 -0
  15. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/_packaging/_build_info.py.in +0 -0
  16. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/api/MAS.py +0 -0
  17. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/api/mas_db_reader.py +0 -0
  18. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/api/validation.py +0 -0
  19. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/clear_cibuildwheel_cache.sh +0 -0
  20. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/docs/compatibility.md +0 -0
  21. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/docs/errors.md +0 -0
  22. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/docs/performance.md +0 -0
  23. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/README.md +0 -0
  24. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/buck_inductor.py +0 -0
  25. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/complete_simulation_example.py +0 -0
  26. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/converter_design_example.py +0 -0
  27. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/debug_bobbin.py +0 -0
  28. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/debug_coil.py +0 -0
  29. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/debug_core.py +0 -0
  30. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/debug_plotting.py +0 -0
  31. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/flyback_220v_12v_1a.py +0 -0
  32. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/flyback_220v_12v_2a_complete.py +0 -0
  33. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/flyback_bh_curve.png +0 -0
  34. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/flyback_core.png +0 -0
  35. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/flyback_design.py +0 -0
  36. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/flyback_summary.png +0 -0
  37. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/flyback_waveforms.png +0 -0
  38. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/list_plot_funcs.py +0 -0
  39. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/plot_flyback_design.py +0 -0
  40. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/plot_flyback_pyom.py +0 -0
  41. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/test_field_calc.py +0 -0
  42. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/examples/test_field_plot.py +0 -0
  43. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/force_fresh_build.sh +0 -0
  44. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/llms.txt +0 -0
  45. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/notebooks/01_getting_started.ipynb +0 -0
  46. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/notebooks/02_buck_inductor.ipynb +0 -0
  47. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/notebooks/03_core_losses.ipynb +0 -0
  48. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/notebooks/README.md +0 -0
  49. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/requirements.txt +0 -0
  50. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/advisers.cpp +0 -0
  51. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/advisers.h +0 -0
  52. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/bobbin.cpp +0 -0
  53. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/bobbin.h +0 -0
  54. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/cmc.cpp +0 -0
  55. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/cmc.h +0 -0
  56. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/common.h +0 -0
  57. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/converter.cpp +0 -0
  58. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/converter.h +0 -0
  59. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/crossref.cpp +0 -0
  60. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/crossref.h +0 -0
  61. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/database.cpp +0 -0
  62. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/database.h +0 -0
  63. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/logging.cpp +0 -0
  64. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/logging.h +0 -0
  65. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/losses.cpp +0 -0
  66. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/losses.h +0 -0
  67. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/module.cpp +0 -0
  68. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/plotting.cpp +0 -0
  69. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/plotting.h +0 -0
  70. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/settings.cpp +0 -0
  71. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/settings.h +0 -0
  72. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/simulation.cpp +0 -0
  73. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/simulation.h +0 -0
  74. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/utils.cpp +0 -0
  75. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/utils.h +0 -0
  76. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/winding.cpp +0 -0
  77. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/winding.h +0 -0
  78. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/wire.cpp +0 -0
  79. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/src/wire.h +0 -0
  80. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/test.py +0 -0
  81. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/__init__.py +0 -0
  82. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/conftest.py +0 -0
  83. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_converter_endpoints.py +0 -0
  84. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_core_adviser.py +0 -0
  85. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_datasheet_only_catalogue.py +0 -0
  86. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_examples_integration.py +0 -0
  87. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_inputs.py +0 -0
  88. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_logging.py +0 -0
  89. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_losses_not_evaluable_catalogue.py +0 -0
  90. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_magnetic_adviser.py +0 -0
  91. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_magnetics_catalogue_load.py +0 -0
  92. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_mas_schema_walk.py +0 -0
  93. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_material_validator.py +0 -0
  94. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_plotting.py +0 -0
  95. {pyopenmagnetics-1.7.30 → pyopenmagnetics-1.7.31}/tests/test_winding.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: PyOpenMagnetics
3
- Version: 1.7.30
3
+ Version: 1.7.31
4
4
  Summary: Python wrapper for OpenMagnetics
5
5
  Author-Email: Alfonso Martinez <Alfonso_VII@hotmail.com>
6
6
  Classifier: Development Status :: 4 - Beta
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "PyOpenMagnetics"
7
- version = "1.7.30"
7
+ version = "1.7.31"
8
8
  requires-python = ">=3.8"
9
9
  authors = [
10
10
  { name="Alfonso Martinez", email="Alfonso_VII@hotmail.com" },
@@ -567,6 +567,21 @@ json calculate_complex_permeability(json materialJson, double frequency) {
567
567
  return result;
568
568
  }
569
569
 
570
+ json calculate_complex_permeability_frequency_range(json material) {
571
+ OpenMagnetics::ComplexPermeability complexPermeabilityObj;
572
+ std::pair<double, double> range;
573
+ if (material.is_string()) {
574
+ range = complexPermeabilityObj.get_frequency_range(material.get<std::string>());
575
+ }
576
+ else {
577
+ range = complexPermeabilityObj.get_frequency_range(CoreMaterial(material));
578
+ }
579
+ json result;
580
+ result["minimum"] = range.first;
581
+ result["maximum"] = range.second;
582
+ return result;
583
+ }
584
+
570
585
  void register_core_bindings(py::module& m) {
571
586
  // Core materials
572
587
  m.def("get_core_materials", &get_core_materials,
@@ -1344,6 +1359,24 @@ void register_core_bindings(py::module& m) {
1344
1359
  )pbdoc",
1345
1360
  py::arg("material_json"), py::arg("frequency"),
1346
1361
  py::call_guard<py::gil_scoped_release>());
1362
+
1363
+ m.def("calculate_complex_permeability_frequency_range", &calculate_complex_permeability_frequency_range,
1364
+ R"pbdoc(
1365
+ Frequency span in which a core material's complex permeability is defined.
1366
+
1367
+ calculate_complex_permeability (and every impedance sweep that uses it)
1368
+ throws outside this span: it is the span covered by both the material's
1369
+ tabulated mu'(f) and mu''(f), or by the table MKF derives from its
1370
+ frequency-dependent initial permeability.
1371
+
1372
+ Args:
1373
+ material: JSON CoreMaterial object, or the material name.
1374
+
1375
+ Returns:
1376
+ JSON object {"minimum": Hz, "maximum": Hz}.
1377
+ )pbdoc",
1378
+ py::arg("material"),
1379
+ py::call_guard<py::gil_scoped_release>());
1347
1380
  }
1348
1381
 
1349
1382
  } // namespace PyMKF
@@ -59,6 +59,7 @@ std::vector<std::string> get_available_core_filters();
59
59
  std::vector<double> get_maximum_dimensions(json magneticJson);
60
60
  json calculate_core_data_from_shape(json shapeJson);
61
61
  json calculate_complex_permeability(json materialJson, double frequency);
62
+ json calculate_complex_permeability_frequency_range(json material);
62
63
 
63
64
  void register_core_bindings(py::module& m);
64
65
 
@@ -312,3 +312,23 @@ class TestCoreProcessedDescription:
312
312
  if "windingWindows" in processed:
313
313
  assert isinstance(processed["windingWindows"], list)
314
314
  assert len(processed["windingWindows"]) > 0
315
+
316
+
317
+ class TestComplexPermeabilityFrequencyRange:
318
+ """calculate_complex_permeability throws outside the material's tabulated span; the span is exposed so
319
+ callers (impedance sweeps) can stay inside it instead of catching the throw."""
320
+
321
+ def test_a07_span_ends_at_the_top_of_its_tabulated_mu_imaginary(self):
322
+ span = PyOpenMagnetics.calculate_complex_permeability_frequency_range("A07")
323
+ assert 0 < span["minimum"] < span["maximum"]
324
+ # A07's tabulated mu''(f) ends at ~17 MHz (mu' extended to it by Kramers-Kronig in MAS).
325
+ assert 1e7 < span["maximum"] < 1e8
326
+
327
+ def test_inside_the_span_answers_and_outside_it_throws(self):
328
+ material = PyOpenMagnetics.find_core_material_by_name("A07")
329
+ span = PyOpenMagnetics.calculate_complex_permeability_frequency_range(material)
330
+ assert span == PyOpenMagnetics.calculate_complex_permeability_frequency_range("A07")
331
+ inside = PyOpenMagnetics.calculate_complex_permeability(material, span["maximum"] * 0.99)
332
+ assert inside["imaginary"] > 0
333
+ with pytest.raises(Exception):
334
+ PyOpenMagnetics.calculate_complex_permeability(material, span["maximum"] * 1.01)