struphy 2.1.1__tar.gz → 2.3.0__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 (300) hide show
  1. {struphy-2.1.1 → struphy-2.3.0}/LICENSE +1 -1
  2. {struphy-2.1.1/src/struphy.egg-info → struphy-2.3.0}/PKG-INFO +28 -26
  3. {struphy-2.1.1 → struphy-2.3.0}/pyproject.toml +28 -26
  4. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/bsplines/bsplines.py +1 -1
  5. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/bsplines/bsplines_kernels.py +0 -1
  6. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/bsplines/evaluation_kernels_1d.py +1 -1
  7. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/bsplines/evaluation_kernels_3d.py +164 -12
  8. struphy-2.3.0/src/struphy/bsplines/tests/test_bsplines_kernels.py +197 -0
  9. struphy-2.3.0/src/struphy/bsplines/tests/test_eval_spline_mpi.py +555 -0
  10. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/console/compile.py +1 -1
  11. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/console/main.py +47 -22
  12. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/console/run.py +42 -54
  13. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/console/test.py +3 -28
  14. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/diagnostics/console_diagn.py +42 -7
  15. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/diagnostics/diagn_tools.py +3 -8
  16. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/examples/_draw_parallel.py +1 -1
  17. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/basis_projection_ops.py +157 -99
  18. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/linear_operators.py +1 -0
  19. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/mass.py +561 -266
  20. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/mass_kernels.py +247 -14
  21. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/preconditioner.py +421 -18
  22. struphy-2.3.0/src/struphy/feec/projectors.py +662 -0
  23. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/psydac_derham.py +690 -244
  24. struphy-2.1.1/src/struphy/bsplines/tests/test_eval_spline_mpi.py → struphy-2.3.0/src/struphy/feec/tests/test_eval_field.py +29 -148
  25. struphy-2.3.0/src/struphy/feec/tests/test_field_init.py +909 -0
  26. struphy-2.3.0/src/struphy/feec/tests/test_l2_projectors.py +259 -0
  27. struphy-2.3.0/src/struphy/feec/tests/test_lowdim_nel_is_1.py +290 -0
  28. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/tests/test_mass_matrices.py +44 -7
  29. struphy-2.3.0/src/struphy/feec/variational_utilities.py +207 -0
  30. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/mhd_equil/base.py +94 -85
  31. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/mhd_equil/equils.py +103 -32
  32. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/tests/test_gvec_equil.py +1 -1
  33. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/tests/test_mhd_equils.py +186 -186
  34. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/geometry/base.py +47 -63
  35. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/geometry/domains.py +14 -14
  36. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/geometry/tests/test_domain.py +162 -162
  37. struphy-2.3.0/src/struphy/initial/perturbations.py +655 -0
  38. struphy-2.3.0/src/struphy/initial/tests/test_init_perturbations.py +339 -0
  39. struphy-2.3.0/src/struphy/initial/utilities.py +74 -0
  40. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/longer_examples/params_TAE_tokamak.yml +0 -1
  41. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/longer_examples/params_hybridmhdvlasovcc.yml +2 -3
  42. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/longer_examples/params_hybridmhdvlasovpc.yml +3 -4
  43. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/longer_examples/params_linearextendedmhd.yml +1 -1
  44. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/longer_examples/params_linvlasovmaxwell_landau.yml +11 -30
  45. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/longer_examples/params_linvlasovmaxwell_streaming_weibel.yml +2 -24
  46. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/longer_examples/params_linvlasovmaxwell_weibel.yml +11 -30
  47. struphy-2.3.0/src/struphy/io/inp/parameters.yml +109 -0
  48. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/tutorials/params_02.yml +11 -27
  49. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/tutorials/params_03.yml +9 -10
  50. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/tutorials/params_04a.yml +6 -5
  51. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/tutorials/params_04b.yml +7 -9
  52. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/tutorials/params_05a.yml +6 -16
  53. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/tutorials/params_05b.yml +6 -18
  54. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/setup.py +25 -46
  55. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/kinetic_background/base.py +63 -14
  56. struphy-2.3.0/src/struphy/kinetic_background/maxwellians.py +646 -0
  57. struphy-2.3.0/src/struphy/kinetic_background/tests/test_maxwellians.py +1550 -0
  58. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/linear_algebra/schur_solver.py +4 -0
  59. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/main.py +2 -1
  60. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/base.py +405 -273
  61. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/fluid.py +192 -17
  62. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/hybrid.py +59 -81
  63. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/kinetic.py +662 -250
  64. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/tests/test_fluid_models.py +3 -3
  65. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/tests/test_hybrid_models.py +1 -1
  66. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/tests/test_kinetic_models.py +4 -4
  67. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/tests/test_toy_models.py +4 -4
  68. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/tests/test_xxpproc.py +11 -12
  69. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/tests/util.py +14 -0
  70. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/models/toy.py +323 -36
  71. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/accumulation/accum_kernels.py +19 -86
  72. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/accumulation/accum_kernels_gc.py +336 -194
  73. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/accumulation/particle_to_mat_kernels.py +113 -123
  74. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/accumulation/particles_to_grid.py +70 -21
  75. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/base.py +248 -147
  76. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/particles.py +80 -85
  77. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/pushing/pusher_kernels.py +10 -6
  78. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/pushing/pusher_kernels_gc.py +33 -18
  79. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_accum_vec_H1.py +6 -7
  80. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_accumulation.py +1 -1
  81. struphy-2.3.0/src/struphy/pic/tests/test_binning.py +638 -0
  82. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_draw_parallel.py +28 -25
  83. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pushers.py +14 -34
  84. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/utilities_kernels.py +65 -16
  85. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/polar/tests/test_legacy_polar_splines.py +4 -4
  86. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/polar/tests/test_polar.py +16 -16
  87. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/post_processing/post_processing_tools.py +7 -7
  88. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/propagators/base.py +16 -0
  89. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/propagators/propagators_coupling.py +146 -203
  90. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/propagators/propagators_fields.py +2076 -439
  91. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/propagators/propagators_markers.py +4 -5
  92. struphy-2.3.0/src/struphy/propagators/tests/test_gyrokinetic_poisson.py +587 -0
  93. struphy-2.3.0/src/struphy/propagators/tests/test_poisson.py +430 -0
  94. struphy-2.1.1/src/struphy/psydac-0.1.7-py3-none-any.whl → struphy-2.3.0/src/struphy/psydac-0.1.12-py3-none-any.whl +0 -0
  95. struphy-2.3.0/src/struphy/tutorials/tests/__init__.py +0 -0
  96. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/tutorials/tests/test_tutorials.py +1 -1
  97. struphy-2.3.0/src/struphy/tutorials/utilities.py +12 -0
  98. {struphy-2.1.1 → struphy-2.3.0/src/struphy.egg-info}/PKG-INFO +28 -26
  99. {struphy-2.1.1 → struphy-2.3.0}/src/struphy.egg-info/SOURCES.txt +14 -7
  100. struphy-2.3.0/src/struphy.egg-info/requires.txt +26 -0
  101. struphy-2.1.1/src/struphy/bsplines/tests/test_bsplines_kernels.py +0 -220
  102. struphy-2.1.1/src/struphy/feec/geom_projectors.py +0 -1024
  103. struphy-2.1.1/src/struphy/feec/projectors.py +0 -192
  104. struphy-2.1.1/src/struphy/feec/tests/test_l2_projectors.py +0 -157
  105. struphy-2.1.1/src/struphy/feec/tests/test_noise_init.py +0 -54
  106. struphy-2.1.1/src/struphy/fields_background/electric_equil/analytical.py +0 -24
  107. struphy-2.1.1/src/struphy/fields_background/electric_equil/base.py +0 -60
  108. struphy-2.1.1/src/struphy/initial/perturbations.py +0 -327
  109. struphy-2.1.1/src/struphy/io/inp/parameters.yml +0 -131
  110. struphy-2.1.1/src/struphy/kinetic_background/maxwellians.py +0 -831
  111. struphy-2.1.1/src/struphy/propagators/tests/test_fields_propagators.py +0 -95
  112. struphy-2.1.1/src/struphy.egg-info/requires.txt +0 -24
  113. {struphy-2.1.1 → struphy-2.3.0}/README.md +0 -0
  114. {struphy-2.1.1 → struphy-2.3.0}/setup.cfg +0 -0
  115. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/__init__.py +0 -0
  116. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/bsplines/__init__.py +0 -0
  117. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/bsplines/evaluation_kernels_2d.py +0 -0
  118. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/bsplines/shapefunc_kernels.py +0 -0
  119. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/bsplines/tests/__init__.py +0 -0
  120. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/compile_struphy.mk +0 -0
  121. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/conftest.py +0 -0
  122. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/console/__init__.py +0 -0
  123. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/console/params.py +0 -0
  124. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/console/pproc.py +0 -0
  125. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/console/profile.py +0 -0
  126. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/console/units.py +0 -0
  127. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/dependencies.py +0 -0
  128. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/diagnostics/__init__.py +0 -0
  129. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/diagnostics/continuous_spectra.py +0 -0
  130. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/diagnostics/paraview/__init__.py +0 -0
  131. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/diagnostics/paraview/mesh_creator.py +0 -0
  132. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/diagnostics/paraview/vtk_writer.py +0 -0
  133. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/dispersion_relations/__init__.py +0 -0
  134. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/dispersion_relations/analytic.py +0 -0
  135. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/dispersion_relations/base.py +0 -0
  136. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/__init__.py +0 -0
  137. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/derivatives.py +0 -0
  138. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/kernels_2d.py +0 -0
  139. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/kernels_3d.py +0 -0
  140. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/kernels_projectors_global.py +0 -0
  141. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/kernels_projectors_global_mhd.py +0 -0
  142. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/MHD_eigenvalues_cylinder_1D.py +0 -0
  143. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/__init__.py +0 -0
  144. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/__init__.py +0 -0
  145. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/control_variate.py +0 -0
  146. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/kernels_control_variate.py +0 -0
  147. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/kinetic_extended/__init__.py +0 -0
  148. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/kinetic_extended/fB_massless_control_variate.py +0 -0
  149. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/kinetic_extended/fB_massless_kernels_control_variate.py +0 -0
  150. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/kinetic_extended/fnB_massless_control_variate.py +0 -0
  151. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/kinetic_extended/fnB_massless_cv_kernel_2.py +0 -0
  152. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/kinetic_extended/fnB_massless_kernels_control_variate.py +0 -0
  153. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/kinetic_extended/massless_control_variate.py +0 -0
  154. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/kinetic_extended/massless_cvker.py +0 -0
  155. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/control_variates/kinetic_extended/massless_kernels_control_variate.py +0 -0
  156. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/emw_operators.py +0 -0
  157. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/inner_products_1d.py +0 -0
  158. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/inner_products_2d.py +0 -0
  159. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/inner_products_3d.py +0 -0
  160. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/l2_error_1d.py +0 -0
  161. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/l2_error_2d.py +0 -0
  162. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/l2_error_3d.py +0 -0
  163. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/mass_matrices_3d_pre.py +0 -0
  164. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/massless_operators/__init__.py +0 -0
  165. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/massless_operators/fB_arrays.py +0 -0
  166. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/massless_operators/fB_bb_kernel.py +0 -0
  167. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/massless_operators/fB_bv_kernel.py +0 -0
  168. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/massless_operators/fB_massless_linear_operators.py +0 -0
  169. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/massless_operators/fB_vv_kernel.py +0 -0
  170. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/mhd_operators_MF.py +0 -0
  171. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/__init__.py +0 -0
  172. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/pro_local/__init__.py +0 -0
  173. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/pro_local/kernels_projectors_local.py +0 -0
  174. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/pro_local/kernels_projectors_local_mhd.py +0 -0
  175. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/pro_local/mhd_operators_3d_local.py +0 -0
  176. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/pro_local/projectors_local.py +0 -0
  177. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/shape_pro_local/__init__.py +0 -0
  178. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/shape_pro_local/shape_L2_projector_kernel.py +0 -0
  179. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/shape_pro_local/shape_function_projectors_L2.py +0 -0
  180. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/shape_pro_local/shape_function_projectors_local.py +0 -0
  181. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/legacy/projectors_local/shape_pro_local/shape_local_projector_kernel.py +0 -0
  182. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/mass_matrices_1d.py +0 -0
  183. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/mass_matrices_2d.py +0 -0
  184. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/mass_matrices_3d.py +0 -0
  185. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/mhd_axisymmetric_main.py +0 -0
  186. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/mhd_axisymmetric_pproc.py +0 -0
  187. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/mhd_operators.py +0 -0
  188. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/mhd_operators_core.py +0 -0
  189. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/projectors_global.py +0 -0
  190. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/spline_space.py +0 -0
  191. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/tests/__init__.py +0 -0
  192. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/eigenvalue_solvers/tests/test_legacy_mhd_projectors.py +0 -0
  193. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/__init__.py +0 -0
  194. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/banded_to_stencil_kernels.py +0 -0
  195. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/basis_projection_kernels.py +0 -0
  196. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/tests/__init__.py +0 -0
  197. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/tests/test_basis_operators.py +0 -0
  198. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/tests/test_basis_ops.py +0 -0
  199. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/tests/test_derham.py +0 -0
  200. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/tests/test_toarray_struphy.py +0 -0
  201. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/tests/test_tosparse_struphy.py +0 -0
  202. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/tests/xx_test_preconds.py +0 -0
  203. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/utilities.py +0 -0
  204. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/feec/utilities_kernels.py +0 -0
  205. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/__init__.py +0 -0
  206. {struphy-2.1.1/src/struphy/fields_background/electric_equil → struphy-2.3.0/src/struphy/fields_background/mhd_equil}/__init__.py +0 -0
  207. {struphy-2.1.1/src/struphy/fields_background/mhd_equil → struphy-2.3.0/src/struphy/fields_background/mhd_equil/eqdsk}/__init__.py +0 -0
  208. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/mhd_equil/eqdsk/data/AUGNLED_g031213.00830.high +0 -0
  209. {struphy-2.1.1/src/struphy/fields_background/mhd_equil/eqdsk → struphy-2.3.0/src/struphy/fields_background/mhd_equil/eqdsk/data}/__init__.py +0 -0
  210. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/mhd_equil/eqdsk/readeqdsk.py +0 -0
  211. {struphy-2.1.1/src/struphy/fields_background/mhd_equil/eqdsk/data → struphy-2.3.0/src/struphy/fields_background/mhd_equil/gvec}/__init__.py +0 -0
  212. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/mhd_equil/gvec/ellipstell_v2/newBC_E1D6_M6N6/GVEC_ELLIPSTELL_V2_State_0000_00200000.dat +0 -0
  213. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/mhd_equil/gvec/ellipstell_v2/newBC_E1D6_M6N6/parameter.ini +0 -0
  214. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/mhd_equil/gvec/ellipstell_v2/newBC_E4D6_M6N6/GVEC_ELLIPSTELL_V2_State_0000_00200000.dat +0 -0
  215. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/mhd_equil/gvec/ellipstell_v2/newBC_E4D6_M6N6/parameter.ini +0 -0
  216. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/mhd_equil/gvec/ellipstell_v2/oldBC_E40D5M6N6/GVEC_ELLIPSTELL_V2_State_0000_00200000.dat +0 -0
  217. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/mhd_equil/gvec/ellipstell_v2/oldBC_E40D5M6N6/parameter.ini +0 -0
  218. {struphy-2.1.1/src/struphy/fields_background/mhd_equil/gvec → struphy-2.3.0/src/struphy/fields_background/mhd_equil/gvec/output}/__init__.py +0 -0
  219. {struphy-2.1.1/src/struphy/fields_background/mhd_equil/gvec/output → struphy-2.3.0/src/struphy/fields_background/mhd_equil/gvec/output/vtk}/__init__.py +0 -0
  220. {struphy-2.1.1/src/struphy/fields_background/mhd_equil/gvec/output/vtk → struphy-2.3.0/src/struphy/fields_background/mhd_equil/vmec}/__init__.py +0 -0
  221. {struphy-2.1.1/src/struphy/fields_background/mhd_equil/vmec → struphy-2.3.0/src/struphy/fields_background/tests}/__init__.py +0 -0
  222. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/fields_background/tests/test_numerical_mhd_equil.py +0 -0
  223. {struphy-2.1.1/src/struphy/fields_background/tests → struphy-2.3.0/src/struphy/geometry}/__init__.py +0 -0
  224. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/geometry/evaluation_kernels.py +0 -0
  225. {struphy-2.1.1/src/struphy/geometry → struphy-2.3.0/src/struphy/geometry/map_coef}/__init__.py +0 -0
  226. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/geometry/mappings_kernels.py +0 -0
  227. {struphy-2.1.1/src/struphy/geometry/map_coef → struphy-2.3.0/src/struphy/geometry/tests}/__init__.py +0 -0
  228. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/geometry/transform_kernels.py +0 -0
  229. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/geometry/utilities.py +0 -0
  230. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/geometry/utilities_kernels.py +0 -0
  231. {struphy-2.1.1/src/struphy/geometry/tests → struphy-2.3.0/src/struphy/initial}/__init__.py +0 -0
  232. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/initial/eigenfunctions.py +0 -0
  233. {struphy-2.1.1/src/struphy/initial → struphy-2.3.0/src/struphy/initial/tests}/__init__.py +0 -0
  234. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/__init__.py +0 -0
  235. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/batch/batch_cobra.sh +0 -0
  236. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/batch/p_016.sh +0 -0
  237. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/batch/p_032.sh +0 -0
  238. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/batch/p_064.sh +0 -0
  239. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/batch/p_128.sh +0 -0
  240. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/batch/p_256.sh +0 -0
  241. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/batch/p_512.sh +0 -0
  242. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/inp/__init__.py +0 -0
  243. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/out/__init__.py +0 -0
  244. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/io/output_handling.py +0 -0
  245. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/kinetic_background/__init__.py +0 -0
  246. {struphy-2.1.1/src/struphy/linear_algebra → struphy-2.3.0/src/struphy/kinetic_background/tests}/__init__.py +0 -0
  247. {struphy-2.1.1/src/struphy/linear_algebra/tests → struphy-2.3.0/src/struphy/linear_algebra}/__init__.py +0 -0
  248. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/linear_algebra/linalg_kernels.py +0 -0
  249. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/linear_algebra/linalg_kron.py +0 -0
  250. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/linear_algebra/stencil_dot_kernels.py +0 -0
  251. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/linear_algebra/stencil_transpose_kernels.py +0 -0
  252. {struphy-2.1.1/src/struphy/models → struphy-2.3.0/src/struphy/linear_algebra/tests}/__init__.py +0 -0
  253. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/linear_algebra/tests/test_stencil_dot_kernels.py +0 -0
  254. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/linear_algebra/tests/test_stencil_transpose_kernels.py +0 -0
  255. {struphy-2.1.1/src/struphy/models/tests → struphy-2.3.0/src/struphy/models}/__init__.py +0 -0
  256. {struphy-2.1.1/src/struphy/pic → struphy-2.3.0/src/struphy/models/tests}/__init__.py +0 -0
  257. {struphy-2.1.1/src/struphy/pic/accumulation → struphy-2.3.0/src/struphy/pic}/__init__.py +0 -0
  258. {struphy-2.1.1/src/struphy/pic/pushing → struphy-2.3.0/src/struphy/pic/accumulation}/__init__.py +0 -0
  259. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/accumulation/filler_kernels.py +0 -0
  260. {struphy-2.1.1/src/struphy/pic/tests → struphy-2.3.0/src/struphy/pic/pushing}/__init__.py +0 -0
  261. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/pushing/eval_kernels_gc.py +0 -0
  262. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/pushing/pusher.py +0 -0
  263. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/pushing/pusher_utilities_kernels.py +0 -0
  264. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/sampling_kernels.py +0 -0
  265. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/sobol_seq.py +0 -0
  266. {struphy-2.1.1/src/struphy/pic/tests/test_pic_legacy_files → struphy-2.3.0/src/struphy/pic/tests}/__init__.py +0 -0
  267. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_mat_vec_filler.py +0 -0
  268. {struphy-2.1.1/src/struphy/polar → struphy-2.3.0/src/struphy/pic/tests/test_pic_legacy_files}/__init__.py +0 -0
  269. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pic_legacy_files/accumulation.py +0 -0
  270. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pic_legacy_files/accumulation_kernels_3d.py +0 -0
  271. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pic_legacy_files/mappings_3d.py +0 -0
  272. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pic_legacy_files/mappings_3d_fast.py +0 -0
  273. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pic_legacy_files/pusher.py +0 -0
  274. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pic_legacy_files/pusher_pos.py +0 -0
  275. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pic_legacy_files/pusher_vel_2d.py +0 -0
  276. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pic_legacy_files/pusher_vel_3d.py +0 -0
  277. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pic_legacy_files/spline_evaluation_2d.py +0 -0
  278. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/tests/test_pic_legacy_files/spline_evaluation_3d.py +0 -0
  279. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/pic/utilities.py +0 -0
  280. {struphy-2.1.1/src/struphy/polar/tests → struphy-2.3.0/src/struphy/polar}/__init__.py +0 -0
  281. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/polar/basic.py +0 -0
  282. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/polar/extraction_operators.py +0 -0
  283. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/polar/linear_operators.py +0 -0
  284. {struphy-2.1.1/src/struphy/post_processing → struphy-2.3.0/src/struphy/polar/tests}/__init__.py +0 -0
  285. {struphy-2.1.1/src/struphy/post_processing/tests → struphy-2.3.0/src/struphy/post_processing}/__init__.py +0 -0
  286. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/post_processing/cprofile_analyser.py +0 -0
  287. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/post_processing/pproc_struphy.py +0 -0
  288. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/post_processing/profile_struphy.py +0 -0
  289. {struphy-2.1.1/src/struphy/propagators → struphy-2.3.0/src/struphy/post_processing/tests}/__init__.py +0 -0
  290. {struphy-2.1.1/src/struphy/propagators/tests → struphy-2.3.0/src/struphy/propagators}/__init__.py +0 -0
  291. {struphy-2.1.1/src/struphy/tutorials → struphy-2.3.0/src/struphy/propagators/tests}/__init__.py +0 -0
  292. {struphy-2.1.1/src/struphy/tutorials/longer_examples → struphy-2.3.0/src/struphy/tutorials}/__init__.py +0 -0
  293. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/tutorials/longer_examples/TAE_tokamak.py +0 -0
  294. {struphy-2.1.1/src/struphy/tutorials/tests → struphy-2.3.0/src/struphy/tutorials/longer_examples}/__init__.py +0 -0
  295. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/tutorials/longer_examples/linearextendedmhd.py +0 -0
  296. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/tutorials/longer_examples/linearmhdvlasov_cc.py +0 -0
  297. {struphy-2.1.1 → struphy-2.3.0}/src/struphy/tutorials/longer_examples/linearmhdvlasov_pc.py +0 -0
  298. {struphy-2.1.1 → struphy-2.3.0}/src/struphy.egg-info/dependency_links.txt +0 -0
  299. {struphy-2.1.1 → struphy-2.3.0}/src/struphy.egg-info/entry_points.txt +0 -0
  300. {struphy-2.1.1 → struphy-2.3.0}/src/struphy.egg-info/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
