radia 1.3.14__tar.gz → 1.3.15__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 (236) hide show
  1. {radia-1.3.14/src/radia.egg-info → radia-1.3.15}/PKG-INFO +3 -1
  2. radia-1.3.15/docs/API_REFERENCE.md +579 -0
  3. radia-1.3.15/docs/README.md +20 -0
  4. {radia-1.3.14 → radia-1.3.15}/examples/README.md +9 -5
  5. {radia-1.3.14 → radia-1.3.15}/examples/background_fields/README.md +2 -2
  6. {radia-1.3.14 → radia-1.3.15}/examples/background_fields/permeability_comparison.py +2 -3
  7. {radia-1.3.14 → radia-1.3.15}/examples/background_fields/sphere_nastran_analysis.py +2 -2
  8. {radia-1.3.14 → radia-1.3.15}/examples/cube_uniform_field/README.md +12 -11
  9. radia-1.3.15/examples/cube_uniform_field/linear/README.md +214 -0
  10. radia-1.3.15/examples/cube_uniform_field/linear/benchmark_conditions.py +129 -0
  11. radia-1.3.15/examples/cube_uniform_field/linear/benchmark_hexa_unified.py +206 -0
  12. {radia-1.3.14/examples/cube_uniform_field/nonlinear → radia-1.3.15/examples/cube_uniform_field/linear}/benchmark_tetra_unified.py +253 -204
  13. radia-1.3.15/examples/cube_uniform_field/linear/compare_radia_elf.py +157 -0
  14. radia-1.3.15/examples/cube_uniform_field/linear/verify_radia_vs_elf.py +287 -0
  15. radia-1.3.15/examples/cube_uniform_field/nonlinear/README.md +137 -0
  16. {radia-1.3.14 → radia-1.3.15}/examples/cube_uniform_field/nonlinear/benchmark_conditions.py +6 -3
  17. radia-1.3.15/examples/cube_uniform_field/nonlinear/benchmark_hexahedron_hacapk.py +332 -0
  18. radia-1.3.15/examples/cube_uniform_field/nonlinear/benchmark_hexahedron_msc.py +337 -0
  19. radia-1.3.14/examples/cube_uniform_field/nonlinear/benchmark_tetra_netgen.py → radia-1.3.15/examples/cube_uniform_field/nonlinear/benchmark_tetrahedron_msc_netgen.py +73 -30
  20. {radia-1.3.14 → radia-1.3.15}/examples/magpylib_integration/cylinder_magnet_examples.py +1 -1
  21. {radia-1.3.14 → radia-1.3.15}/examples/magpylib_integration/demo_magpylib_integration.py +2 -2
  22. {radia-1.3.14 → radia-1.3.15}/examples/magpylib_integration/sphere_in_halbach_cylinder.py +1 -1
  23. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/README.md +22 -1
  24. radia-1.3.15/examples/ngsolve_integration/RadiaField_HACApK/verify_batch_evaluation.py +260 -0
  25. radia-1.3.15/examples/ngsolve_integration/mesh_magnetization_import/README.md +202 -0
  26. radia-1.3.15/examples/ngsolve_integration/mesh_magnetization_import/sphere_analytical_to_radia.py +282 -0
  27. radia-1.3.15/examples/ngsolve_integration/mesh_magnetization_import/verified_ngsolve_to_radia.py +534 -0
  28. radia-1.3.15/examples/ngsolve_integration/verify_curl_A_equals_B/verify_curl_A_equals_B.py +297 -0
  29. {radia-1.3.14 → radia-1.3.15}/examples/simple_problems/CONVERSION_NOTES.md +0 -1
  30. {radia-1.3.14 → radia-1.3.15}/examples/simple_problems/README.md +3 -5
  31. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_linear_material.py +2 -2
  32. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_lu_vs_hmatrix.py +2 -2
  33. radia-1.3.15/examples/tetra_field_accuracy_evaluation/README.md +151 -0
  34. radia-1.3.15/examples/tetra_field_accuracy_evaluation/analytical_reference.py +320 -0
  35. radia-1.3.15/examples/tetra_field_accuracy_evaluation/compare_all.py +290 -0
  36. radia-1.3.15/examples/tetra_field_accuracy_evaluation/evaluate_radia_solvers.py +419 -0
  37. radia-1.3.15/examples/tetra_field_accuracy_evaluation/evaluate_tetra_field.py +416 -0
  38. radia-1.3.15/examples/tetra_field_accuracy_evaluation/ngsolve_reference.py +302 -0
  39. {radia-1.3.14 → radia-1.3.15}/pyproject.toml +7 -1
  40. {radia-1.3.14 → radia-1.3.15}/src/radia/__init__.py +1 -1
  41. {radia-1.3.14 → radia-1.3.15}/src/radia/netgen_mesh_import.py +22 -0
  42. radia-1.3.15/src/radia/radia.pyd +0 -0
  43. {radia-1.3.14 → radia-1.3.15}/src/radia/radia_ngsolve.pyd +0 -0
  44. {radia-1.3.14 → radia-1.3.15/src/radia.egg-info}/PKG-INFO +3 -1
  45. {radia-1.3.14 → radia-1.3.15}/src/radia.egg-info/SOURCES.txt +17 -46
  46. {radia-1.3.14 → radia-1.3.15}/src/radia.egg-info/requires.txt +3 -0
  47. {radia-1.3.14 → radia-1.3.15}/tests/test_mesh_import.py +62 -188
  48. radia-1.3.14/docs/API_EXTENSIONS.md +0 -765
  49. radia-1.3.14/docs/API_REFERENCE.md +0 -1035
  50. radia-1.3.14/docs/CF_BACKGROUND_FIELD_IMPLEMENTATION.md +0 -485
  51. radia-1.3.14/docs/HMATRIX_SERIALIZATION.md +0 -371
  52. radia-1.3.14/docs/HMATRIX_USER_GUIDE.md +0 -656
  53. radia-1.3.14/docs/HYBRID_DOF_SOLVER_DESIGN.md +0 -370
  54. radia-1.3.14/docs/MATERIAL_API_IMPLEMENTATION.md +0 -303
  55. radia-1.3.14/docs/MESH_MSC_API_DESIGN.md +0 -663
  56. radia-1.3.14/docs/ML_PARAMETER_TUNING.md +0 -339
  57. radia-1.3.14/docs/MMM_MSC_IMPLEMENTATION.md +0 -175
  58. radia-1.3.14/docs/NGSOLVE_CF_BACKGROUND_FIELD_DESIGN.md +0 -665
  59. radia-1.3.14/docs/NGSOLVE_INTEGRATION.md +0 -365
  60. radia-1.3.14/docs/NGSOLVE_USAGE_GUIDE.md +0 -299
  61. radia-1.3.14/docs/README.md +0 -110
  62. radia-1.3.14/docs/SOLVER_METHODS.md +0 -207
  63. radia-1.3.14/docs/SUPPORTED_ELEMENTS.md +0 -199
  64. radia-1.3.14/examples/cube_uniform_field/linear/README.md +0 -334
  65. radia-1.3.14/examples/cube_uniform_field/linear/README_CUBE_BENCHMARK.md +0 -331
  66. radia-1.3.14/examples/cube_uniform_field/linear/benchmark_bicgstab_dense.py +0 -195
  67. radia-1.3.14/examples/cube_uniform_field/linear/benchmark_external_field.py +0 -379
  68. radia-1.3.14/examples/cube_uniform_field/linear/benchmark_high_mu.py +0 -318
  69. radia-1.3.14/examples/cube_uniform_field/linear/benchmark_mesh_convergence.py +0 -410
  70. radia-1.3.14/examples/cube_uniform_field/linear/benchmark_solver_methods.py +0 -53
  71. radia-1.3.14/examples/cube_uniform_field/linear/benchmark_tetra_vs_hex.py +0 -275
  72. radia-1.3.14/examples/cube_uniform_field/linear/benchmark_tetra_vs_ngsolve.py +0 -349
  73. radia-1.3.14/examples/cube_uniform_field/linear/compare_external_field.py +0 -406
  74. radia-1.3.14/examples/cube_uniform_field/linear/cube_benchmark_external_field.py +0 -326
  75. radia-1.3.14/examples/cube_uniform_field/linear/cube_benchmark_radia.vtk +0 -225
  76. radia-1.3.14/examples/cube_uniform_field/linear/evaluate_perturbation_field.py +0 -370
  77. radia-1.3.14/examples/cube_uniform_field/linear/precision_evaluation.py +0 -504
  78. radia-1.3.14/examples/cube_uniform_field/linear/test_method9_fine_mesh.py +0 -132
  79. radia-1.3.14/examples/cube_uniform_field/linear/test_method9_high_mu.py +0 -138
  80. radia-1.3.14/examples/cube_uniform_field/nonlinear/README.md +0 -135
  81. radia-1.3.14/examples/cube_uniform_field/nonlinear/benchmark_bicgstab_hex.py +0 -198
  82. radia-1.3.14/examples/cube_uniform_field/nonlinear/benchmark_element_types.py +0 -394
  83. radia-1.3.14/examples/cube_uniform_field/nonlinear/benchmark_hexa_unified.py +0 -198
  84. radia-1.3.14/examples/cube_uniform_field/nonlinear/benchmark_hexahedron_msc.py +0 -289
  85. radia-1.3.14/examples/cube_uniform_field/nonlinear/benchmark_nonlinear_tetra_vs_hex.py +0 -230
  86. radia-1.3.14/examples/cube_uniform_field/nonlinear/benchmark_solver_methods.py +0 -252
  87. radia-1.3.14/examples/cube_uniform_field/nonlinear/compare_radia_elfmagic_field.py +0 -195
  88. radia-1.3.14/examples/cube_uniform_field/nonlinear/compare_tetra_methods.py +0 -227
  89. radia-1.3.14/examples/ngsolve_integration/mesh_magnetization_import/RADIA_TETRA_ROOT_CAUSE.md +0 -62
  90. radia-1.3.14/examples/ngsolve_integration/mesh_magnetization_import/README.md +0 -274
  91. radia-1.3.14/examples/ngsolve_integration/mesh_magnetization_import/compare_radia_ngsolve_cube.py +0 -191
  92. radia-1.3.14/examples/ngsolve_integration/mesh_magnetization_import/cube_hex.vtk +0 -601
  93. radia-1.3.14/examples/ngsolve_integration/mesh_magnetization_import/demo_tetrahedral_methods_comparison.py +0 -91
  94. radia-1.3.14/examples/ngsolve_integration/mesh_magnetization_import/ngsolve_cube_graded_mesh.vtk +0 -130354
  95. radia-1.3.14/examples/ngsolve_integration/mesh_magnetization_import/ngsolve_tet_mesh.vtk +0 -130354
  96. radia-1.3.14/examples/ngsolve_integration/mesh_magnetization_import/sphere_domain_graded_mesh.vtk +0 -6817
  97. radia-1.3.14/examples/ngsolve_integration/verify_curl_A_equals_B.py +0 -352
  98. radia-1.3.14/src/radia/radia.pyd +0 -0
  99. {radia-1.3.14 → radia-1.3.15}/COPYRIGHT.txt +0 -0
  100. {radia-1.3.14 → radia-1.3.15}/LICENSE +0 -0
  101. {radia-1.3.14 → radia-1.3.15}/MANIFEST.in +0 -0
  102. {radia-1.3.14 → radia-1.3.15}/README.md +0 -0
  103. {radia-1.3.14 → radia-1.3.15}/docs/HMATRIX_EVALUATION.md +0 -0
  104. {radia-1.3.14 → radia-1.3.15}/docs/scripts/README.md +0 -0
  105. {radia-1.3.14 → radia-1.3.15}/examples/background_fields/cubit_to_nastran.py +0 -0
  106. {radia-1.3.14 → radia-1.3.15}/examples/background_fields/quadrupole_analytical.py +0 -0
  107. {radia-1.3.14 → radia-1.3.15}/examples/background_fields/quadrupole_analytical.vtk.vtk +0 -0
  108. {radia-1.3.14 → radia-1.3.15}/examples/background_fields/sphere_in_quadrupole.py +0 -0
  109. {radia-1.3.14 → radia-1.3.15}/examples/background_fields/sphere_nastran_field_mu.pvsm +0 -0
  110. {radia-1.3.14 → radia-1.3.15}/examples/background_fields/sphere_nastran_geometry.vtk +0 -0
  111. {radia-1.3.14 → radia-1.3.15}/examples/complex_coil_geometry/README.md +0 -0
  112. {radia-1.3.14 → radia-1.3.15}/examples/complex_coil_geometry/coil_geometry.vtk +0 -0
  113. {radia-1.3.14 → radia-1.3.15}/examples/complex_coil_geometry/coil_model.py +0 -0
  114. {radia-1.3.14 → radia-1.3.15}/examples/complex_coil_geometry/complex_coil.pvsm +0 -0
  115. {radia-1.3.14 → radia-1.3.15}/examples/complex_coil_geometry/field_map.py +0 -0
  116. {radia-1.3.14 → radia-1.3.15}/examples/complex_coil_geometry/field_map.vtk +0 -0
  117. {radia-1.3.14 → radia-1.3.15}/examples/complex_coil_geometry/visualize_coils.py +0 -0
  118. {radia-1.3.14 → radia-1.3.15}/examples/electromagnet/README.md +0 -0
  119. {radia-1.3.14 → radia-1.3.15}/examples/electromagnet/Radia_model.vtk +0 -0
  120. {radia-1.3.14 → radia-1.3.15}/examples/electromagnet/York.vtk +0 -0
  121. {radia-1.3.14 → radia-1.3.15}/examples/electromagnet/field_distribution.vtk +0 -0
  122. {radia-1.3.14 → radia-1.3.15}/examples/electromagnet/main_simulation_workflow.py +0 -0
  123. {radia-1.3.14 → radia-1.3.15}/examples/electromagnet/visualize_paraview.py +0 -0
  124. {radia-1.3.14 → radia-1.3.15}/examples/electromagnet/york_cubit_mesh.py +0 -0
  125. {radia-1.3.14 → radia-1.3.15}/examples/magpylib_integration/README.md +0 -0
  126. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/benchmark_gridfunction_set.py +0 -0
  127. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/demo_basic_field.py +0 -0
  128. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/demo_batch_evaluation.py +0 -0
  129. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/demo_coordinate_transform.py +0 -0
  130. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/demo_field_types.py +0 -0
  131. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/demo_hdiv_projection.py +0 -0
  132. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/mesh_magnetization_import/ngsolve_cube_uniform_field.py +0 -0
  133. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/test_batch_evaluation.py +0 -0
  134. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/test_unit_conversion.py +0 -0
  135. {radia-1.3.14 → radia-1.3.15}/examples/ngsolve_integration/visualize_field.py +0 -0
  136. {radia-1.3.14 → radia-1.3.15}/examples/simple_problems/arc_current_dual_magnets.py +0 -0
  137. {radia-1.3.14 → radia-1.3.15}/examples/simple_problems/arc_current_with_magnet.py +0 -0
  138. {radia-1.3.14 → radia-1.3.15}/examples/simple_problems/chamfered_pole_piece.py +0 -0
  139. {radia-1.3.14 → radia-1.3.15}/examples/simple_problems/compare_magpylib.py +0 -0
  140. {radia-1.3.14 → radia-1.3.15}/examples/simple_problems/cubic_polyhedron_magnet.py +0 -0
  141. {radia-1.3.14 → radia-1.3.15}/examples/smco_magnet_array/README.md +0 -0
  142. {radia-1.3.14 → radia-1.3.15}/examples/smco_magnet_array/smbo.pvsm +0 -0
  143. {radia-1.3.14 → radia-1.3.15}/examples/smco_magnet_array/smco_array.py +0 -0
  144. {radia-1.3.14 → radia-1.3.15}/examples/smco_magnet_array/smco_array.vtk +0 -0
  145. {radia-1.3.14 → radia-1.3.15}/examples/smco_magnet_array/smco_field_distribution.vtk +0 -0
  146. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/BENCHMARK_RESULTS.md +0 -0
  147. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/README.md +0 -0
  148. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_field_evaluation.py +0 -0
  149. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_large_scale_comparison.py +0 -0
  150. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_matrix_construction.py +0 -0
  151. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_parallel_construction.py +0 -0
  152. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_solver.py +0 -0
  153. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_solver_comparison.py +0 -0
  154. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_solver_methods.py +0 -0
  155. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_solver_scaling.py +0 -0
  156. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/benchmark_solver_scaling_extended.py +0 -0
  157. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/plot_benchmark_results.py +0 -0
  158. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/run_all_benchmarks.py +0 -0
  159. {radia-1.3.14 → radia-1.3.15}/examples/solver_benchmarks/verify_field_accuracy.py +0 -0
  160. {radia-1.3.14 → radia-1.3.15}/setup.cfg +0 -0
  161. {radia-1.3.14 → radia-1.3.15}/setup.py +0 -0
  162. {radia-1.3.14 → radia-1.3.15}/src/radia/libopenblas.dll +0 -0
  163. {radia-1.3.14 → radia-1.3.15}/src/radia/nastran_mesh_import.py +0 -0
  164. {radia-1.3.14 → radia-1.3.15}/src/radia/rad_ngsolve_fast.py +0 -0
  165. {radia-1.3.14 → radia-1.3.15}/src/radia/radia_coil_builder.py +0 -0
  166. {radia-1.3.14 → radia-1.3.15}/src/radia/radia_field_cached.py +0 -0
  167. {radia-1.3.14 → radia-1.3.15}/src/radia/radia_ngsolve_field.py +0 -0
  168. {radia-1.3.14 → radia-1.3.15}/src/radia/radia_ngsolve_utils.py +0 -0
  169. {radia-1.3.14 → radia-1.3.15}/src/radia/radia_pyvista_viewer.py +0 -0
  170. {radia-1.3.14 → radia-1.3.15}/src/radia/radia_vtk_export.py +0 -0
  171. {radia-1.3.14 → radia-1.3.15}/src/radia.egg-info/dependency_links.txt +0 -0
  172. {radia-1.3.14 → radia-1.3.15}/src/radia.egg-info/not-zip-safe +0 -0
  173. {radia-1.3.14 → radia-1.3.15}/src/radia.egg-info/top_level.txt +0 -0
  174. {radia-1.3.14 → radia-1.3.15}/tests/README.md +0 -0
  175. {radia-1.3.14 → radia-1.3.15}/tests/__init__.py +0 -0
  176. {radia-1.3.14 → radia-1.3.15}/tests/benchmarks/benchmark_correct.py +0 -0
  177. {radia-1.3.14 → radia-1.3.15}/tests/benchmarks/benchmark_heavy.py +0 -0
  178. {radia-1.3.14 → radia-1.3.15}/tests/benchmarks/benchmark_openmp.py +0 -0
  179. {radia-1.3.14 → radia-1.3.15}/tests/benchmarks/benchmark_threads.py +0 -0
  180. {radia-1.3.14 → radia-1.3.15}/tests/conftest.py +0 -0
  181. {radia-1.3.14 → radia-1.3.15}/tests/profile_batch_performance.py +0 -0
  182. {radia-1.3.14 → radia-1.3.15}/tests/test_advanced.py +0 -0
  183. {radia-1.3.14 → radia-1.3.15}/tests/test_all_spaces.py +0 -0
  184. {radia-1.3.14 → radia-1.3.15}/tests/test_background_field_debug.py +0 -0
  185. {radia-1.3.14 → radia-1.3.15}/tests/test_batch_evaluation.py +0 -0
  186. {radia-1.3.14 → radia-1.3.15}/tests/test_cf_direct.py +0 -0
  187. {radia-1.3.14 → radia-1.3.15}/tests/test_convergence_hdiv.py +0 -0
  188. {radia-1.3.14 → radia-1.3.15}/tests/test_curlA_equals_B.py +0 -0
  189. {radia-1.3.14 → radia-1.3.15}/tests/test_curl_A_detailed.py +0 -0
  190. {radia-1.3.14 → radia-1.3.15}/tests/test_far_field_accuracy.py +0 -0
  191. {radia-1.3.14 → radia-1.3.15}/tests/test_fast_preparecache.py +0 -0
  192. {radia-1.3.14 → radia-1.3.15}/tests/test_fast_simple.py +0 -0
  193. {radia-1.3.14 → radia-1.3.15}/tests/test_group_operations.py +0 -0
  194. {radia-1.3.14 → radia-1.3.15}/tests/test_hcurl_vs_hdiv.py +0 -0
  195. {radia-1.3.14 → radia-1.3.15}/tests/test_l2_norm_debug.py +0 -0
  196. {radia-1.3.14 → radia-1.3.15}/tests/test_magpylib_comparison.py +0 -0
  197. {radia-1.3.14 → radia-1.3.15}/tests/test_materials.py +0 -0
  198. {radia-1.3.14 → radia-1.3.15}/tests/test_memory_allocation_tracking.py +0 -0
  199. {radia-1.3.14 → radia-1.3.15}/tests/test_minimal_cached.py +0 -0
  200. {radia-1.3.14 → radia-1.3.15}/tests/test_moving_magnet_memory.py +0 -0
  201. {radia-1.3.14 → radia-1.3.15}/tests/test_moving_magnet_memory_diagnosis.py +0 -0
  202. {radia-1.3.14 → radia-1.3.15}/tests/test_new_material_api.py +0 -0
  203. {radia-1.3.14 → radia-1.3.15}/tests/test_ngsolve_integration.py +0 -0
  204. {radia-1.3.14 → radia-1.3.15}/tests/test_objbckg_simple.py +0 -0
  205. {radia-1.3.14 → radia-1.3.15}/tests/test_objbckgcf_alone.py +0 -0
  206. {radia-1.3.14 → radia-1.3.15}/tests/test_order1.py +0 -0
  207. {radia-1.3.14 → radia-1.3.15}/tests/test_parallel_performance.py +0 -0
  208. {radia-1.3.14 → radia-1.3.15}/tests/test_preparecache_performance.py +0 -0
  209. {radia-1.3.14 → radia-1.3.15}/tests/test_process_memory.py +0 -0
  210. {radia-1.3.14 → radia-1.3.15}/tests/test_python_cached_field.py +0 -0
  211. {radia-1.3.14 → radia-1.3.15}/tests/test_python_cached_simple.py +0 -0
  212. {radia-1.3.14 → radia-1.3.15}/tests/test_rad_ngsolve.py +0 -0
  213. {radia-1.3.14 → radia-1.3.15}/tests/test_rad_ngsolve_diagnostic.py +0 -0
  214. {radia-1.3.14 → radia-1.3.15}/tests/test_rad_ngsolve_function.py +0 -0
  215. {radia-1.3.14 → radia-1.3.15}/tests/test_radhmat.py +0 -0
  216. {radia-1.3.14 → radia-1.3.15}/tests/test_radia.py +0 -0
  217. {radia-1.3.14 → radia-1.3.15}/tests/test_radia_core_memory.py +0 -0
  218. {radia-1.3.14 → radia-1.3.15}/tests/test_radia_field_computation_memory.py +0 -0
  219. {radia-1.3.14 → radia-1.3.15}/tests/test_radia_ngsolve_longrun.py +0 -0
  220. {radia-1.3.14 → radia-1.3.15}/tests/test_radia_ngsolve_memory_leak.py +0 -0
  221. {radia-1.3.14 → radia-1.3.15}/tests/test_radia_ngsolve_with_cache.py +0 -0
  222. {radia-1.3.14 → radia-1.3.15}/tests/test_radia_only_memory.py +0 -0
  223. {radia-1.3.14 → radia-1.3.15}/tests/test_serialization.py +0 -0
  224. {radia-1.3.14 → radia-1.3.15}/tests/test_set_vs_interpolate.py +0 -0
  225. {radia-1.3.14 → radia-1.3.15}/tests/test_simple.py +0 -0
  226. {radia-1.3.14 → radia-1.3.15}/tests/test_simple_fld_leak.py +0 -0
  227. {radia-1.3.14 → radia-1.3.15}/tests/test_square_coil_analytical.py +0 -0
  228. {radia-1.3.14 → radia-1.3.15}/tests/test_tetrahedral_solver.py +0 -0
  229. {radia-1.3.14 → radia-1.3.15}/tests/test_transformations.py +0 -0
  230. {radia-1.3.14 → radia-1.3.15}/tests/test_type_cast.py +0 -0
  231. {radia-1.3.14 → radia-1.3.15}/tests/test_unit_conversion_verify.py +0 -0
  232. {radia-1.3.14 → radia-1.3.15}/tests/test_utils.py +0 -0
  233. {radia-1.3.14 → radia-1.3.15}/tests/test_vector_potential.py +0 -0
  234. {radia-1.3.14 → radia-1.3.15}/tests/test_without_B_projection.py +0 -0
  235. {radia-1.3.14 → radia-1.3.15}/tests/test_without_gridfunction.py +0 -0
  236. {radia-1.3.14 → radia-1.3.15}/tests/verify_curl_A_equals_B.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: radia
