musica 0.12.0__cp310-cp310-win32.whl → 0.12.2__cp310-cp310-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of musica might be problematic. Click here for more details.

Files changed (76) hide show
  1. musica/CMakeLists.txt +28 -2
  2. musica/__init__.py +9 -49
  3. musica/_musica.cp310-win32.pyd +0 -0
  4. musica/_version.py +1 -1
  5. musica/backend.py +41 -0
  6. musica/binding_common.cpp +23 -6
  7. musica/carma.cpp +911 -0
  8. musica/carma.py +1729 -0
  9. musica/constants.py +1 -1
  10. musica/cpu_binding.cpp +2 -1
  11. musica/cuda.py +4 -1
  12. musica/examples/__init__.py +1 -0
  13. musica/examples/carma_aluminum.py +124 -0
  14. musica/examples/carma_sulfate.py +246 -0
  15. musica/examples/examples.py +165 -0
  16. musica/examples/sulfate_box_model.py +439 -0
  17. musica/examples/ts1_latin_hypercube.py +245 -0
  18. musica/gpu_binding.cpp +2 -1
  19. musica/main.py +89 -0
  20. musica/mechanism_configuration/__init__.py +1 -1
  21. musica/mechanism_configuration/aqueous_equilibrium.py +227 -54
  22. musica/mechanism_configuration/arrhenius.py +228 -42
  23. musica/mechanism_configuration/branched.py +249 -66
  24. musica/mechanism_configuration/condensed_phase_arrhenius.py +243 -50
  25. musica/mechanism_configuration/condensed_phase_photolysis.py +16 -19
  26. musica/mechanism_configuration/emission.py +10 -6
  27. musica/mechanism_configuration/first_order_loss.py +133 -26
  28. musica/mechanism_configuration/henrys_law.py +7 -48
  29. musica/mechanism_configuration/mechanism_configuration.py +114 -41
  30. musica/mechanism_configuration/phase.py +6 -2
  31. musica/mechanism_configuration/photolysis.py +12 -7
  32. musica/mechanism_configuration/reactions.py +20 -8
  33. musica/mechanism_configuration/simpol_phase_transfer.py +180 -51
  34. musica/mechanism_configuration/species.py +23 -4
  35. musica/mechanism_configuration/surface.py +14 -9
  36. musica/mechanism_configuration/ternary_chemical_activation.py +352 -0
  37. musica/mechanism_configuration/troe.py +259 -44
  38. musica/mechanism_configuration/tunneling.py +196 -49
  39. musica/mechanism_configuration/user_defined.py +9 -4
  40. musica/mechanism_configuration/wet_deposition.py +11 -8
  41. musica/mechanism_configuration.cpp +184 -95
  42. musica/musica.cpp +48 -61
  43. musica/test/examples/v1/full_configuration/full_configuration.json +39 -22
  44. musica/test/examples/v1/full_configuration/full_configuration.yaml +29 -20
  45. musica/test/{test_analytical.py → integration/test_analytical.py} +0 -1
  46. musica/test/integration/test_carma.py +227 -0
  47. musica/test/integration/test_carma_aluminum.py +12 -0
  48. musica/test/integration/test_carma_sulfate.py +17 -0
  49. musica/test/integration/test_sulfate_box_model.py +34 -0
  50. musica/test/integration/test_tuvx.py +62 -0
  51. musica/test/unit/test_parser.py +64 -0
  52. musica/test/{test_serializer.py → unit/test_serializer.py} +2 -2
  53. musica/test/unit/test_state.py +325 -0
  54. musica/test/{test_util_full_mechanism.py → unit/test_util_full_mechanism.py} +152 -122
  55. musica/tools/prepare_build_environment_linux.sh +23 -34
  56. musica/tools/prepare_build_environment_macos.sh +1 -0
  57. musica/tuvx.cpp +93 -0
  58. musica/tuvx.py +199 -0
  59. musica/types.py +120 -73
  60. {musica-0.12.0.dist-info → musica-0.12.2.dist-info}/METADATA +41 -39
  61. musica-0.12.2.dist-info/RECORD +70 -0
  62. {musica-0.12.0.dist-info → musica-0.12.2.dist-info}/WHEEL +1 -1
  63. musica-0.12.2.dist-info/entry_points.txt +3 -0
  64. musica/test/examples/v0/config.json +0 -7
  65. musica/test/examples/v0/config.yaml +0 -3
  66. musica/test/examples/v0/reactions.json +0 -193
  67. musica/test/examples/v0/reactions.yaml +0 -142
  68. musica/test/examples/v0/species.json +0 -40
  69. musica/test/examples/v0/species.yaml +0 -19
  70. musica/test/test_parser.py +0 -57
  71. musica/test/tuvx.py +0 -10
  72. musica/tools/prepare_build_environment_windows.sh +0 -22
  73. musica-0.12.0.dist-info/RECORD +0 -57
  74. /musica/test/{test_chapman.py → integration/test_chapman.py} +0 -0
  75. {musica-0.12.0.dist-info → musica-0.12.2.dist-info}/licenses/AUTHORS.md +0 -0
  76. {musica-0.12.0.dist-info → musica-0.12.2.dist-info}/licenses/LICENSE +0 -0