- Copyright (c) 2019-2023, Struphy developers, Max Planck Institute for Plasma Physics
1
+ Copyright (c) 2019-2024, Struphy developers, Max Planck Institute for Plasma Physics
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
4
4
  associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: struphy
3
- Version: 2.1.1
3
+ Version: 2.3.0
4
4
  Summary: Multi-model plasma physics package
5
5
  Author: Max Planck Institute for Plasma Physics
6
6
  Author-email: stefan.possanner@ipp.mpg.de, eric.sonnendruecker@ipp.mpg.de
7
- License: Copyright (c) 2019-2023, Struphy developers, Max Planck Institute for Plasma Physics
7
+ License: Copyright (c) 2019-2024, Struphy developers, Max Planck Institute for Plasma Physics
8
8
 
9
9
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
10
10
  associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -30,30 +30,32 @@ Classifier: Programming Language :: Python :: 3
30
30
  Requires-Python: <3.12,>=3.7
31
31
  Description-Content-Type: text/markdown
32
32
  License-File: LICENSE
33
- Requires-Dist: numpy
34
- Requires-Dist: scipy
35
- Requires-Dist: mpi4py
36
- Requires-Dist: h5py
37
- Requires-Dist: matplotlib
38
- Requires-Dist: PyYAML
39
- Requires-Dist: vtk
40
- Requires-Dist: pytest
41
- Requires-Dist: pytest-mpi
42
- Requires-Dist: sphinx
43
- Requires-Dist: sphinxcontrib-napoleon
44
- Requires-Dist: pydata-sphinx-theme
45
- Requires-Dist: nbsphinx
46
- Requires-Dist: notebook
47
- Requires-Dist: m2r2
48
- Requires-Dist: mistune
49
- Requires-Dist: docutils
50
- Requires-Dist: wheel
51
- Requires-Dist: tqdm
52
- Requires-Dist: argcomplete
53
- Requires-Dist: ipyparallel
54
- Requires-Dist: pytest-monitor
55
- Requires-Dist: pyccel>=1.10.0
56
- Requires-Dist: gvec-to-python
33
+ Requires-Dist: PyYAML==6.0.1
34
+ Requires-Dist: argcomplete==3.2.3
35
+ Requires-Dist: docutils==0.20.1
36
+ Requires-Dist: gvec-to-python==1.2.1
37
+ Requires-Dist: h5py==3.10.0
38
+ Requires-Dist: ipyparallel==8.7.0
39
+ Requires-Dist: lxml_html_clean==0.1.0
40
+ Requires-Dist: m2r2==0.3.3.post2
41
+ Requires-Dist: matplotlib==3.8.3
42
+ Requires-Dist: mistune==0.8.4
43
+ Requires-Dist: mpi4py==3.1.5
44
+ Requires-Dist: myst-parser==2.0.0
45
+ Requires-Dist: nbsphinx==0.9.3
46
+ Requires-Dist: notebook==7.1.2
47
+ Requires-Dist: numpy==1.24.4
48
+ Requires-Dist: pyccel==1.11.2
49
+ Requires-Dist: pydata-sphinx-theme==0.15.2
50
+ Requires-Dist: pytest==8.1.1
51
+ Requires-Dist: pytest-monitor==1.6.6
52
+ Requires-Dist: pytest-mpi==0.6
53
+ Requires-Dist: scipy==1.12.0
54
+ Requires-Dist: Sphinx==7.2.6
55
+ Requires-Dist: sphinxcontrib-napoleon==0.7
56
+ Requires-Dist: tqdm==4.66.2
57
+ Requires-Dist: vtk==9.3.0
58
+ Requires-Dist: wheel==0.43.0
57
59
 