3
- Version: 1.3.14
3
+ Version: 1.3.15
4
4
  Summary: Radia 3D Magnetostatics with NGSolve Integration and OpenMP Parallelization
5
5
  Home-page: https://github.com/ksugahar/Radia_NGSolve
6
6
  Author: Pascal Elleaume
@@ -28,6 +28,8 @@ Requires-Dist: numpy>=1.20
28
28
  Provides-Extra: viz
29
29
  Requires-Dist: pyvista>=0.40; extra == "viz"
30
30
  Requires-Dist: matplotlib>=3.5; extra == "viz"
31
+ Provides-Extra: ngsolve
32
+ Requires-Dist: ngsolve==6.2.2405; extra == "ngsolve"
31
33
  Provides-Extra: test
32
34
  Requires-Dist: pytest>=7.0; extra == "test"
33
35
  Requires-Dist: pytest-cov>=4.0; extra == "test"
@@ -0,0 +1,579 @@
1
+ # Radia Python API Reference
2
+
3
+ Complete reference for Radia Python API.
4
+
5
+ **Version**: 1.3.14
6
+ **Date**: 2025-12-15
7
+ **Original ESRF Documentation**: https://www.esrf.fr/home/Accelerators/instrumentation--equipment/Software/Radia/Documentation/ReferenceGuide.html
8
+
9
+ ---
10
+
11
+ ## Table of Contents
12
+
13
+ - [Quick Start](#quick-start)
14
+ - [Supported Elements](#supported-elements)
15
+ - [Geometry Objects](#geometry-objects)
16
+ - [Materials](#materials)
17
+ - [Solver](#solver)
18
+ - [Field Computation](#field-computation)
19
+ - [Mesh Import](#mesh-import)
20
+ - [NGSolve Integration](#ngsolve-integration)
21
+ - [Utilities](#utilities)
22
+
23
+ ---
24
+
25
+ ## Quick Start
26
+
27
+ ### MSC Hexahedral Example (ObjThckPgn)
28
+
29
+ ```python
30
+ import radia as rad
31
+ import numpy as np
32
+
33
+ rad.FldUnits('m')
34
+ rad.UtiDelAll()
35
+
36
+ MU_0 = 4 * np.pi * 1e-7
37
+ n_div = 5
38
+ cube_size = 1.0
39
+ elem_size = cube_size / n_div
40
+
41
+ # Create 5x5x5 hexahedral mesh using ObjThckPgn
42
+ elements = []
43
+ for ix in range(n_div):
44
+ for iy in range(n_div):
45
+ for iz in range(n_div):
46
+ cx = (ix + 0.5) * elem_size - cube_size / 2
47
+ cy = (iy + 0.5) * elem_size - cube_size / 2
48
+ cz = (iz + 0.5) * elem_size - cube_size / 2
49
+ half = elem_size / 2
50
+
51
+ polygon = [[cx-half, cy-half], [cx+half, cy-half],
52
+ [cx+half, cy+half], [cx-half, cy+half]]
53
+ obj = rad.ObjThckPgn(cz - half, elem_size, polygon, 'z', [0, 0, 0])
54
+ elements.append(obj)
55
+
56
+ container = rad.ObjCnt(elements)
57
+ mat = rad.MatLin(1000) # mu_r = 1000
58
+ rad.MatApl(container, mat)
59
+
60
+ ext = rad.ObjBckg([0, 0, MU_0 * 50000])
61
+ grp = rad.ObjCnt([container, ext])
62
+ rad.Solve(grp, 0.001, 1000, 1)
63
+ ```
64
+
65
+ ### Tetrahedral Mesh Example (Netgen)
66
+
67
+ ```python
68
+ import radia as rad
69
+ rad.FldUnits('m')
70
+
71
+ # Import NGSolve BEFORE radia modules
72
+ from netgen.occ import Box, Pnt, OCCGeometry
73
+ from ngsolve import Mesh
74
+ from netgen_mesh_import import netgen_mesh_to_radia
75
+
76
+ # Create tetrahedral mesh
77
+ cube = Box(Pnt(-0.5, -0.5, -0.5), Pnt(0.5, 0.5, 0.5))
78
+ cube.mat('magnetic')
79
+ mesh = Mesh(OCCGeometry(cube).GenerateMesh(maxh=0.3))
80
+
81
+ # Import to Radia
82
+ mag_obj = netgen_mesh_to_radia(mesh,
83
+ material={'magnetization': [0, 0, 0]},
84
+ units='m',
85
+ material_filter='magnetic')
86
+ ```
87
+
88
+ ---
89
+
90
+ ## Supported Elements
91
+
92
+ | Element Type | API | Faces | DOF | Use Case |
93
+ |--------------|-----|-------|-----|----------|
94
+ | **Extruded Polygon** | `ObjThckPgn()` | N-gon extruded | 3 | General prism shapes |
95
+ | **Hexahedron (MSC)** | `ObjRecMag()` or `ObjPolyhdr()` | 6 quad | 6 | Permanent magnets, soft iron |
96
+ | **Tetrahedron** | `ObjPolyhdr()` + `TETRA_FACES` | 4 tri | 3 | Complex curved geometry |
97
+ | **Wedge/Prism** | `ObjPolyhdr()` + `WEDGE_FACES` | 5 | 3 | Hybrid meshes |
98
+ | **Pyramid** | `ObjPolyhdr()` + `PYRAMID_FACES` | 5 | 3 | Mesh transitions |
99
+
100
+ **DOF (Degrees of Freedom)**:
101
+ - **Hexahedra (6 faces)**: 6 DOF - Surface charge density (sigma) per face (MSC method)
102
+ - **Other elements (4-5 faces)**: 3 DOF - Magnetization vector (Mx, My, Mz)
103
+ - `ObjRecMag()` automatically uses 6 DOF MSC hexahedron
104
+
105
+ ### Face Topology Constants
106
+
107
+ ```python
108
+ from netgen_mesh_import import TETRA_FACES, HEX_FACES, WEDGE_FACES, PYRAMID_FACES
109
+
110
+ # TETRA_FACES (1-indexed)
111
+ [[1, 3, 2], [1, 2, 4], [2, 3, 4], [3, 1, 4]]
112
+
113
+ # HEX_FACES (1-indexed)
114
+ [[1, 4, 3, 2], [5, 6, 7, 8], [1, 2, 6, 5], [3, 4, 8, 7], [1, 5, 8, 4], [2, 3, 7, 6]]
115
+ ```
116
+
117
+ ---
118
+
119
+ ## Geometry Objects
120
+
121
+ ### ObjThckPgn - Thick Polygon (Extruded 2D)
122
+
123
+ ```python
124
+ obj = rad.ObjThckPgn(z_base, thickness, vertices_2d, axis, magnetization)
125
+ ```
126
+
127
+ | Parameter | Type | Description |
128
+ |-----------|------|-------------|
129
+ | `z_base` | float | Base position along extrusion axis |
130
+ | `thickness` | float | Extrusion length |
131
+ | `vertices_2d` | [[x,y], ...] | 2D polygon vertices (CCW) |
132
+ | `axis` | str | Extrusion axis: `'x'`, `'y'`, or `'z'` |
133
+ | `magnetization` | [Mx, My, Mz] | Initial magnetization |
134
+
135
+ ```python
136
+ polygon = [[-0.5, -0.5], [0.5, -0.5], [0.5, 0.5], [-0.5, 0.5]]
137
+ hex_elem = rad.ObjThckPgn(-0.5, 1.0, polygon, 'z', [0, 0, 0])
138
+ ```
139
+
140
+ ### ObjPolyhdr - General Polyhedron
141
+
142
+ ```python
143
+ obj = rad.ObjPolyhdr(vertices, faces, magnetization)
144
+ ```
145
+
146
+ | Parameter | Type | Description |
147
+ |-----------|------|-------------|
148
+ | `vertices` | [[x,y,z], ...] | 3D vertex coordinates |
149
+ | `faces` | [[v1,v2,...], ...] | Face vertex indices (**1-indexed!**) |
150
+ | `magnetization` | [Mx, My, Mz] | Initial magnetization |
151
+
152
+ ```python
153
+ from netgen_mesh_import import TETRA_FACES
154
+ vertices = [[0,0,0], [1,0,0], [0.5,1,0], [0.5,0.5,1]]
155
+ tet = rad.ObjPolyhdr(vertices, TETRA_FACES, [0, 0, 1e6])
156
+ ```
157
+
158
+ ### ObjBckg - Uniform Background Field
159
+
160
+ ```python
161
+ field_src = rad.ObjBckg([Bx, By, Bz])
162
+ ```
163
+
164
+ ```python
165
+ MU_0 = 4 * np.pi * 1e-7
166
+ ext = rad.ObjBckg([0, 0, MU_0 * 50000]) # 50,000 A/m in z
167
+ ```
168
+
169
+ ### ObjCnt - Container
170
+
171
+ ```python
172
+ group = rad.ObjCnt([obj1, obj2, ...])
173
+ ```
174
+
175
+ ### ObjRaceTrk - Racetrack Coil
176
+
177
+ ```python
178
+ coil = rad.ObjRaceTrk(center, radii, heights, current, n_segments)
179
+ ```
180
+
181
+ ### ObjFlmCur - Filament Conductor
182
+
183
+ ```python
184
+ filament = rad.ObjFlmCur([[x1,y1,z1], [x2,y2,z2], ...], current)
185
+ ```
186
+
187
+ ---
188
+
189
+ ## Materials
190
+
191
+ ### MatLin - Linear Isotropic
192
+
193
+ ```python
194
+ mat = rad.MatLin(mu_r) # relative permeability
195
+ rad.MatApl(obj, mat)
196
+ ```
197
+
198
+ ```python
199
+ # Soft iron (mu_r = 1000)
200
+ mat = rad.MatLin(1000)
201
+ rad.MatApl(cube, mat)
202
+ ```
203
+
204
+ ### MatLin - Linear Anisotropic
205
+
206
+ ```python
207
+ mat = rad.MatLin([mu_r_par, mu_r_perp], [ex, ey, ez])
208
+ ```
209
+
210
+ ```python
211
+ # Easy axis in z-direction
212
+ mat = rad.MatLin([5001, 101], [0, 0, 1])
213
+ ```
214
+
215
+ ### MatSatIsoTab - Nonlinear (B-H Table)
216
+
217
+ ```python
218
+ mat = rad.MatSatIsoTab(BH_data) # [[H, B], ...] in A/m and Tesla
219
+ ```
220
+
221
+ **Input Format**: Industry-standard B-H curve (H in A/m, B in Tesla).
222
+ Radia internally converts to M-H using: M = B/mu_0 - H
223
+
224
+ ```python
225
+ # B-H curve: [H (A/m), B (T)]
226
+ BH_DATA = [
227
+ [0.0, 0.0],
228
+ [100.0, 0.1],
229
+ [200.0, 0.3],
230
+ [500.0, 0.8],
231
+ [1000.0, 1.2],
232
+ [2000.0, 1.5],
233
+ [5000.0, 1.7],
234
+ [10000.0, 1.8],
235
+ [50000.0, 2.0],
236
+ [100000.0, 2.1],
237
+ ]
238
+
239
+ mat = rad.MatSatIsoTab(BH_DATA)
240
+ ```
241
+
242
+ ### MatSatIsoFrm - Nonlinear (Formula)
243
+
244
+ ```python
245
+ mat = rad.MatSatIsoFrm([ksi1, ms1], [ksi2, ms2], [ksi3, ms3])
246
+ ```
247
+
248
+ Formula: `M = ms1*tanh(ksi1*H/ms1) + ms2*tanh(ksi2*H/ms2) + ms3*tanh(ksi3*H/ms3)`
249
+
250
+ ```python
251
+ # Steel37 (C<0.13%)
252
+ mat = rad.MatSatIsoFrm([1596.3, 1.1488], [133.11, 0.4268], [18.713, 0.4759])
253
+ ```
254
+
255
+ ### MatApl - Apply Material
256
+
257
+ ```python
258
+ rad.MatApl(obj, material)
259
+ ```
260
+
261
+ ---
262
+
263
+ ## Solver
264
+
265
+ ### Solve - High-Level API (Recommended)
266
+
267
+ ```python
268
+ result = rad.Solve(obj, tolerance, max_iter, method=1)
269
+ ```
270
+
271
+ | Parameter | Type | Description |
272
+ |-----------|------|-------------|
273
+ | `obj` | int | Object or container |
274
+ | `tolerance` | float | Convergence threshold (0.001 = 0.1%) |
275
+ | `max_iter` | int | Maximum iterations |
276
+ | `method` | int | `0` = LU, `1` = BiCGSTAB (default) |
277
+
278
+ | Returns | Description |
279
+ |---------|-------------|
280
+ | `result[0]` | Final residual |
281
+ | `result[3]` | Number of iterations |
282
+
283
+ ### Solver Selection
284
+
285
+ | Problem Size | Elements | Method | Code |
286
+ |--------------|----------|--------|------|
287
+ | Small | < 1,000 | LU | `rad.Solve(grp, 0.001, 100, 0)` |
288
+ | Medium | 1,000-10,000 | BiCGSTAB | `rad.Solve(grp, 0.001, 1000, 1)` |
289
+ | Large | > 10,000 | BiCGSTAB | `rad.Solve(grp, 0.001, 1000, 1)` |
290
+
291
+ **Iteration counts**:
292
+ - Linear materials: 1-2 iterations
293
+ - Nonlinear materials: 3-6 iterations (with B-field convergence)
294
+
295
+ ### Nonlinear Convergence (v1.3.15+)
296
+
297
+ Radia uses **B-field based convergence** (mucal2) for nonlinear materials:
298
+
299
+ ```
300
+ rel_change = |B_new - B_old| / B_sat
301
+ ```
302
+
303
+ | Parameter | Description |
304
+ |-----------|-------------|
305
+ | `B_sat` | Saturation magnetization from BH curve |
306
+ | `tolerance` | Default 0.0001 (0.01% relative change) |
307
+
308
+ This method provides fast Newton-Raphson convergence and matches industry-standard solvers.
309
+
310
+ ### BiCGSTAB Performance
311
+
312
+ Typical solve times (nonlinear BH curve material):
313
+
314
+ | Elements | Time | Iterations |
315
+ |----------|------|------------|
316
+ | 1,000 | 0.55s | 5-6 |
317
+ | 3,375 | 7.30s | 5-6 |
318
+ | 8,000 | 51.81s | 5-6 |
319
+
320
+ ---
321
+
322
+ ## Field Computation
323
+
324
+ ### Fld - Field at Point(s)
325
+
326
+ ```python
327
+ field = rad.Fld(obj, component, point)
328
+ ```
329
+
330
+ | Component | Description |
331
+ |-----------|-------------|
332
+ | `'bx'`, `'by'`, `'bz'`, `'b'` | Magnetic flux density B (T) |
333
+ | `'hx'`, `'hy'`, `'hz'`, `'h'` | Magnetic field H (A/m) |
334
+ | `'ax'`, `'ay'`, `'az'`, `'a'` | Vector potential A (T*m) |
335
+ | `'mx'`, `'my'`, `'mz'`, `'m'` | Magnetization M |
336
+
337
+ ```python
338
+ B = rad.Fld(magnet, 'b', [0, 0, 0.1]) # B vector at point
339
+ Bz = rad.Fld(magnet, 'bz', [0, 0, 0.1]) # Bz component
340
+ ```
341
+
342
+ ### FldLst - Field Along Line
343
+
344
+ ```python
345
+ field_list = rad.FldLst(obj, component, p1, p2, n_points, 'arg')
346
+ ```
347
+
348
+ ### ObjM - Get Magnetization
349
+
350
+ ```python
351
+ all_M = rad.ObjM(obj) # Returns [[center, [Mx, My, Mz]], ...]
352
+ ```
353
+
354
+ ```python
355
+ all_M = rad.ObjM(container)
356
+ M_list = [m[1] for m in all_M]
357
+ M_avg_z = np.mean([m[2] for m in M_list])
358
+ ```
359
+
360
+ ---
361
+
362
+ ## Mesh Import
363
+
364
+ ### NGSolve Mesh Access Policy (MANDATORY)
365
+
366
+ **CRITICAL**: All NGSolve mesh access MUST use functions from `netgen_mesh_import.py`.
367
+
368
+ | Rule | Description |
369
+ |------|-------------|
370
+ | **ALWAYS** | Use `netgen_mesh_to_radia()` or `extract_elements()` |
371
+ | **NEVER** | Directly access `mesh.ngmesh.Points()`, `mesh.vertices[]`, or `el.vertices[].nr` |
372
+ | **NO EXCEPTIONS** | Applies to all scripts including examples, tests, and debugging code |
373
+
374
+ **Why?** NGSolve has TWO different indexing schemes:
375
+
376
+ | Access Method | Indexing | Valid Range |
377
+ |--------------|----------|-------------|
378
+ | `mesh.ngmesh.Points()[i]` | **1-indexed** | 1 to nv |
379
+ | `mesh.vertices[i]` | **0-indexed** | 0 to nv-1 |
380
+ | `el.vertices[i].nr` | Returns **0-indexed** | Use with `mesh.vertices[]` only |
381
+
382
+ Mixing these causes off-by-one errors that are difficult to debug.
383
+
384
+ ### netgen_mesh_to_radia - Netgen Tetrahedral
385
+
386
+ ```python
387
+ from netgen_mesh_import import netgen_mesh_to_radia
388
+
389
+ mag_obj = netgen_mesh_to_radia(mesh,
390
+ material={'magnetization': [0, 0, 0]},
391
+ units='m',
392
+ material_filter='magnetic')
393
+ ```
394
+
395
+ ### extract_elements - Custom Processing
396
+
397
+ ```python
398
+ from netgen_mesh_import import extract_elements, compute_element_centroid
399
+
400
+ elements, _ = extract_elements(mesh, material_filter='magnetic')
401
+ for el in elements:
402
+ vertices = el['vertices'] # Correctly extracted coordinates
403
+ centroid = compute_element_centroid(vertices)
404
+ ```
405
+
406
+ ### Available Functions in netgen_mesh_import.py
407
+
408
+ | Function | Description |
409
+ |----------|-------------|
410
+ | `netgen_mesh_to_radia()` | Convert entire mesh to Radia geometry (recommended) |
411
+ | `extract_elements()` | Extract element data for custom processing |
412
+ | `compute_element_centroid()` | Compute centroid from vertex list |
413
+ | `create_radia_tetrahedron()` | Create single Radia tetrahedron |
414
+ | `create_radia_hexahedron()` | Create single Radia hexahedron |
415
+
416
+ ### create_radia_from_nastran - Nastran Import
417
+
418
+ ```python
419
+ from nastran_mesh_import import create_radia_from_nastran
420
+
421
+ mag_obj = create_radia_from_nastran('model.bdf',
422
+ material={'magnetization': [0, 0, 1e6]},
423
+ units='m')
424
+ ```
425
+
426
+ **Supported Nastran elements**: CTETRA, CHEXA, CPENTA, CPYRAM, CTRIA3
427
+
428
+ ---
429
+
430
+ ## NGSolve Integration
431
+
432
+ ### Import Order (CRITICAL)
433
+
434
+ ```python
435
+ # 1. Import radia first
436
+ import radia as rad
437
+ rad.FldUnits('m') # REQUIRED: NGSolve uses meters
438
+
439
+ # 2. Import ngsolve BEFORE radia_ngsolve
440
+ import ngsolve
441
+ from ngsolve import *
442
+
443
+ # 3. NOW import radia_ngsolve
444
+ from radia import radia_ngsolve
445
+ ```
446
+
447
+ Wrong order causes `ImportError: DLL load failed`.
448
+
449
+ ### NGSolve Version Requirement
450
+
451
+ **Use NGSolve 6.2.2405 only** (6.2.2406+ has Periodic BC bug).
452
+
453
+ ```bash
454
+ pip install ngsolve==6.2.2405
455
+ ```
456
+
457
+ ### RadiaField - CoefficientFunction
458
+
459
+ ```python
460
+ cf = radia_ngsolve.RadiaField(radia_obj, field_type='b')
461
+ ```
462
+
463
+ | Parameter | Type | Description |
464
+ |-----------|------|-------------|
465
+ | `radia_obj` | int | Radia object ID |
466
+ | `field_type` | str | `'b'`, `'h'`, `'a'`, or `'m'` |
467
+
468
+ ```python
469
+ # Create CoefficientFunction for B field
470
+ B_cf = radia_ngsolve.RadiaField(magnet, 'b')
471
+
472
+ # Use in NGSolve
473
+ fes = HDiv(mesh, order=2)
474
+ gf = GridFunction(fes)
475
+ gf.Set(B_cf)
476
+ ```
477
+
478
+ ---
479
+
480
+ ## Utilities
481
+
482
+ ### FldUnits - Unit System
483
+
484
+ ```python
485
+ rad.FldUnits('m') # Use meters (required for NGSolve)
486
+ rad.FldUnits('mm') # Use millimeters (default)
487
+ rad.FldUnits() # Get current units
488
+ ```
489
+
490
+ ### UtiDelAll - Clear Memory
491
+
492
+ ```python
493
+ rad.UtiDelAll()
494
+ ```
495
+
496
+ ### UtiVer - Version
497
+
498
+ ```python
499
+ version = rad.UtiVer()
500
+ ```
501
+
502
+ ---
503
+
504
+ ## Transformations
505
+
506
+ ### TrfTrsl - Translation
507
+
508
+ ```python
509
+ rad.TrfTrsl(obj, [dx, dy, dz])
510
+ ```
511
+
512
+ ### TrfRot - Rotation
513
+
514
+ ```python
515
+ rad.TrfRot(obj, [x, y, z], [nx, ny, nz], angle)
516
+ ```
517
+
518
+ ### TrfMlt - Multiple Copies
519
+
520
+ ```python
521
+ array = rad.TrfMlt(obj, transformation, n_copies)
522
+ ```
523
+
524
+ ---
525
+
526
+ ## Common Issues
527
+
528
+ ### 1. Coordinates Off by 1000x
529
+
530
+ **Cause**: Unit mismatch (NGSolve uses meters, Radia defaults to mm)
531
+
532
+ **Solution**:
533
+ ```python
534
+ rad.FldUnits('m') # Set at start of script
535
+ ```
536
+
537
+ ### 2. DLL Load Failed
538
+
539
+ **Cause**: Wrong import order
540
+
541
+ **Solution**: Import ngsolve BEFORE radia_ngsolve
542
+
543
+ ### 3. ObjPolyhdr Face Error
544
+
545
+ **Cause**: 0-indexed faces
546
+
547
+ **Solution**: Use **1-indexed** faces (Radia convention)
548
+
549
+ ### 4. Solver Not Converging
550
+
551
+ **Solutions**:
552
+ 1. Use BiCGSTAB (Method 1)
553
+ 2. Increase max iterations
554
+ 3. Check B-H data is monotonic
555
+ 4. Verify H-M conversion: `M = B/mu_0 - H`
556
+
557
+ ---
558
+
559
+ ## Units
560
+
561
+ | Quantity | Unit |
562
+ |----------|------|
563
+ | Length | mm (default) or m with `FldUnits('m')` |
564
+ | B (flux density) | Tesla (T) |
565
+ | H (field) | A/m |
566
+ | M (magnetization) | A/m |
567
+ | Current | Ampere (A) |
568
+
569
+ ---
570
+
571
+ ## References
572
+
573
+ 1. [ESRF Radia Reference Guide](https://www.esrf.fr/home/Accelerators/instrumentation--equipment/Software/Radia/Documentation/ReferenceGuide.html)
574
+ 2. [examples/cube_uniform_field/](../examples/cube_uniform_field/) - Benchmark examples
575
+
576
+ ---
577
+
578
+ **Last Updated**: 2025-12-15
579
+ **License**: LGPL-2.1 (modifications), BSD-style (original RADIA from ESRF)
@@ -0,0 +1,20 @@
1
+ # Radia Documentation
2
+
3
+ **Version:** 1.3.14
4
+
5
+ ## Documentation
6
+
7
+ | Document | Description |
8
+ |----------|-------------|
9
+ | [API_REFERENCE.md](API_REFERENCE.md) | **Main documentation** - Quick start, API, elements, solvers, NGSolve |
10
+ | [HMATRIX_EVALUATION.md](HMATRIX_EVALUATION.md) | H-matrix research (advanced, not for typical use) |
11
+
12
+ ## Quick Links
13
+
14
+ - [Main README](../README.md) - Project overview and installation
15
+ - [CHANGELOG](../CHANGELOG.md) - Version history
16
+ - [Examples](../examples/) - Working code examples
17
+
18
+ ---
19
+
20
+ **Last Updated:** 2025-12-15
@@ -256,19 +256,23 @@ except ImportError:
256
256
 
257
257
  ### Material API
258
258
 
259
- All examples use the new Material API:
259
+ All examples use the industry-standard Material API:
260
260
 
261
261
  ```python
262
- # Isotropic linear material (μr = 1000)
263
- mat = rad.MatLin(999) # chi = μr - 1
262
+ # Isotropic linear material (mu_r = 1000)
263
+ mat = rad.MatLin(1000) # relative permeability
264
264
 
265
265
  # Anisotropic linear material
266
- mat = rad.MatLin([0.06, 0.17], [0, 0, 1]) # [chi_par, chi_perp], easy_axis
266
+ mat = rad.MatLin([1.06, 1.17], [0, 0, 1]) # [mu_r_par, mu_r_perp], easy_axis
267
267
 
268
268
  # Permanent magnet (NdFeB)
269
269
  mat = rad.MatPM(1.2, 900000, [0, 0, 1]) # Br, Hc, magnetization_direction
270
270
 
271
- # Saturating material (Steel37)
271
+ # Nonlinear material (B-H curve)
272
+ BH_DATA = [[0, 0], [100, 0.1], [1000, 1.2], [10000, 1.8]] # [H (A/m), B (T)]
273
+ mat = rad.MatSatIsoTab(BH_DATA)
274
+
275
+ # Saturating material (Steel37 formula)
272
276
  mat = rad.MatSatIsoFrm([1596.3, 1.1488], [133.11, 0.4268], [18.713, 0.4759])
273
277
 
274
278
  # Apply material to object
@@ -84,8 +84,8 @@ background = rd.ObjBckgCF(quadrupole_field)
84
84
 
85
85
  # Create magnetizable object
86
86
  sphere = rd.ObjRecMag([0, 0, 0], [10, 10, 10])
87
- # Apply linear isotropic material (μr = 1000)
88
- mat = rd.MatLin(999) # chi = mu_r - 1
87
+ # Apply linear isotropic material (mu_r = 1000)
88
+ mat = rd.MatLin(1000) # relative permeability
89
89
  rd.MatApl(sphere, mat)
90
90
  # Or use saturating material (Steel37)
91
91
  # mat = rd.MatSatIsoFrm([1596.3, 1.1488], [133.11, 0.4268], [18.713, 0.4759])
@@ -87,9 +87,8 @@ for mu_r in permeability_values:
87
87
  cube = rd.ObjRecMag([0, 0, 0], [size, size, size])
88
88
 
89
89
  # Use linear material with specified permeability
90
- # MatLin(ksi): defines isotropic linear material
91
- # For isotropic material: ksi = chi = mu_r - 1
92
- mat = rd.MatLin(chi) # Isotropic linear material
90
+ # MatLin(mu_r): defines isotropic linear material
91
+ mat = rd.MatLin(mu_r) # Isotropic linear material
93
92
  rd.MatApl(cube, mat)
94
93
  print(f" Created {size}x{size}x{size} mm cube with linear material (mu_r={mu_r}, chi={chi})")
95
94
 
@@ -177,9 +177,9 @@ print(f"\n[Step 3] Applying Material and Background Field")
177
177
  print("-" * 70)
178
178
 
179
179
  # Apply linear magnetic material
180
- mat = rd.MatLin(chi)
180
+ mat = rd.MatLin(mu_r) # relative permeability
181
181
  rd.MatApl(sphere, mat)
182
- print(f" Material applied: mu_r = {mu_r}, chi = {chi}")
182
+ print(f" Material applied: mu_r = {mu_r}")
183
183
 
184
184
  # Create quadrupole background field using ObjBckgCF
185
185
  def quadrupole_field_callback(gradient):