musica/CMakeLists.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  ################################################################################
2
2
  # Python Extension Modules
3
3
 
4
- #include(setup_muisca_target)
4
+ include(setup_musica_target)
5
5
 
6
6
  # Define the list of Python extension module targets
7
7
  set(PY_MODULES _musica)
@@ -12,16 +12,42 @@ set(
12
12
  cuda.cpp
13
13
  mechanism_configuration.cpp
14
14
  musica.cpp
15
-
16
15
  ${MUSICA_SOURCES}
17
16
  )
18
17
 
18
+ if (MUSICA_ENABLE_TUVX)
19
+ list(APPEND MUSICA_PYTHON_SOURCES
20
+ tuvx.cpp
21
+ )
22
+ endif()
23
+
24
+ if (MUSICA_ENABLE_CARMA)
25
+ list(APPEND MUSICA_PYTHON_SOURCES
26
+ carma.cpp
27
+ )
28
+ endif()
29
+
19
30
  pybind11_add_module(_musica cpu_binding.cpp ${MUSICA_PYTHON_SOURCES})
20
31
  musica_setup_target(_musica MODE CPU)
21
32
 
33
+ # Set separate Fortran module directory for _musica to avoid conflicts
34
+ if (MUSICA_ENABLE_TUVX OR MUSICA_ENABLE_CARMA)
35
+ set_target_properties(_musica PROPERTIES
36
+ Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/musica_python_cpu_modules
37
+ )
38
+ endif()
39
+
22
40
  if (NOT ${MUSICA_GPU_TYPE} STREQUAL "None")
23
41
  pybind11_add_module(_musica_gpu gpu_binding.cpp ${MUSICA_PYTHON_SOURCES})
24
42
  musica_setup_target(_musica_gpu MODE GPU)
43
+
44
+ # Set separate Fortran module directory for _musica_gpu to avoid conflicts
45
+ if (MUSICA_ENABLE_TUVX OR MUSICA_ENABLE_CARMA)
46
+ set_target_properties(_musica_gpu PROPERTIES
47
+ Fortran_MODULE_DIRECTORY ${PROJECT_BINARY_DIR}/musica_python_gpu_modules
48
+ )
49
+ endif()
50
+
25
51
  list(APPEND PY_MODULES _musica_gpu)
26
52
  endif()
27
53
 
musica/__init__.py CHANGED
@@ -1,51 +1,11 @@
1
- import importlib.util
1
+ """
2
+ MUSICA: A Python library for atmospheric chemistry simulations.
3
+ """
2
4
 
3
-
4
- def _safe_find_spec(name):
5
- try:
6
- return importlib.util.find_spec(name)
7
- except ModuleNotFoundError:
8
- return None
9
-
10
-
11
- def _gpu_deps_installed():
12
- return (
13
- _safe_find_spec("nvidia.cublas") is not None or
14
- _safe_find_spec("nvidia_cuda_runtime") is not None or
15
- _safe_find_spec("nvidia-cublas-cu12") is not None or
16
- _safe_find_spec("nvidia-cuda-runtime-cu12") is not None
17
- )
18
-
19
-
20
- if _gpu_deps_installed():
21
- from . import _musica_gpu as _backend
22
- else:
23
- from . import _musica as _backend
24
-
25
- # Helper to re-export names from a module
26
- def _export_all(module, names, globals_):
27
- for name in names:
28
- globals_[name] = getattr(module, name)
29
-
30
-
31
- _core_names = [
32
- "_Conditions", "_SolverType", "_Solver", "_State", "_create_solver",
33
- "_create_solver_from_mechanism", "_create_state", "_micm_solve", "_vector_size",
34
- "_species_ordering", "_user_defined_rate_parameters_ordering",
35
- ]
36
- _mechanism_names = [
37
- "_ReactionType", "_Species", "_Phase", "_ReactionComponent", "_Arrhenius",
38
- "_CondensedPhaseArrhenius", "_Troe", "_Branched", "_Tunneling", "_Surface",
39
- "_Photolysis", "_CondensedPhasePhotolysis", "_Emission", "_FirstOrderLoss",
40
- "_AqueousEquilibrium", "_WetDeposition", "_HenrysLaw", "_SimpolPhaseTransfer",
41
- "_UserDefined", "_Reactions", "_ReactionsIterator", "_Mechanism", "_Version", "_Parser"
42
- ]
43
-
44
- # this allows us to use the same symbols in both the GPU and CPU versionspp
45
- _export_all(_backend._core, _core_names, globals())
46
- _export_all(_backend._mechanism_configuration, _mechanism_names, globals())
47
-
48
- __all__ = _core_names + _mechanism_names
49
-
50
- from .types import MICM, SolverType, State, Conditions
51
5
  from ._version import version as __version__