58
60
  # Struphy - Structure-preserving hybrid codes
59
61
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "struphy"
7
- version = "2.1.1"
7
+ version = "2.3.0"
8
8
  readme = "README.md"
9
9
  requires-python = ">=3.7, <3.12"
10
10
  license = {file = "LICENSE"}
@@ -19,30 +19,32 @@ classifiers = [
19
19
  "Programming Language :: Python :: 3",
20
20
  ]
21
21
  dependencies = [
22
- 'numpy',
23
- 'scipy',
24
- 'mpi4py',
25
- 'h5py',
26
- 'matplotlib',
27
- 'PyYAML',
28
- 'vtk',
29
- 'pytest',
30
- 'pytest-mpi',
31
- 'sphinx',
32
- 'sphinxcontrib-napoleon',
33
- 'pydata-sphinx-theme',
34
- 'nbsphinx',
35
- 'notebook',
36
- 'm2r2',
37
- 'mistune',
38
- 'docutils',
39
- 'wheel',
40
- 'tqdm',
41
- 'argcomplete',
42
- 'ipyparallel',
43
- 'pytest-monitor',
44
- 'pyccel>=1.10.0',
45
- 'gvec-to-python',
22
+ 'PyYAML==6.0.1',
23
+ 'argcomplete==3.2.3',
24
+ 'docutils==0.20.1',
25
+ 'gvec-to-python==1.2.1',
26
+ 'h5py==3.10.0',
27
+ 'ipyparallel==8.7.0',
28
+ 'lxml_html_clean==0.1.0',
29
+ 'm2r2==0.3.3.post2',
30
+ 'matplotlib==3.8.3',
31
+ 'mistune==0.8.4',
32
+ 'mpi4py==3.1.5',
33
+ 'myst-parser==2.0.0',
34
+ 'nbsphinx==0.9.3',
35
+ 'notebook==7.1.2',
36
+ 'numpy==1.24.4',
37
+ 'pyccel==1.11.2',
38
+ 'pydata-sphinx-theme==0.15.2',
39
+ 'pytest==8.1.1',
40
+ 'pytest-monitor==1.6.6',
41
+ 'pytest-mpi==0.6',
42
+ 'scipy==1.12.0',
43
+ 'Sphinx==7.2.6',
44
+ 'sphinxcontrib-napoleon==0.7',
45
+ 'tqdm==4.66.2',
46
+ 'vtk==9.3.0',
47
+ 'wheel==0.43.0',
46
48
  ]
47
49
 
48
50
  [project.urls]
@@ -78,5 +80,5 @@ struphy = "struphy.console.main:struphy"
78
80
  ]
79
81
 
80
82
  struphy = ['compile_struphy.mk',
81
- 'psydac-0.1.7-py3-none-any.whl',
83
+ 'psydac-0.1.12-py3-none-any.whl',
82
84
  ]
@@ -373,7 +373,7 @@ def collocation_matrix(knots, degree, xgrid, periodic, normalize=False):
373
373
  # ==============================================================================
374
374
  def histopolation_matrix(knots, degree, xgrid, periodic):
375
375
  """
376
- Computes the histopolation matrix $H_ij = int_x_i^x_{i+1} D_j(x) dx$ of the M_splines.
376
+ Computes the histopolation matrix $H_ij = int_{x_i}^x_{i+1} D_j(x) dx$ of the M_splines.
377
377
 
378
378
  Parameters
379
379
  ----------
@@ -56,7 +56,6 @@ def find_span(t: 'float[:]', p: 'int', eta: 'float') -> 'int':
56
56
 
57
57
  # Knot index at left/right boundary
58
58
  low = p
59
- high = 0
60
59
  high = len(t) - 1 - p
61
60
 
62
61
  # Check if point is exactly on left/right boundary, or outside domain
@@ -124,7 +124,7 @@ def evaluate(kind1: int, t1: 'float[:]', p1: int, ind1: 'int[:,:]', coeff: 'floa
124
124
  @pure
125
125
  def evaluate_vector(t1: 'float[:]', p1: int, ind1: 'int[:,:]', coeff: 'float[:]', eta1: 'float[:]', spline_values: 'float[:]', kind: int):
126
126
  """