6
+ from .types import MICM, SolverType, State, Conditions
7
+ from . import mechanism_configuration
8
+ from .tuvx import TUVX
9
+ from .carma import CARMA, CARMAParameters, CARMAGroupConfig, CARMAElementConfig, CARMAState, CARMAGasConfig
10
+ from . import cuda
11
+ from .examples import Examples
Binary file
musica/_version.py CHANGED
@@ -1 +1 @@
1
- version = "0.12.0"
1
+ version = "0.12.2"
musica/backend.py ADDED
@@ -0,0 +1,41 @@
1
+ """
2
+ Backend selection and symbol loading for MUSICA.
3
+ """
4
+ import importlib.util
5
+
6
+
7
+ def _safe_find_spec(name):
8
+ try:
9
+ return importlib.util.find_spec(name)
10
+ except ModuleNotFoundError:
11
+ return None
12
+
13
+
14
+ def _gpu_deps_installed():
15
+ return (
16
+ _safe_find_spec("nvidia.cublas") is not None or
17
+ _safe_find_spec("nvidia_cuda_runtime") is not None or
18
+ _safe_find_spec("nvidia-cublas-cu12") is not None or
19
+ _safe_find_spec("nvidia-cuda-runtime-cu12") is not None
20
+ )
21
+
22
+
23
+ def get_backend():
24
+ """Get the appropriate backend module."""
25
+ if _gpu_deps_installed():
26
+ import musica._musica_gpu as backend
27
+ else:
28
+ import musica._musica as backend
29
+ return backend
30
+
31
+
32
+ def tuvx_available():
33
+ """Check if the TUVX backend is available."""
34
+ _backend = get_backend()
35
+ return hasattr(_backend._tuvx, "_get_tuvx_version")
36
+
37
+
38
+ def carma_available():
39
+ """Check if the CARMA backend is available."""
40
+ _backend = get_backend()
41
+ return hasattr(_backend._carma, "_get_carma_version")
musica/binding_common.cpp CHANGED
@@ -2,15 +2,32 @@
2
2
 
3
3
  void bind_cuda(py::module_ &);
4
4
  void bind_musica(py::module_ &);
5
+ #ifdef MUSICA_USE_TUVX
6
+ void bind_tuvx(py::module_ &);
7
+ #endif
8
+ #ifdef MUSICA_USE_CARMA
9
+ void bind_carma(py::module_ &);
10
+ #endif
5
11
 
6
12
  void bind_mechanism_configuration(py::module_ &);
7
13
 
8
- void bind_all(py::module_ &m) {
9
- py::module_ core = m.def_submodule("_core", "Wrapper classes for MUSICA C library structs and functions");
10
- py::module_ mechanism_configuration = m.def_submodule("_mechanism_configuration", "Wrapper classes for Mechanism Configuration library structs and functions");
14
+ void bind_all(py::module_ &m)
15
+ {
16
+ py::module_ core = m.def_submodule("_core", "Wrapper classes for MUSICA C library structs and functions");
17
+ py::module_ mechanism_configuration = m.def_submodule(
18
+ "_mechanism_configuration", "Wrapper classes for Mechanism Configuration library structs and functions");
19
+ py::module_ tuvx = m.def_submodule("_tuvx", "Wrapper classes for TUV-x photolysis calculator");
20
+ py::module_ carma = m.def_submodule("_carma", "Wrapper classes for CARMA photolysis calculator");
11
21
 
12
- bind_cuda(core);
13
- bind_musica(core);
22
+ bind_cuda(core);
23
+ bind_musica(core);
24
+ #ifdef MUSICA_USE_TUVX
25
+ bind_tuvx(tuvx);
26
+ #endif
14
27
 
15
- bind_mechanism_configuration(mechanism_configuration);
28
+ #ifdef MUSICA_USE_CARMA
29
+ bind_carma(carma);
30
+ #endif
31
+
32
+ bind_mechanism_configuration(mechanism_configuration);
16
33
  }