127
- Vector evaluation of a tensor-product spline.
127
+ Vector evaluation of a uni-variate spline.
128
128
 
129
129
  Parameters
130
130
  ----------
@@ -24,10 +24,12 @@ from numpy import empty, zeros
24
24
 
25
25
  import struphy.bsplines.bsplines_kernels as bsplines_kernels
26
26
 
27
-
27
+ #################################
28
+ ### Single process evaluation ###
29
+ #################################
28
30
  def evaluation_kernel_3d(p1: int, p2: int, p3: int, basis1: 'float[:]', basis2: 'float[:]', basis3: 'float[:]', ind1: 'int[:]', ind2: 'int[:]', ind3: 'int[:]', coeff: 'float[:,:,:]') -> float:
29
31
  """
30
- Summing non-zero contributions of a spline function.
32
+ Summing non-zero contributions of a spline function (serial, needs global arrays).
31
33
 
32
34
  Parameters
33
35
  ----------
@@ -64,10 +66,10 @@ def evaluation_kernel_3d(p1: int, p2: int, p3: int, basis1: 'float[:]', basis2:
64
66
  return spline_value
65
67
 
66
68
 
67
- @stack_array('tmp1', 'tmp2', 'tmp3')
69
+ @stack_array('b1', 'b2', 'b3', 'bl1', 'bl2', 'bl3', 'br1', 'br2', 'br3', 'tmp1', 'tmp2', 'tmp3')
68
70
  def evaluate_3d(kind1: int, kind2: int, kind3: int, t1: 'float[:]', t2: 'float[:]', t3: 'float[:]', p1: int, p2: int, p3: int, ind1: 'int[:,:]', ind2: 'int[:,:]', ind3: 'int[:,:]', coeff: 'float[:,:,:]', eta1: float, eta2: float, eta3: float) -> float:
69
71
  """
70
- Point-wise evaluation of a tensor-product spline.
72
+ Point-wise evaluation of a tensor-product spline (serial, needs global arrays).
71
73
 
72
74
  Parameters
73
75
  ----------
@@ -156,7 +158,7 @@ def evaluate_3d(kind1: int, kind2: int, kind3: int, t1: 'float[:]', t2: 'float[:
156
158
 
157
159
  def evaluate_tensor_product(t1: 'float[:]', t2: 'float[:]', t3: 'float[:]', p1: int, p2: int, p3: int, ind1: 'int[:,:]', ind2: 'int[:,:]', ind3: 'int[:,:]', coeff: 'float[:,:,:]', eta1: 'float[:]', eta2: 'float[:]', eta3: 'float[:]', spline_values: 'float[:,:,:]', kind: int):
158
160
  """
159
- Tensor-product evaluation of a tensor-product spline.
161
+ Tensor-product evaluation of a tensor-product spline (serial, needs global arrays).
160
162
 
161
163
  Parameters
162
164
  ----------
@@ -234,7 +236,7 @@ def evaluate_tensor_product(t1: 'float[:]', t2: 'float[:]', t3: 'float[:]', p1:
234
236
 
235
237
  def evaluate_matrix(t1: 'float[:]', t2: 'float[:]', t3: 'float[:]', p1: int, p2: int, p3: int, ind1: 'int[:,:]', ind2: 'int[:,:]', ind3: 'int[:,:]', coeff: 'float[:,:,:]', eta1: 'float[:,:,:]', eta2: 'float[:,:,:]', eta3: 'float[:,:,:]', spline_values: 'float[:,:,:]', kind: int):
236
238
  """
237
- General evaluation of a tensor-product spline.
239
+ General evaluation of a tensor-product spline (serial, needs global arrays).
238
240
 
239
241
  Parameters
240
242
  ----------
@@ -318,7 +320,7 @@ def evaluate_matrix(t1: 'float[:]', t2: 'float[:]', t3: 'float[:]', p1: int, p2
318
320
 
319
321
  def evaluate_sparse(t1: 'float[:]', t2: 'float[:]', t3: 'float[:]', p1: int, p2: int, p3: int, ind1: 'int[:,:]', ind2: 'int[:,:]', ind3: 'int[:,:]', coeff: 'float[:,:,:]', eta1: 'float[:,:,:]', eta2: 'float[:,:,:]', eta3: 'float[:,:,:]', spline_values: 'float[:,:,:]', kind: int):
320
322
  """
321
- Evaluation of a tensor-product spline using sparse meshgrids.
323
+ Evaluation of a tensor-product spline using sparse meshgrids (serial, needs global arrays).
322
324
 
323
325
  Parameters
324
326
  ----------
@@ -399,10 +401,12 @@ def evaluate_sparse(t1: 'float[:]', t2: 'float[:]', t3: 'float[:]', p1: int, p2:
399
401
  spline_values[i1, i2, i3] = evaluate_3d(
400
402
  1, 1, 3, t1, t2, t3, p1, p2, p3, ind1, ind2, ind3, coeff, eta1[i1, 0, 0], eta2[0, i2, 0], eta3[0, 0, i3])
401
403
 
402
-
404
+ ##############################
405
+ ### Distributed evaluation ###
406
+ ##############################
403
407
  def eval_spline_mpi_kernel(p1: 'int', p2: 'int', p3: 'int', basis1: 'float[:]', basis2: 'float[:]', basis3: 'float[:]', span1: 'int', span2: 'int', span3: 'int', _data: 'float[:,:,:]', starts: 'int[:]') -> float:
404
408
  """
405
- Kernel for struphy.feec.basics.spline_evaluation_3d.eval_spline_mpi.
409
+ Summing non-zero contributions of a spline function with distributed memory (domain decomposition).
406
410
 
407
411
  Parameters
408
412
  ----------
@@ -444,7 +448,7 @@ def eval_spline_mpi_kernel(p1: 'int', p2: 'int', p3: 'int', basis1: 'float[:]',
444
448
 
445
449
  def eval_spline_derivative_mpi_kernel(p1: 'int', p2: 'int', p3: 'int', basis1: 'float[:]', basis2: 'float[:]', basis3: 'float[:]', span1: 'int', span2: 'int', span3: 'int', _data: 'float[:,:,:]', starts: 'int[:]', direction: 'int') -> float:
446
450
  """
447
- Kernel for the derivative of a spline in one direction (distributed).
451
+ Kernel for the derivative of a spline in one direction (distributed, domain decomp.).
448
452
 
449
453
  Parameters
450
454
  ----------
@@ -507,6 +511,7 @@ def eval_spline_derivative_mpi_kernel(p1: 'int', p2: 'int', p3: 'int', basis1: '
507
511
  return spline_value
508
512
 
509
513
 
514
+ @stack_array('bn1', 'bn2', 'bn3', 'bd1', 'bd2', 'bd3')
510
515
  def eval_spline_mpi(eta1: float, eta2: float, eta3: float,
511
516
  _data: 'float[:,:,:]', kind: 'int[:]',
512
517
  pn: 'int[:]', tn1: 'float[:]', tn2: 'float[:]', tn3: 'float[:]',
@@ -590,7 +595,7 @@ def eval_spline_mpi_tensor_product(eta1: 'float[:]', eta2: 'float[:]', eta3: 'fl
590
595
  ----------
591
596
  eta1, eta2, eta3 : array[float]
592
597
  Evaluation points as 1d arrays; points not on local process domain must be flagged as -1.
593
- Spline values are obtained as S_ijk = S(eta1[i], eta2[j], eta3[k]).
598
+ The out array is global and contains the spline values as S_ijk = S(eta1[i], eta2[j], eta3[k]).
594
599
 
595
600
  _data : array[float]
596
601
  The spline coefficients c_ijk.
@@ -625,6 +630,153 @@ def eval_spline_mpi_tensor_product(eta1: 'float[:]', eta2: 'float[:]', eta3: 'fl
625
630
  eta1[i], eta2[j], eta3[k], _data, kind, pn, tn1, tn2, tn3, starts)
626
631
 
627
632
 
633
+ @stack_array('bn1', 'bn2', 'bn3', 'bd1', 'bd2', 'bd3')
634
+ def eval_spline_mpi_tensor_product_fast(eta1: 'float[:]', eta2: 'float[:]', eta3: 'float[:]',
635
+ _data: 'float[:,:,:]', kind: 'int[:]',
636
+ pn: 'int[:]', tn1: 'float[:]', tn2: 'float[:]', tn3: 'float[:]',
637
+ starts: 'int[:]', values: 'float[:,:,:]'):
638
+ """
639
+ Tensor-product evaluation of a tensor-product spline, distributed,
640
+ and optimized by computing spans and spline values only once.
641
+
642
+ Parameters
643
+ ----------
644
+ eta1, eta2, eta3 : array[float]
645
+ Evaluation points as 1d arrays; points not on local process domain must be flagged as -1.
646
+ Spline values are obtained as S_ijk = S(eta1[i], eta2[j], eta3[k]).
647
+
648
+ _data : array[float]
649
+ The spline coefficients c_ijk.
650
+
651
+ kind : array[int]
652
+ Kind of 1d basis in each direction: 0 = N-spline, 1 = D-spline.
653
+
654
+ pn : array[int]
655
+ Spline degrees of V0 in each direction.
656
+
657
+ tn1, tn2, tn3 : array[float]
658
+ Knot vectors of V0 in each direction.
659
+
660
+ starts : array[float]
661
+ Start indices of splines on current process.
662
+
663
+ values : array[float]
664
+ Return array for spline values S_ijk = S(eta1[i], eta2[j], eta3[k]).
665
+ """
666
+ # allocate spline values
667
+ bn1 = empty(pn[0] + 1, dtype=float)
668
+ bn2 = empty(pn[1] + 1, dtype=float)
669
+ bn3 = empty(pn[2] + 1, dtype=float)
670
+
671
+ bd1 = empty(pn[0], dtype=float)
672
+ bd2 = empty(pn[1], dtype=float)
673
+ bd3 = empty(pn[2], dtype=float)
674
+
675
+ for i in range(len(eta1)):
676
+ if eta1[i] == -1.:
677
+ continue # point not in process domain
678
+
679
+ span1 = bsplines_kernels.find_span(tn1, pn[0], eta1[i])
680
+ bsplines_kernels.b_d_splines_slim(tn1, pn[0], eta1[i], span1, bn1, bd1)
681
+ if kind[0] == 0:
682
+ b1 = bn1
683
+ else:
684
+ b1 = bd1
685
+
686
+ for j in range(len(eta2)):
687
+ if eta2[j] == -1.:
688
+ continue # point not in process domain
689
+
690
+ span2 = bsplines_kernels.find_span(tn2, pn[1], eta2[j])
691
+ bsplines_kernels.b_d_splines_slim(
692
+ tn2, pn[1], eta2[j], span2, bn2, bd2)
693
+ if kind[1] == 0:
694
+ b2 = bn2
695
+ else:
696
+ b2 = bd2
697
+
698
+ for k in range(len(eta3)):
699
+ if eta3[k] == -1.:
700
+ continue # point not in process domain
701
+
702
+ span3 = bsplines_kernels.find_span(tn3, pn[2], eta3[k])
703
+ bsplines_kernels.b_d_splines_slim(
704
+ tn3, pn[2], eta3[k], span3, bn3, bd3)
705
+ if kind[2] == 0:
706
+ b3 = bn3
707
+ else:
708
+ b3 = bd3
709
+
710
+ values[i, j, k] = eval_spline_mpi_kernel(pn[0] - kind[0],
711
+ pn[1] - kind[1],
712
+ pn[2] - kind[2],
713
+ b1, b2, b3,
714
+ span1, span2, span3,
715
+ _data,
716
+ starts)
717
+
718
+
719
+ @stack_array('b1', 'b2', 'b3')
720
+ def eval_spline_mpi_tensor_product_fixed(span1s: 'int[:]', span2s: 'int[:]', span3s: 'int[:]',
721
+ b1s: 'float[:,:]', b2s: 'float[:,:]', b3s: 'float[:,:]',
722
+ _data: 'float[:,:,:]', kind: 'int[:]', pn: 'int[:]',
723
+ starts: 'int[:]', values: 'float[:,:,:]'):
724
+ """
725
+ Tensor-product evaluation of a tensor-product spline, distributed,
726
+ and optimized for a fixed grid (spans and spline values have been pre-evaluated).
727
+
728
+ Parameters
729
+ ----------
730
+ span1s, span2s, span3s : array[int]
731
+ Knot span indices.
732
+
733
+ b1s, b2s, b3s : array[float]
734
+ Values of p+1 non-zero basis functions at evaluation points.
735
+
736
+ _data : array[float]
737
+ The spline coefficients c_ijk.
738
+
739
+ kind : array[int]
740
+ Kind of 1d basis in each direction: 0 = N-spline, 1 = D-spline.
741
+
742
+ pn : array[int]
743
+ Spline degrees of V0 in each direction.
744
+
745
+ starts : array[float]
746
+ Start indices of splines on current process.
747
+
748
+ values : array[float]
749
+ Return array for spline values S_ijk where ijk are the flattened indices corresponding to spans.
750
+ """
751
+
752
+ # allocate spline values
753
+ b1 = empty(pn[0] - kind[0] + 1, dtype=float)
754
+ b2 = empty(pn[1] - kind[1] + 1, dtype=float)
755
+ b3 = empty(pn[2] - kind[2] + 1, dtype=float)
756
+
757
+ ni = span1s.size
758
+ nj = span2s.size
759
+ nk = span3s.size
760
+
761
+ for i in range(ni):
762
+ span1 = span1s[i]
763
+ b1[:] = b1s[i, :]
764
+ for j in range(nj):
765
+ span2 = span2s[j]
766
+ b2[:] = b2s[j, :]
767
+ for k in range(nk):
768
+ span3 = span3s[k]
769
+ b3[:] = b3s[k, :]
770
+
771
+ values[i, j, k] = eval_spline_mpi_kernel(pn[0] - kind[0],
772
+ pn[1] - kind[1],
773
+ pn[2] - kind[2],
774
+ b1, b2, b3,
775
+ span1, span2, span3,
776
+ _data,
777
+ starts)
778
+
779
+
628
780
  def eval_spline_mpi_matrix(eta1: 'float[:,:,:]', eta2: 'float[:,:,:]', eta3: 'float[:,:,:]',
629
781
  _data: 'float[:,:,:]', kind: 'int[:]',
630
782
  pn: 'int[:]', tn1: 'float[:]', tn2: 'float[:]', tn3: 'float[:]',
@@ -724,4 +876,4 @@ def eval_spline_mpi_sparse_meshgrid(eta1: 'float[:,:,:]', eta2: 'float[:,:,:]',
724
876
  continue # point not in process domain
725
877
 
726
878
  values[i, j, k] = eval_spline_mpi(
727
- eta1[i, 0, 0], eta2[0, j, 0], eta3[0, 0, k], _data, kind, pn, tn1, tn2, tn3, starts)
879
+ eta1[i, 0, 0], eta2[0, j, 0], eta3[0, 0, k], _data, kind, pn, tn1, tn2, tn3, starts)
@@ -0,0 +1,197 @@
1
+ import pytest
2
+ import numpy as np
3
+ from mpi4py import MPI
4
+ import time
5
+
6
+
7
+ @pytest.mark.mpi(min_size=2)
8
+ @pytest.mark.parametrize('Nel', [[8, 9, 10]])
9
+ @pytest.mark.parametrize('p', [[1, 2, 1], [2, 1, 2], [3, 4, 3]])
10
+ @pytest.mark.parametrize('spl_kind', [[False, False, True], [False, True, False], [True, False, False]])
11
+ def test_bsplines_span_and_basis(Nel, p, spl_kind):
12
+ '''
13
+ Compare Struphy and Psydac bsplines kernels for knot spans and basis values computation.
14
+ Print timings.
15
+ '''
16
+
17
+ from struphy.feec.psydac_derham import Derham
18
+
19
+ from struphy.feec.utilities import create_equal_random_arrays as cera
20
+ import struphy.bsplines.bsplines_kernels as bsp
21
+ import psydac.core.bsplines_pyccel as bsp_psy
22
+
23
+ comm = MPI.COMM_WORLD
24
+ assert comm.size >= 2
25
+ rank = comm.Get_rank()
26
+
27
+ # Psydac discrete Derham sequence
28
+ derham = Derham(Nel, p, spl_kind, comm=comm)
29
+
30
+ # knot vectors
31
+ tn1, tn2, tn3 = derham.Vh_fem['0'].knots
32
+ td1, td2, td3 = derham.Vh_fem['3'].knots
33
+
34
+ # Random points in domain of process
35
+ n_pts = 100
36
+ dom = derham.domain_array[rank]
37
+ eta1s = np.random.rand(n_pts)*(dom[1] - dom[0]) + dom[0]
38
+ eta2s = np.random.rand(n_pts)*(dom[4] - dom[3]) + dom[3]
39
+ eta3s = np.random.rand(n_pts)*(dom[7] - dom[6]) + dom[6]
40
+
41
+ # struphy find_span
42
+ t0 = time.time()
43
+ span1s, span2s, span3s = [], [], []
44
+ for eta1, eta2, eta3 in zip(eta1s, eta2s, eta3s):
45
+ span1s += [bsp.find_span(tn1, derham.p[0], eta1)]
46
+ span2s += [bsp.find_span(tn2, derham.p[1], eta2)]
47
+ span3s += [bsp.find_span(tn3, derham.p[2], eta3)]
48
+ t1 = time.time()
49
+ if rank == 0:
50
+ print(f'struphy find_span : {t1 - t0}')
51
+
52
+ # psydac find_span_p
53
+ t0 = time.time()
54
+ span1s_psy, span2s_psy, span3s_psy = [], [], []
55
+ for eta1, eta2, eta3 in zip(eta1s, eta2s, eta3s):
56
+ span1s_psy += [bsp_psy.find_span_p(tn1, derham.p[0], eta1)]
57
+ span2s_psy += [bsp_psy.find_span_p(tn2, derham.p[1], eta2)]
58
+ span3s_psy += [bsp_psy.find_span_p(tn3, derham.p[2], eta3)]
59
+ t1 = time.time()
60
+ if rank == 0:
61
+ print(f'psydac find_span_p : {t1 - t0}')
62
+
63
+ assert np.allclose(span1s, span1s_psy)
64
+ assert np.allclose(span2s, span2s_psy)
65
+ assert np.allclose(span3s, span3s_psy)
66
+
67
+ # allocate tmps
68
+ bn1 = np.empty(derham.p[0] + 1, dtype=float)
69
+ bn2 = np.empty(derham.p[1] + 1, dtype=float)
70
+ bn3 = np.empty(derham.p[2] + 1, dtype=float)
71
+
72
+ bd1 = np.empty(derham.p[0], dtype=float)
73
+ bd2 = np.empty(derham.p[1], dtype=float)
74
+ bd3 = np.empty(derham.p[2], dtype=float)
75
+
76
+ # struphy b_splines_slim
77
+ val1s, val2s, val3s = [], [], []
78
+ t0 = time.time()
79
+ for eta1, eta2, eta3, span1, span2, span3 in zip(eta1s, eta2s, eta3s, span1s, span2s, span3s):
80
+ bsp.b_splines_slim(tn1, derham.p[0], eta1, span1, bn1)
81
+ bsp.b_splines_slim(tn2, derham.p[1], eta2, span2, bn2)
82
+ bsp.b_splines_slim(tn3, derham.p[2], eta3, span3, bn3)
83
+ val1s += [bn1]
84
+ val2s += [bn2]
85
+ val3s += [bn3]
86
+ t1 = time.time()
87
+ if rank == 0:
88
+ print(f'bsp.b_splines_slim : {t1 - t0}')
89
+
90
+ # psydac basis_funs_p
91
+ val1s_psy, val2s_psy, val3s_psy = [], [], []
92
+ t0 = time.time()
93
+ for eta1, eta2, eta3, span1, span2, span3 in zip(eta1s, eta2s, eta3s, span1s, span2s, span3s):
94
+ bsp_psy.basis_funs_p(tn1, derham.p[0], eta1, span1, bn1)
95
+ bsp_psy.basis_funs_p(tn2, derham.p[1], eta2, span2, bn2)
96
+ bsp_psy.basis_funs_p(tn3, derham.p[2], eta3, span3, bn3)
97
+ val1s_psy += [bn1]
98
+ val2s_psy += [bn2]
99
+ val3s_psy += [bn3]
100
+ t1 = time.time()
101
+ if rank == 0:
102
+ print(f'bsp_psy.basis_funs_p for N: {t1 - t0}')
103
+
104
+ # compare
105
+ for val1, val1_psy in zip(val1s, val1s_psy):
106
+ assert np.allclose(val1, val1_psy)
107
+
108
+ for val2, val2_psy in zip(val2s, val2s_psy):
109
+ assert np.allclose(val2, val2_psy)
110
+
111
+ for val3, val3_psy in zip(val3s, val3s_psy):
112
+ assert np.allclose(val3, val3_psy)
113
+
114
+ # struphy b_d_splines_slim
115
+ val1s_n, val2s_n, val3s_n = [], [], []
116
+ val1s_d, val2s_d, val3s_d = [], [], []
117
+ t0 = time.time()
118
+ for eta1, eta2, eta3, span1, span2, span3 in zip(eta1s, eta2s, eta3s, span1s, span2s, span3s):
119
+ bsp.b_d_splines_slim(tn1, derham.p[0], eta1, span1, bn1, bd1)
120
+ bsp.b_d_splines_slim(tn2, derham.p[1], eta2, span2, bn2, bd2)
121
+ bsp.b_d_splines_slim(tn3, derham.p[2], eta3, span3, bn3, bd3)
122
+ val1s_n += [bn1]
123
+ val2s_n += [bn2]
124
+ val3s_n += [bn3]
125
+ val1s_d += [bd1]
126
+ val2s_d += [bd2]
127
+ val3s_d += [bd3]
128
+ t1 = time.time()
129
+ if rank == 0:
130
+ print(f'bsp.b_d_splines_slim : {t1 - t0}')
131
+
132
+ # compare
133
+ for val1, val1_psy in zip(val1s_n, val1s_psy):
134
+ assert np.allclose(val1, val1_psy)
135
+
136
+ for val2, val2_psy in zip(val2s_n, val2s_psy):
137
+ assert np.allclose(val2, val2_psy)
138
+
139
+ for val3, val3_psy in zip(val3s_n, val3s_psy):
140
+ assert np.allclose(val3, val3_psy)
141
+
142
+ # struphy d_splines_slim
143
+ span1s, span2s, span3s = [], [], []
144
+ for eta1, eta2, eta3 in zip(eta1s, eta2s, eta3s):
145
+ span1s += [bsp.find_span(td1, derham.p[0] - 1, eta1)]
146
+ span2s += [bsp.find_span(td2, derham.p[1] - 1, eta2)]
147
+ span3s += [bsp.find_span(td3, derham.p[2] - 1, eta3)]
148
+
149
+ val1s, val2s, val3s = [], [], []
150
+ t0 = time.time()
151
+ for eta1, eta2, eta3, span1, span2, span3 in zip(eta1s, eta2s, eta3s, span1s, span2s, span3s):
152
+ bsp.d_splines_slim(td1, derham.p[0] - 1, eta1, span1, bd1)
153
+ bsp.d_splines_slim(td2, derham.p[1] - 1, eta2, span2, bd2)
154
+ bsp.d_splines_slim(td3, derham.p[2] - 1, eta3, span3, bd3)
155
+ val1s += [bd1]
156
+ val2s += [bd2]
157
+ val3s += [bd3]
158
+ t1 = time.time()
159
+ if rank == 0:
160
+ print(f'bsp.d_splines_slim : {t1 - t0}')
161
+
162
+ # psydac basis_funs_p for D-splines
163
+ val1s_psy, val2s_psy, val3s_psy = [], [], []
164
+ t0 = time.time()
165
+ for eta1, eta2, eta3, span1, span2, span3 in zip(eta1s, eta2s, eta3s, span1s, span2s, span3s):
166
+ bsp_psy.basis_funs_p(td1, derham.p[0] - 1, eta1, span1, bd1)
167
+ bsp_psy.basis_funs_p(td2, derham.p[1] - 1, eta2, span2, bd2)
168
+ bsp_psy.basis_funs_p(td3, derham.p[2] - 1, eta3, span3, bd3)
169
+ val1s_psy += [bd1]
170
+ val2s_psy += [bd2]
171
+ val3s_psy += [bd3]
172
+ t1 = time.time()
173
+ if rank == 0:
174
+ print(f'bsp_psy.basis_funs_p for D: {t1 - t0}')
175
+
176
+ # compare
177
+ for val1, val1_psy in zip(val1s, val1s_psy):
178
+ assert np.allclose(val1, val1_psy)
179
+
180
+ for val2, val2_psy in zip(val2s, val2s_psy):
181
+ assert np.allclose(val2, val2_psy)
182
+
183
+ for val3, val3_psy in zip(val3s, val3s_psy):
184
+ assert np.allclose(val3, val3_psy)
185
+
186
+ for val1, val1_psy in zip(val1s_d, val1s_psy):
187
+ assert np.allclose(val1, val1_psy)
188
+
189
+ for val2, val2_psy in zip(val2s_d, val2s_psy):
190
+ assert np.allclose(val2, val2_psy)
191
+
192
+ for val3, val3_psy in zip(val3s_d, val3s_psy):
193
+ assert np.allclose(val3, val3_psy)
194
+
195
+
196
+ if __name__ == '__main__':
197
+ test_bsplines_span_and_basis([8, 9, 10], [3, 4, 3], [False, False, True])