musica 0.12.1__tar.gz → 0.12.2__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.

Potentially problematic release.


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

Files changed (500) hide show
  1. {musica-0.12.1 → musica-0.12.2}/.github/workflows/python-tests.yml +2 -0
  2. {musica-0.12.1 → musica-0.12.2}/.github/workflows/python-wheels.yml +15 -7
  3. {musica-0.12.1 → musica-0.12.2}/CITATION.cff +1 -1
  4. {musica-0.12.1 → musica-0.12.2}/CMakeLists.txt +1 -1
  5. {musica-0.12.1 → musica-0.12.2}/PKG-INFO +2 -1
  6. {musica-0.12.1 → musica-0.12.2}/binder/environment.yml +1 -0
  7. {musica-0.12.1 → musica-0.12.2}/cmake/dependencies.cmake +1 -1
  8. {musica-0.12.1 → musica-0.12.2}/cmake/summary.cmake +1 -1
  9. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.python +3 -1
  10. musica-0.12.2/musica/examples/__init__.py +1 -0
  11. {musica-0.12.1 → musica-0.12.2}/musica/examples/carma_aluminum.py +1 -0
  12. {musica-0.12.1 → musica-0.12.2}/musica/examples/carma_sulfate.py +1 -0
  13. {musica-0.12.1 → musica-0.12.2}/musica/examples/sulfate_box_model.py +2 -2
  14. {musica-0.12.1 → musica-0.12.2}/musica/examples/ts1_latin_hypercube.py +1 -1
  15. {musica-0.12.1 → musica-0.12.2}/musica/test/integration/test_carma_aluminum.py +2 -1
  16. {musica-0.12.1 → musica-0.12.2}/musica/test/integration/test_carma_sulfate.py +2 -1
  17. musica-0.12.2/musica/test/unit/test_state.py +325 -0
  18. musica-0.12.2/musica/tools/prepare_build_environment_linux.sh +32 -0
  19. {musica-0.12.1 → musica-0.12.2}/musica/types.py +17 -14
  20. {musica-0.12.1 → musica-0.12.2}/pyproject.toml +7 -9
  21. {musica-0.12.1 → musica-0.12.2}/src/micm/v0_parse.cpp +52 -31
  22. {musica-0.12.1 → musica-0.12.2}/src/micm/v1_parse.cpp +59 -44
  23. musica-0.12.1/musica/examples/__init__.py +0 -1
  24. musica-0.12.1/musica/tools/prepare_build_environment_linux.sh +0 -50
  25. {musica-0.12.1 → musica-0.12.2}/.clang-format +0 -0
  26. {musica-0.12.1 → musica-0.12.2}/.clang-tidy +0 -0
  27. {musica-0.12.1 → musica-0.12.2}/.dockerignore +0 -0
  28. {musica-0.12.1 → musica-0.12.2}/.github/workflows/clang_tidy.yml +0 -0
  29. {musica-0.12.1 → musica-0.12.2}/.github/workflows/close_stale_issues.yml +0 -0
  30. {musica-0.12.1 → musica-0.12.2}/.github/workflows/docker.yml +0 -0
  31. {musica-0.12.1 → musica-0.12.2}/.github/workflows/fetch_content_integration.yml +0 -0
  32. {musica-0.12.1 → musica-0.12.2}/.github/workflows/format.yml +0 -0
  33. {musica-0.12.1 → musica-0.12.2}/.github/workflows/gh_pages.yml +0 -0
  34. {musica-0.12.1 → musica-0.12.2}/.github/workflows/mac.yml +0 -0
  35. {musica-0.12.1 → musica-0.12.2}/.github/workflows/ubuntu.yml +0 -0
  36. {musica-0.12.1 → musica-0.12.2}/.github/workflows/windows.yml +0 -0
  37. {musica-0.12.1 → musica-0.12.2}/.gitignore +0 -0
  38. {musica-0.12.1 → musica-0.12.2}/.zenodo.json +0 -0
  39. {musica-0.12.1 → musica-0.12.2}/AUTHORS.md +0 -0
  40. {musica-0.12.1 → musica-0.12.2}/CONTRIBUTING.md +0 -0
  41. {musica-0.12.1 → musica-0.12.2}/LICENSE +0 -0
  42. {musica-0.12.1 → musica-0.12.2}/README.md +0 -0
  43. {musica-0.12.1 → musica-0.12.2}/cmake/CodeCoverage.cmake +0 -0
  44. {musica-0.12.1 → musica-0.12.2}/cmake/FindSphinx.cmake +0 -0
  45. {musica-0.12.1 → musica-0.12.2}/cmake/SetDefaults.cmake +0 -0
  46. {musica-0.12.1 → musica-0.12.2}/cmake/cmake_uninstall.cmake.in +0 -0
  47. {musica-0.12.1 → musica-0.12.2}/cmake/musica-fortran.pc.in +0 -0
  48. {musica-0.12.1 → musica-0.12.2}/cmake/musica.pc.in +0 -0
  49. {musica-0.12.1 → musica-0.12.2}/cmake/musica.settings.in +0 -0
  50. {musica-0.12.1 → musica-0.12.2}/cmake/musicaConfig.cmake.in +0 -0
  51. {musica-0.12.1 → musica-0.12.2}/cmake/setup_musica_target.cmake +0 -0
  52. {musica-0.12.1 → musica-0.12.2}/cmake/test_util.cmake +0 -0
  53. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/1-C4H9ONO2_1.nc +0 -0
  54. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/2-C4H9ONO2_1.nc +0 -0
  55. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/ACETONE_JPL06.nc +0 -0
  56. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/BRONO2_JPL06.nc +0 -0
  57. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/BRO_JPL06.nc +0 -0
  58. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/Br2_1.nc +0 -0
  59. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/BrCl_1.nc +0 -0
  60. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/BrNO2_1.nc +0 -0
  61. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/BrNO_1.nc +0 -0
  62. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/BrONO2_1.nc +0 -0
  63. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/BrONO_1.nc +0 -0
  64. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/BrO_1.nc +0 -0
  65. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/C2H5CHO_1.nc +0 -0
  66. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/C2H5ONO2_1.nc +0 -0
  67. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CCl2O_1.nc +0 -0
  68. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CCl4_1.nc +0 -0
  69. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CClFO_1.nc +0 -0
  70. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF2Br2_1.nc +0 -0
  71. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF2BrCF2Br_1.nc +0 -0
  72. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF2BrCl_1.nc +0 -0
  73. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF2CL2_JPL06.nc +0 -0
  74. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF2ClCF2CHFCl_1.nc +0 -0
  75. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF2O_1.nc +0 -0
  76. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF3Br_1.nc +0 -0
  77. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF3CF2CHCl2_1.nc +0 -0
  78. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF3CHCl2_1.nc +0 -0
  79. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF3CHCl_1.nc +0 -0
  80. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CF3CHFCl_1.nc +0 -0
  81. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CFC-113_1.nc +0 -0
  82. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CFC-114_1.nc +0 -0
  83. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CFC-115_1.nc +0 -0
  84. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CFC-11_1.nc +0 -0
  85. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CFC-12_1.nc +0 -0
  86. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CFC113_JPL06.nc +0 -0
  87. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CFC114_JPL10.nc +0 -0
  88. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CFC115_JPL10.nc +0 -0
  89. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CFCL3_JPL06.nc +0 -0
  90. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH2BR2_1.nc +0 -0
  91. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH2CHCHO_1.nc +0 -0
  92. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH2O_1.nc +0 -0
  93. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3BR_JPL06.nc +0 -0
  94. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3Br_1.nc +0 -0
  95. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3CCl3_1.nc +0 -0
  96. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3CF2Cl_1.nc +0 -0
  97. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3CFCl2_1.nc +0 -0
  98. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3CH2ONO2_1.nc +0 -0
  99. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3CH3NNO_1.nc +0 -0
  100. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3CHONO2CH3_1.nc +0 -0
  101. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3CHO_1.nc +0 -0
  102. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3CL_JPL06.nc +0 -0
  103. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3COCH2CH3_1.nc +0 -0
  104. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3COCH3_1.nc +0 -0
  105. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3COCHO_1.nc +0 -0
  106. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3COCOCH3_1.nc +0 -0
  107. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3COCOOH_1.nc +0 -0
  108. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3COOH_1.nc +0 -0
  109. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3COOOH_1.nc +0 -0
  110. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3Cl_1.nc +0 -0
  111. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3OCl_1.nc +0 -0
  112. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3ONO2_1.nc +0 -0
  113. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3OOH_1.nc +0 -0
  114. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH3OONO2_1.nc +0 -0
  115. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CH4_1.nc +0 -0
  116. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CHBR3_JPL10.nc +0 -0
  117. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CHBr3_1.nc +0 -0
  118. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CHCl3_1.nc +0 -0
  119. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CHClF2_1.nc +0 -0
  120. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CHOCHO_1.nc +0 -0
  121. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CL2O2_JPL10.nc +0 -0
  122. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CLO_JPL06.nc +0 -0
  123. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/CO2_1.nc +0 -0
  124. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/COF2_1.nc +0 -0
  125. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/COFCl_1.nc +0 -0
  126. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/Cl2O2_1.nc +0 -0
  127. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/ClNO2_1.nc +0 -0
  128. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/ClONO2_1.nc +0 -0
  129. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/ClONO_1.nc +0 -0
  130. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/ClOOCl_1.nc +0 -0
  131. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/ClOO_1.nc +0 -0
  132. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/ClO_1.nc +0 -0
  133. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/H1301_JPL06.nc +0 -0
  134. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/H2402_JPL06.nc +0 -0
  135. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/H2O2_1.nc +0 -0
  136. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/H2O_1.nc +0 -0
  137. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/H2O_2.nc +0 -0
  138. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/H2O_3.nc +0 -0
  139. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/H2SO4_1.nc +0 -0
  140. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HBr_1.nc +0 -0
  141. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HCFC141b_JPL10.nc +0 -0
  142. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HCFC142b_JPL10.nc +0 -0
  143. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HCFC22_JPL06.nc +0 -0
  144. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HCl_1.nc +0 -0
  145. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HF_1.nc +0 -0
  146. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HNO2_1.nc +0 -0
  147. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HNO3_1.nc +0 -0
  148. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HNO3_JPL06.nc +0 -0
  149. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HNO4_1.nc +0 -0
  150. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HO2NO2_JPL06.nc +0 -0
  151. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HO2NO2_temp_JPL06.nc +0 -0
  152. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HO2_1.nc +0 -0
  153. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HOCH2CHO_1.nc +0 -0
  154. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HOCH2CHO_tyndall.nc +0 -0
  155. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HOCH2OOH_1.nc +0 -0
  156. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HOCl_1.nc +0 -0
  157. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/HONO_1.nc +0 -0
  158. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/Hydroxyacetone_1.nc +0 -0
  159. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/I2_1.nc +0 -0
  160. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/IOH_1.nc +0 -0
  161. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/IO_1.nc +0 -0
  162. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/MVK_1.nc +0 -0
  163. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/Methacrolein_1.nc +0 -0
  164. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/N2O5_1.nc +0 -0
  165. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/N2O5_2.nc +0 -0
  166. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/N2O5_JPL06.nc +0 -0
  167. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/NO2_1.nc +0 -0
  168. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/NO3-(aq)_1.nc +0 -0
  169. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/NO3_1.nc +0 -0
  170. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/NOCl_1.nc +0 -0
  171. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/O2_1.nc +0 -0
  172. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/O2_JPL06.nc +0 -0
  173. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/O2_parameters.txt +0 -0
  174. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/O3_1.nc +0 -0
  175. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/O3_2.nc +0 -0
  176. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/O3_3.nc +0 -0
  177. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/O3_4.nc +0 -0
  178. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/O3_JPL06_218K.nc +0 -0
  179. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/O3_JPL06_298K.nc +0 -0
  180. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/O3_JPL06_base.nc +0 -0
  181. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/OCS_1.nc +0 -0
  182. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/OClO_1.nc +0 -0
  183. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/OClO_2.nc +0 -0
  184. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/OClO_3.nc +0 -0
  185. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/PAN_1.nc +0 -0
  186. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/PPN_1.nc +0 -0
  187. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/SF6_1.nc +0 -0
  188. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/SO2_1.nc +0 -0
  189. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/SO2_Mills.nc +0 -0
  190. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/SO3_1.nc +0 -0
  191. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/SO_1.nc +0 -0
  192. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/nC3H7ONO2_1.nc +0 -0
  193. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/perfluoro 1-iodopropane_1.nc +0 -0
  194. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/cross_sections/t-butyl-nitrite_1.nc +0 -0
  195. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/dose_rates.json +0 -0
  196. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/grids/wavelength/cam.csv +0 -0
  197. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/grids/wavelength/combined.grid +0 -0
  198. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/grids/wavelength/fast_tuv.grid +0 -0
  199. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/grids/wavelength/isaksen.grid +0 -0
  200. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/grids/wavelength/kockarts.grid +0 -0
  201. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/photolysis_rate_constants.json +0 -0
  202. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/profiles/atmosphere/atmmod.afglmw.100 +0 -0
  203. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/profiles/atmosphere/o3column.dat +0 -0
  204. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/profiles/atmosphere/toms7.78_93.ave +0 -0
  205. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/profiles/atmosphere/ussa.dens +0 -0
  206. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/profiles/atmosphere/ussa.ozone +0 -0
  207. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/profiles/atmosphere/ussa.temp +0 -0
  208. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/profiles/solar/atlas3_1994_317_a.dat +0 -0
  209. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/profiles/solar/neckel.flx +0 -0
  210. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/profiles/solar/sao2010.solref.converted +0 -0
  211. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/profiles/solar/susim_hi.flx +0 -0
  212. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/C2H5CHO_1.nc +0 -0
  213. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/CH2O_1.nc +0 -0
  214. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/CH3CHO_1.nc +0 -0
  215. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/CHOCHO-CH2O_CO_1.nc +0 -0
  216. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/CHOCHO-H2_CO_CO_1.nc +0 -0
  217. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/CHOCHO-HCO_HCO_1.nc +0 -0
  218. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/H2O_2H_O3P.nc +0 -0
  219. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/H2O_H2_O1D.nc +0 -0
  220. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/H2O_H_OH.nc +0 -0
  221. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/H2SO4_mills.nc +0 -0
  222. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/I2_1.nc +0 -0
  223. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/NO2_1.nc +0 -0
  224. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/NO3-NO+O2_1.nc +0 -0
  225. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/quantum_yields/NO3-NO2+O(3P)_1.nc +0 -0
  226. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/Cataract, pig(Oriowo et al.,2001)_spectral_wght_1.nc +0 -0
  227. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/DNA_damage_in_vitro(Setlow,1974)_spectral_wght_1.nc +0 -0
  228. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/Eppley-UV-Photometer_spectral_wght_1.nc +0 -0
  229. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/Erythema,humans(Anders et al.,1995)_spectral_wght_1.nc +0 -0
  230. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/NMSC (CIE 2006)_spectral_wght_1.nc +0 -0
  231. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/Occupational TLV (ACGIH,1992)_spectral_wght_1.nc +0 -0
  232. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/Phytoplankton, phaeo(Cullen et al. 1992)_spectral_wght_1.nc +0 -0
  233. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/Phytoplankton, proro(Cullen et al. 1992)_spectral_wght_1.nc +0 -0
  234. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/Previtamin-D3 (CIE 2006)_spectral_wght_1.nc +0 -0
  235. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/RB-Meter,model_501_spectral_wght_1.nc +0 -0
  236. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/data/spectral_weights/SCUP-human(de Gruijl and van der Leun,1994)_spectral_wght_1.nc +0 -0
  237. {musica-0.12.1 → musica-0.12.2}/configs/tuvx/tuv_5_4.json +0 -0
  238. {musica-0.12.1 → musica-0.12.2}/configs/v0/TS1/config.json +0 -0
  239. {musica-0.12.1 → musica-0.12.2}/configs/v0/TS1/initial_conditions.csv +0 -0
  240. {musica-0.12.1 → musica-0.12.2}/configs/v0/TS1/reactions.json +0 -0
  241. {musica-0.12.1 → musica-0.12.2}/configs/v0/TS1/species.json +0 -0
  242. {musica-0.12.1 → musica-0.12.2}/configs/v0/analytical/config.json +0 -0
  243. {musica-0.12.1 → musica-0.12.2}/configs/v0/analytical/reactions.json +0 -0
  244. {musica-0.12.1 → musica-0.12.2}/configs/v0/analytical/species.json +0 -0
  245. {musica-0.12.1 → musica-0.12.2}/configs/v0/carbon_bond_5/config.json +0 -0
  246. {musica-0.12.1 → musica-0.12.2}/configs/v0/carbon_bond_5/initial_conditions.csv +0 -0
  247. {musica-0.12.1 → musica-0.12.2}/configs/v0/carbon_bond_5/reactions.json +0 -0
  248. {musica-0.12.1 → musica-0.12.2}/configs/v0/carbon_bond_5/species.json +0 -0
  249. {musica-0.12.1 → musica-0.12.2}/configs/v0/chapman/config.json +0 -0
  250. {musica-0.12.1 → musica-0.12.2}/configs/v0/chapman/initial_conditions.csv +0 -0
  251. {musica-0.12.1 → musica-0.12.2}/configs/v0/chapman/reactions.json +0 -0
  252. {musica-0.12.1 → musica-0.12.2}/configs/v0/chapman/species.json +0 -0
  253. {musica-0.12.1 → musica-0.12.2}/configs/v0/robertson/config.json +0 -0
  254. {musica-0.12.1 → musica-0.12.2}/configs/v0/robertson/initial_conditions.csv +0 -0
  255. {musica-0.12.1 → musica-0.12.2}/configs/v0/robertson/reactions.json +0 -0
  256. {musica-0.12.1 → musica-0.12.2}/configs/v0/robertson/species.json +0 -0
  257. {musica-0.12.1 → musica-0.12.2}/configs/v1/chapman/config.json +0 -0
  258. {musica-0.12.1 → musica-0.12.2}/configs/v1/chapman/config.yaml +0 -0
  259. {musica-0.12.1 → musica-0.12.2}/configs/v1/full_configuration/full_configuration.json +0 -0
  260. {musica-0.12.1 → musica-0.12.2}/configs/v1/full_configuration/full_configuration.yaml +0 -0
  261. {musica-0.12.1 → musica-0.12.2}/configs/v1/ts1/initial_conditions.csv +0 -0
  262. {musica-0.12.1 → musica-0.12.2}/configs/v1/ts1/ts1.json +0 -0
  263. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile +0 -0
  264. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.coverage +0 -0
  265. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.docs +0 -0
  266. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.fortran-gcc +0 -0
  267. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.fortran-gcc.integration +0 -0
  268. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.fortran-intel +0 -0
  269. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.fortran-intel.pkgconfig +0 -0
  270. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.fortran-nvhpc +0 -0
  271. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.fortran-nvhpc.pkgconfig +0 -0
  272. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.memcheck +0 -0
  273. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.mpi +0 -0
  274. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.mpi_openmp +0 -0
  275. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.nvhpc +0 -0
  276. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.openmp +0 -0
  277. {musica-0.12.1 → musica-0.12.2}/docker/Dockerfile.wheel +0 -0
  278. {musica-0.12.1 → musica-0.12.2}/docs/CMakeLists.txt +0 -0
  279. {musica-0.12.1 → musica-0.12.2}/docs/Doxyfile.in +0 -0
  280. {musica-0.12.1 → musica-0.12.2}/docs/Makefile +0 -0
  281. {musica-0.12.1 → musica-0.12.2}/docs/Software Development Plan.pdf +0 -0
  282. {musica-0.12.1 → musica-0.12.2}/docs/make.bat +0 -0
  283. {musica-0.12.1 → musica-0.12.2}/docs/requirements.txt +0 -0
  284. {musica-0.12.1 → musica-0.12.2}/docs/source/_static/custom.css +0 -0
  285. {musica-0.12.1 → musica-0.12.2}/docs/source/_static/ecosystem.png +0 -0
  286. {musica-0.12.1 → musica-0.12.2}/docs/source/_static/favicon/favicon.ico +0 -0
  287. {musica-0.12.1 → musica-0.12.2}/docs/source/_static/index_api.svg +0 -0
  288. {musica-0.12.1 → musica-0.12.2}/docs/source/_static/index_contribute.svg +0 -0
  289. {musica-0.12.1 → musica-0.12.2}/docs/source/_static/index_getting_started.svg +0 -0
  290. {musica-0.12.1 → musica-0.12.2}/docs/source/_static/index_user_guide.svg +0 -0
  291. {musica-0.12.1 → musica-0.12.2}/docs/source/_static/switcher.json +0 -0
  292. {musica-0.12.1 → musica-0.12.2}/docs/source/api/C++.rst +0 -0
  293. {musica-0.12.1 → musica-0.12.2}/docs/source/api/index.rst +0 -0
  294. {musica-0.12.1 → musica-0.12.2}/docs/source/api/python.rst +0 -0
  295. {musica-0.12.1 → musica-0.12.2}/docs/source/citing/index.rst +0 -0
  296. {musica-0.12.1 → musica-0.12.2}/docs/source/conf.py +0 -0
  297. {musica-0.12.1 → musica-0.12.2}/docs/source/contributing/index.rst +0 -0
  298. {musica-0.12.1 → musica-0.12.2}/docs/source/getting_started/fortran.rst +0 -0
  299. {musica-0.12.1 → musica-0.12.2}/docs/source/getting_started/getting_started.rst +0 -0
  300. {musica-0.12.1 → musica-0.12.2}/docs/source/getting_started/getting_started_output.png +0 -0
  301. {musica-0.12.1 → musica-0.12.2}/docs/source/getting_started/python.rst +0 -0
  302. {musica-0.12.1 → musica-0.12.2}/docs/source/index.rst +0 -0
  303. {musica-0.12.1 → musica-0.12.2}/docs/source/references.bib +0 -0
  304. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/1. multiple_grid_cells.ipynb +0 -0
  305. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/2. hypercube.ipynb +0 -0
  306. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/3. user_defined_reactions.ipynb +0 -0
  307. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/4. local_parallelization.ipynb +0 -0
  308. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/5. hpc_parallelization.ipynb +0 -0
  309. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/6. gpu_solver.ipynb +0 -0
  310. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/7. carma.ipynb +0 -0
  311. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/chapter0.rst +0 -0
  312. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/chapter1.rst +0 -0
  313. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/chapter2.rst +0 -0
  314. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/config/dask_scaling_tests.csv +0 -0
  315. {musica-0.12.1 → musica-0.12.2}/docs/source/tutorials/tutorials.rst +0 -0
  316. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/chemistry/index.rst +0 -0
  317. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/examples/index.rst +0 -0
  318. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/fortran_c.rst +0 -0
  319. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/gpu/index.rst +0 -0
  320. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/index.rst +0 -0
  321. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/installation/index.rst +0 -0
  322. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/model/index.rst +0 -0
  323. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/multigrid/hypercube/index.rst +0 -0
  324. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/multigrid/index.rst +0 -0
  325. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/multigrid/parallel/index.rst +0 -0
  326. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/multigrid/two-grid-cell/index.rst +0 -0
  327. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/output/example_plot.png +0 -0
  328. {musica-0.12.1 → musica-0.12.2}/docs/source/user_guide/output/index.rst +0 -0
  329. {musica-0.12.1 → musica-0.12.2}/fortran/CMakeLists.txt +0 -0
  330. {musica-0.12.1 → musica-0.12.2}/fortran/micm/CMakeLists.txt +0 -0
  331. {musica-0.12.1 → musica-0.12.2}/fortran/micm/micm.F90 +0 -0
  332. {musica-0.12.1 → musica-0.12.2}/fortran/micm/state.F90 +0 -0
  333. {musica-0.12.1 → musica-0.12.2}/fortran/packaging/CMakeLists.txt +0 -0
  334. {musica-0.12.1 → musica-0.12.2}/fortran/test/CMakeLists.txt +0 -0
  335. {musica-0.12.1 → musica-0.12.2}/fortran/test/fetch_content_integration/CMakeLists.txt +0 -0
  336. {musica-0.12.1 → musica-0.12.2}/fortran/test/fetch_content_integration/test_get_micm_version.F90 +0 -0
  337. {musica-0.12.1 → musica-0.12.2}/fortran/test/fetch_content_integration/test_micm_api.F90 +0 -0
  338. {musica-0.12.1 → musica-0.12.2}/fortran/test/fetch_content_integration/test_micm_box_model.F90 +0 -0
  339. {musica-0.12.1 → musica-0.12.2}/fortran/test/fetch_content_integration/test_tuvx_api.F90 +0 -0
  340. {musica-0.12.1 → musica-0.12.2}/fortran/test/test_simple.F90 +0 -0
  341. {musica-0.12.1 → musica-0.12.2}/fortran/test/tutorial/CMakeLists.txt +0 -0
  342. {musica-0.12.1 → musica-0.12.2}/fortran/test/tutorial/demo.F90 +0 -0
  343. {musica-0.12.1 → musica-0.12.2}/fortran/test/unit/CMakeLists.txt +0 -0
  344. {musica-0.12.1 → musica-0.12.2}/fortran/test/unit/tuvx.F90 +0 -0
  345. {musica-0.12.1 → musica-0.12.2}/fortran/test/unit/tuvx_openmp.F90 +0 -0
  346. {musica-0.12.1 → musica-0.12.2}/fortran/test/unit/util.F90 +0 -0
  347. {musica-0.12.1 → musica-0.12.2}/fortran/tuvx/CMakeLists.txt +0 -0
  348. {musica-0.12.1 → musica-0.12.2}/fortran/tuvx/grid.F90 +0 -0
  349. {musica-0.12.1 → musica-0.12.2}/fortran/tuvx/grid_map.F90 +0 -0
  350. {musica-0.12.1 → musica-0.12.2}/fortran/tuvx/profile.F90 +0 -0
  351. {musica-0.12.1 → musica-0.12.2}/fortran/tuvx/profile_map.F90 +0 -0
  352. {musica-0.12.1 → musica-0.12.2}/fortran/tuvx/radiator.F90 +0 -0
  353. {musica-0.12.1 → musica-0.12.2}/fortran/tuvx/radiator_map.F90 +0 -0
  354. {musica-0.12.1 → musica-0.12.2}/fortran/tuvx/tuvx.F90 +0 -0
  355. {musica-0.12.1 → musica-0.12.2}/fortran/util.F90 +0 -0
  356. {musica-0.12.1 → musica-0.12.2}/include/musica/carma/carma.hpp +0 -0
  357. {musica-0.12.1 → musica-0.12.2}/include/musica/carma/carma_c_interface.hpp +0 -0
  358. {musica-0.12.1 → musica-0.12.2}/include/musica/carma/carma_state.hpp +0 -0
  359. {musica-0.12.1 → musica-0.12.2}/include/musica/carma/error.hpp +0 -0
  360. {musica-0.12.1 → musica-0.12.2}/include/musica/component_versions.hpp +0 -0
  361. {musica-0.12.1 → musica-0.12.2}/include/musica/error.hpp +0 -0
  362. {musica-0.12.1 → musica-0.12.2}/include/musica/micm/chemistry.hpp +0 -0
  363. {musica-0.12.1 → musica-0.12.2}/include/musica/micm/cuda_availability.hpp +0 -0
  364. {musica-0.12.1 → musica-0.12.2}/include/musica/micm/micm.hpp +0 -0
  365. {musica-0.12.1 → musica-0.12.2}/include/musica/micm/micm_c_interface.hpp +0 -0
  366. {musica-0.12.1 → musica-0.12.2}/include/musica/micm/parse.hpp +0 -0
  367. {musica-0.12.1 → musica-0.12.2}/include/musica/micm/state.hpp +0 -0
  368. {musica-0.12.1 → musica-0.12.2}/include/musica/micm/state_c_interface.hpp +0 -0
  369. {musica-0.12.1 → musica-0.12.2}/include/musica/tuvx/grid.hpp +0 -0
  370. {musica-0.12.1 → musica-0.12.2}/include/musica/tuvx/grid_map.hpp +0 -0
  371. {musica-0.12.1 → musica-0.12.2}/include/musica/tuvx/profile.hpp +0 -0
  372. {musica-0.12.1 → musica-0.12.2}/include/musica/tuvx/profile_map.hpp +0 -0
  373. {musica-0.12.1 → musica-0.12.2}/include/musica/tuvx/radiator.hpp +0 -0
  374. {musica-0.12.1 → musica-0.12.2}/include/musica/tuvx/radiator_map.hpp +0 -0
  375. {musica-0.12.1 → musica-0.12.2}/include/musica/tuvx/tuvx.hpp +0 -0
  376. {musica-0.12.1 → musica-0.12.2}/include/musica/tuvx/tuvx_c_interface.hpp +0 -0
  377. {musica-0.12.1 → musica-0.12.2}/include/musica/util.hpp +0 -0
  378. {musica-0.12.1 → musica-0.12.2}/include/musica/version.hpp +0 -0
  379. {musica-0.12.1 → musica-0.12.2}/musica/CMakeLists.txt +0 -0
  380. {musica-0.12.1 → musica-0.12.2}/musica/__init__.py +0 -0
  381. {musica-0.12.1 → musica-0.12.2}/musica/backend.py +0 -0
  382. {musica-0.12.1 → musica-0.12.2}/musica/binding_common.cpp +0 -0
  383. {musica-0.12.1 → musica-0.12.2}/musica/binding_common.hpp +0 -0
  384. {musica-0.12.1 → musica-0.12.2}/musica/carma.cpp +0 -0
  385. {musica-0.12.1 → musica-0.12.2}/musica/carma.py +0 -0
  386. {musica-0.12.1 → musica-0.12.2}/musica/constants.py +0 -0
  387. {musica-0.12.1 → musica-0.12.2}/musica/cpu_binding.cpp +0 -0
  388. {musica-0.12.1 → musica-0.12.2}/musica/cuda.cpp +0 -0
  389. {musica-0.12.1 → musica-0.12.2}/musica/cuda.py +0 -0
  390. {musica-0.12.1 → musica-0.12.2}/musica/examples/examples.py +0 -0
  391. {musica-0.12.1 → musica-0.12.2}/musica/gpu_binding.cpp +0 -0
  392. {musica-0.12.1 → musica-0.12.2}/musica/main.py +0 -0
  393. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/__init__.py +0 -0
  394. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/aqueous_equilibrium.py +0 -0
  395. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/arrhenius.py +0 -0
  396. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/branched.py +0 -0
  397. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/condensed_phase_arrhenius.py +0 -0
  398. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/condensed_phase_photolysis.py +0 -0
  399. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/emission.py +0 -0
  400. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/first_order_loss.py +0 -0
  401. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/henrys_law.py +0 -0
  402. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/mechanism_configuration.py +0 -0
  403. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/phase.py +0 -0
  404. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/photolysis.py +0 -0
  405. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/reactions.py +0 -0
  406. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/simpol_phase_transfer.py +0 -0
  407. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/species.py +0 -0
  408. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/surface.py +0 -0
  409. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/ternary_chemical_activation.py +0 -0
  410. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/troe.py +0 -0
  411. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/tunneling.py +0 -0
  412. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/user_defined.py +0 -0
  413. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/utils.py +0 -0
  414. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration/wet_deposition.py +0 -0
  415. {musica-0.12.1 → musica-0.12.2}/musica/mechanism_configuration.cpp +0 -0
  416. {musica-0.12.1 → musica-0.12.2}/musica/musica.cpp +0 -0
  417. {musica-0.12.1 → musica-0.12.2}/musica/test/examples/v1/full_configuration/full_configuration.json +0 -0
  418. {musica-0.12.1 → musica-0.12.2}/musica/test/examples/v1/full_configuration/full_configuration.yaml +0 -0
  419. {musica-0.12.1 → musica-0.12.2}/musica/test/integration/test_analytical.py +0 -0
  420. {musica-0.12.1 → musica-0.12.2}/musica/test/integration/test_carma.py +0 -0
  421. {musica-0.12.1 → musica-0.12.2}/musica/test/integration/test_chapman.py +0 -0
  422. {musica-0.12.1 → musica-0.12.2}/musica/test/integration/test_sulfate_box_model.py +1 -1
  423. {musica-0.12.1 → musica-0.12.2}/musica/test/integration/test_tuvx.py +0 -0
  424. {musica-0.12.1 → musica-0.12.2}/musica/test/unit/test_parser.py +0 -0
  425. {musica-0.12.1 → musica-0.12.2}/musica/test/unit/test_serializer.py +0 -0
  426. {musica-0.12.1 → musica-0.12.2}/musica/test/unit/test_util_full_mechanism.py +0 -0
  427. {musica-0.12.1 → musica-0.12.2}/musica/tools/prepare_build_environment_macos.sh +0 -0
  428. {musica-0.12.1 → musica-0.12.2}/musica/tools/repair_wheel_gpu.sh +0 -0
  429. {musica-0.12.1 → musica-0.12.2}/musica/tuvx.cpp +0 -0
  430. {musica-0.12.1 → musica-0.12.2}/musica/tuvx.py +0 -0
  431. {musica-0.12.1 → musica-0.12.2}/spack/packages/musica/package.py +0 -0
  432. {musica-0.12.1 → musica-0.12.2}/spack/repo.yaml +0 -0
  433. {musica-0.12.1 → musica-0.12.2}/src/CMakeLists.txt +0 -0
  434. {musica-0.12.1 → musica-0.12.2}/src/carma/carma.cpp +0 -0
  435. {musica-0.12.1 → musica-0.12.2}/src/carma/carma_c_interface.cpp +0 -0
  436. {musica-0.12.1 → musica-0.12.2}/src/carma/carma_parameters.F90 +0 -0
  437. {musica-0.12.1 → musica-0.12.2}/src/carma/carma_state.cpp +0 -0
  438. {musica-0.12.1 → musica-0.12.2}/src/carma/interface.F90 +0 -0
  439. {musica-0.12.1 → musica-0.12.2}/src/component_versions.cpp +0 -0
  440. {musica-0.12.1 → musica-0.12.2}/src/micm/convert_v0_to_v1.cpp +0 -0
  441. {musica-0.12.1 → musica-0.12.2}/src/micm/cuda_availability.cpp +0 -0
  442. {musica-0.12.1 → musica-0.12.2}/src/micm/micm.cpp +0 -0
  443. {musica-0.12.1 → musica-0.12.2}/src/micm/micm_c_interface.cpp +0 -0
  444. {musica-0.12.1 → musica-0.12.2}/src/micm/parse.cpp +0 -0
  445. {musica-0.12.1 → musica-0.12.2}/src/micm/state.cpp +0 -0
  446. {musica-0.12.1 → musica-0.12.2}/src/micm/state_c_interface.cpp +0 -0
  447. {musica-0.12.1 → musica-0.12.2}/src/packaging/CMakeLists.txt +0 -0
  448. {musica-0.12.1 → musica-0.12.2}/src/packaging/modulefile.lua.in +0 -0
  449. {musica-0.12.1 → musica-0.12.2}/src/test/CMakeLists.txt +0 -0
  450. {musica-0.12.1 → musica-0.12.2}/src/test/data/tuvx/fixed/O2_cross_section.nc +0 -0
  451. {musica-0.12.1 → musica-0.12.2}/src/test/data/tuvx/fixed/O2_parameters.txt +0 -0
  452. {musica-0.12.1 → musica-0.12.2}/src/test/data/tuvx/fixed/bar_cross_section.nc +0 -0
  453. {musica-0.12.1 → musica-0.12.2}/src/test/data/tuvx/fixed/config.json +0 -0
  454. {musica-0.12.1 → musica-0.12.2}/src/test/data/tuvx/fixed/foo_cross_section.nc +0 -0
  455. {musica-0.12.1 → musica-0.12.2}/src/test/data/tuvx/from_host/O2_cross_section.nc +0 -0
  456. {musica-0.12.1 → musica-0.12.2}/src/test/data/tuvx/from_host/O2_parameters.txt +0 -0
  457. {musica-0.12.1 → musica-0.12.2}/src/test/data/tuvx/from_host/bar_cross_section.nc +0 -0
  458. {musica-0.12.1 → musica-0.12.2}/src/test/data/tuvx/from_host/config.json +0 -0
  459. {musica-0.12.1 → musica-0.12.2}/src/test/data/tuvx/from_host/foo_cross_section.nc +0 -0
  460. {musica-0.12.1 → musica-0.12.2}/src/test/data/util_index_mapping_from_file.json +0 -0
  461. {musica-0.12.1 → musica-0.12.2}/src/test/test_simple.c +0 -0
  462. {musica-0.12.1 → musica-0.12.2}/src/test/unit/CMakeLists.txt +0 -0
  463. {musica-0.12.1 → musica-0.12.2}/src/test/unit/carma/CMakeLists.txt +0 -0
  464. {musica-0.12.1 → musica-0.12.2}/src/test/unit/carma/carma_c_api.cpp +0 -0
  465. {musica-0.12.1 → musica-0.12.2}/src/test/unit/component_versions.cpp +0 -0
  466. {musica-0.12.1 → musica-0.12.2}/src/test/unit/micm/CMakeLists.txt +0 -0
  467. {musica-0.12.1 → musica-0.12.2}/src/test/unit/micm/micm_c_api.cpp +0 -0
  468. {musica-0.12.1 → musica-0.12.2}/src/test/unit/micm/micm_wrapper.cpp +0 -0
  469. {musica-0.12.1 → musica-0.12.2}/src/test/unit/micm/parser.cpp +0 -0
  470. {musica-0.12.1 → musica-0.12.2}/src/test/unit/tuvx/CMakeLists.txt +0 -0
  471. {musica-0.12.1 → musica-0.12.2}/src/test/unit/tuvx/tuvx_c_api.cpp +0 -0
  472. {musica-0.12.1 → musica-0.12.2}/src/test/unit/tuvx/tuvx_run_from_config.cpp +0 -0
  473. {musica-0.12.1 → musica-0.12.2}/src/test/unit/util.cpp +0 -0
  474. {musica-0.12.1 → musica-0.12.2}/src/tuvx/grid.cpp +0 -0
  475. {musica-0.12.1 → musica-0.12.2}/src/tuvx/grid_map.cpp +0 -0
  476. {musica-0.12.1 → musica-0.12.2}/src/tuvx/interface.F90 +0 -0
  477. {musica-0.12.1 → musica-0.12.2}/src/tuvx/interface_grid.F90 +0 -0
  478. {musica-0.12.1 → musica-0.12.2}/src/tuvx/interface_grid_map.F90 +0 -0
  479. {musica-0.12.1 → musica-0.12.2}/src/tuvx/interface_profile.F90 +0 -0
  480. {musica-0.12.1 → musica-0.12.2}/src/tuvx/interface_profile_map.F90 +0 -0
  481. {musica-0.12.1 → musica-0.12.2}/src/tuvx/interface_radiator.F90 +0 -0
  482. {musica-0.12.1 → musica-0.12.2}/src/tuvx/interface_radiator_map.F90 +0 -0
  483. {musica-0.12.1 → musica-0.12.2}/src/tuvx/interface_util.F90 +0 -0
  484. {musica-0.12.1 → musica-0.12.2}/src/tuvx/profile.cpp +0 -0
  485. {musica-0.12.1 → musica-0.12.2}/src/tuvx/profile_map.cpp +0 -0
  486. {musica-0.12.1 → musica-0.12.2}/src/tuvx/radiator.cpp +0 -0
  487. {musica-0.12.1 → musica-0.12.2}/src/tuvx/radiator_map.cpp +0 -0
  488. {musica-0.12.1 → musica-0.12.2}/src/tuvx/tuvx.cpp +0 -0
  489. {musica-0.12.1 → musica-0.12.2}/src/tuvx/tuvx_c_interface.cpp +0 -0
  490. {musica-0.12.1 → musica-0.12.2}/src/util.cpp +0 -0
  491. {musica-0.12.1 → musica-0.12.2}/src/version.cpp.in +0 -0
  492. {musica-0.12.1 → musica-0.12.2}/tutorials/1. multiple_grid_cells.ipynb +0 -0
  493. {musica-0.12.1 → musica-0.12.2}/tutorials/2. hypercube.ipynb +0 -0
  494. {musica-0.12.1 → musica-0.12.2}/tutorials/3. user_defined_reactions.ipynb +0 -0
  495. {musica-0.12.1 → musica-0.12.2}/tutorials/4. local_parallelization.ipynb +0 -0
  496. {musica-0.12.1 → musica-0.12.2}/tutorials/5. hpc_parallelization.ipynb +0 -0
  497. {musica-0.12.1 → musica-0.12.2}/tutorials/6. gpu_solver.ipynb +0 -0
  498. {musica-0.12.1 → musica-0.12.2}/tutorials/7. carma.ipynb +0 -0
  499. {musica-0.12.1 → musica-0.12.2}/tutorials/config/dask_scaling_tests.csv +0 -0
  500. {musica-0.12.1 → musica-0.12.2}/valgrind.supp +0 -0
@@ -43,6 +43,8 @@ jobs:
43
43
 
44
44
  - name: Build and install
45
45
  run: pip install --verbose .[test]
46
+ env:
47
+ FC: gfortran-14
46
48
 
47
49
  - name: Test
48
50
  run: pytest -s
@@ -40,8 +40,12 @@ jobs:
40
40
  # Linux builds (supports cross-compilation via QEMU)
41
41
  - os: ubuntu-latest
42
42
  python-version: "3.13"
43
- cibw_archs: "x86_64 aarch64 i686"
43
+ cibw_archs: "x86_64 i686"
44
44
 
45
+ - os: ubuntu-24.04-arm
46
+ python-version: "3.13"
47
+ cibw_archs: "aarch64"
48
+
45
49
  # Windows builds (separate runners needed for different archs)
46
50
  - os: windows-latest
47
51
  python-version: "3.13"
@@ -51,11 +55,13 @@ jobs:
51
55
  - os: macos-13 # Intel runner
52
56
  python-version: "3.13"
53
57
  cibw_archs: "x86_64"
58
+ fc: gfortran-15
54
59
 
55
60
  # macOS Apple Silicon
56
61
  - os: macos-latest # ARM64 runner
57
62
  python-version: "3.13"
58
63
  cibw_archs: "arm64"
64
+ fc: gfortran-15
59
65
 
60
66
  steps:
61
67
  - uses: actions/checkout@v4
@@ -66,14 +72,16 @@ jobs:
66
72
  with:
67
73
  python-version: ${{ matrix.python-version }}
68
74
 
69
- - name: Set up QEMU for cross-architecture builds
70
- if: matrix.os == 'ubuntu-latest'
71
- uses: docker/setup-qemu-action@v3
72
- with:
73
- platforms: all
75
+ - name: CI Build Wheels
76
+ if: ${{ matrix.fc != '' }}
77
+ uses: pypa/cibuildwheel@v3.1.3
78
+ env:
79
+ CIBW_ARCHS: ${{ matrix.cibw_archs }}
80
+ FC: ${{ matrix.fc }}
74
81
 
75
82
  - name: CI Build Wheels
76
- uses: pypa/cibuildwheel@v2.17
83
+ if: ${{ matrix.fc == '' }}
84
+ uses: pypa/cibuildwheel@v3.1.3
77
85
  env:
78
86
  CIBW_ARCHS: ${{ matrix.cibw_archs }}
79
87
 
@@ -64,4 +64,4 @@ number: 10
64
64
  page: "E1743 - E1760"
65
65
  doi: "10.1175/BAMS-D-19-0331.1"
66
66
  url: "https://journals.ametsoc.org/view/journals/bams/101/10/bamsD190331.xml"
67
- version: 0.12.1
67
+ version: 0.12.2
@@ -1,7 +1,7 @@
1
1
  cmake_minimum_required(VERSION 3.21)
2
2
 
3
3
  # must be on the same line so that pyproject.toml can correctly identify the version
4
- project(musica-distribution VERSION 0.12.1)
4
+ project(musica-distribution VERSION 0.12.2)
5
5
 
6
6
  set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH};${PROJECT_SOURCE_DIR}/cmake)
7
7
  set(CMAKE_USER_MAKE_RULES_OVERRIDE ${PROJECT_SOURCE_DIR}/cmake/SetDefaults.cmake)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: musica
3
- Version: 0.12.1
3
+ Version: 0.12.2
4
4
  Summary: MUSICA is a Python library for performing computational simulations in atmospheric chemistry.
5
5
  Author-Email: Matthew Dawsom <mattdawson@ucar.edu>, Jiwon Gim <jiwongim@ucar.edu>, David Fillmore <fillmore@ucar.edu>, Kyle Shores <kshores@ucar.edu>, Montek Thind <mthind@ucar.edu>
6
6
  Maintainer-Email: ACOM MUSICA Developers <musica-support@ucar.edu>
@@ -207,6 +207,7 @@ License: Apache License
207
207
  limitations under the License.
208
208
 
209
209
  Project-URL: homepage, https://wiki.ucar.edu/display/MUSICA/MUSICA+Home
210
+ Requires-Python: >=3.9
210
211
  Requires-Dist: pyyaml>=6.0.2
211
212
  Requires-Dist: xarray>=2022.3.0
212
213
  Requires-Dist: ussa1976>=v0.3.4
@@ -3,5 +3,6 @@ channels:
3
3
  - conda-forge
4
4
  dependencies:
5
5
  - python>=3.9
6
+ - ipykernel
6
7
  - pip:
7
8
  - musica[tutorial]
@@ -75,7 +75,7 @@ endif()
75
75
 
76
76
  if (MUSICA_ENABLE_MICM AND MUSICA_BUILD_C_CXX_INTERFACE)
77
77
  set_git_default(MICM_GIT_REPOSITORY https://github.com/NCAR/micm.git)
78
- set_git_default(MICM_GIT_TAG v3.9.0)
78
+ set_git_default(MICM_GIT_TAG d1c22955dc6af62cb4b2deb09d10bf19324e2340)
79
79
 
80
80
  FetchContent_Declare(micm
81
81
  GIT_REPOSITORY ${MICM_GIT_REPOSITORY}
@@ -10,7 +10,7 @@ else()
10
10
  set(CXX_COMPILER_NAME_INFO " ")
11
11
  endif()
12
12
 
13
- if(MUSICA_BUILD_FORTRAN_INTERFACE)
13
+ if(MUSICA_BUILD_FORTRAN_INTERFACE OR MUSICA_ENABLE_TUVX OR MUSICA_ENABLE_CARMA)
14
14
  get_filename_component(Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)
15
15
  set(Fortran_COMPILER_NAME_INFO "${Fortran_COMPILER_NAME}")
16
16
  if(${CMAKE_Fortran_COMPILER_VERSION})
@@ -26,4 +26,6 @@ ENV CXX=g++
26
26
  ENV CC=gcc
27
27
  ENV FC=gfortran
28
28
 
29
- RUN cd musica && pip install .[test]
29
+ RUN cd musica && pip install .[test]
30
+
31
+ WORKDIR /musica
@@ -0,0 +1 @@
1
+ from .examples import Examples
@@ -11,6 +11,7 @@ import ussa1976
11
11
 
12
12
  available = musica.backend.carma_available()
13
13
 
14
+
14
15
  def run_carma_aluminum_example():
15
16
  group = musica.carma.CARMAGroupConfig(
16
17
  name="aluminum",
@@ -14,6 +14,7 @@ import musica
14
14
 
15
15
  available = musica.backend.carma_available()
16
16
 
17
+
17
18
  def run_carma_sulfate_example():
18
19
  """Test CARMA sulfate growth from gas condensation in a simple single grid box."""
19
20
 
@@ -272,8 +272,8 @@ def run_box_model():
272
272
  state.set_concentrations(initial_concentrations)
273
273
  state.set_user_defined_rate_parameters({"EMIS.SO2": np.full(NUMBER_OF_GRID_CELLS, 1.0e-8, dtype=np.float64)})
274
274
 
275
- # Run the simulation for 6 hours with a timestep of 30 seconds
276
- time_hours = 2.0
275
+ # Run the simulation for 30 minutes with a timestep of 30 seconds
276
+ time_hours = 0.5
277
277
  time_seconds = time_hours * np.float64(3600.0)
278
278
  dt = np.float64(30.0)
279
279
  num_steps = int(time_seconds / dt)
@@ -242,4 +242,4 @@ ax[2].set_ylabel('Air Density [kg m-3]')
242
242
  ax[2].set_xlabel('Grid Cell')
243
243
 
244
244
  fig.tight_layout()
245
- fig.savefig('ts1_latin_hypercube_conditions.png', dpi=300)
245
+ fig.savefig('ts1_latin_hypercube_conditions.png', dpi=300)
@@ -5,7 +5,8 @@ available = musica.backend.carma_available()
5
5
  pytestmark = pytest.mark.skipif(
6
6
  not available, reason="CARMA backend is not available")
7
7
 
8
+
8
9
  def test_carma_aluminum():
9
10
  from musica.examples import carma_aluminum
10
11
  state = carma_aluminum.run_carma_aluminum_example()
11
- assert state is not None, "State should not be None"
12
+ assert state is not None, "State should not be None"
@@ -5,6 +5,7 @@ available = musica.backend.carma_available()
5
5
  pytestmark = pytest.mark.skipif(
6
6
  not available, reason="CARMA backend is not available")
7
7
 
8
+
8
9
  def test_carma_sulfate():
9
10
  from musica.examples import carma_sulfate
10
11
  env_state, gas_state, bin_state = carma_sulfate.run_carma_sulfate_example()
@@ -13,4 +14,4 @@ def test_carma_sulfate():
13
14
  assert gas_state is not None, "Gas state should not be None"
14
15
  assert bin_state is not None, "Bin state should not be None"
15
16
  # Optionally, check expected dimensions or variables
16
- assert hasattr(bin_state, "mass_mixing_ratio"), "Bin state should have mass_mixing_ratio"
17
+ assert hasattr(bin_state, "mass_mixing_ratio"), "Bin state should have mass_mixing_ratio"
@@ -0,0 +1,325 @@
1
+ """Tests for the State class."""
2
+ from __future__ import annotations
3
+ import pytest # type: ignore # pylint: disable=import-error
4
+ import numpy as np # type: ignore # pylint: disable=import-error
5
+ from musica.types import State, MICM
6
+ import musica.mechanism_configuration as mc
7
+ from musica.mechanism_configuration import Mechanism
8
+
9
+
10
+ def create_test_mechanism() -> Mechanism:
11
+ """Helper function to create a test mechanism."""
12
+ # Chemical species
13
+ A = mc.Species(
14
+ name="A",
15
+ diffusion_coefficient_m2_s=20.3,
16
+ molecular_weight_kg_mol=13.2,
17
+ other_properties={
18
+ "__absolute tolerance": "1.0e-30"})
19
+ B = mc.Species(name="B")
20
+ C = mc.Species(name="C")
21
+ M = mc.Species(name="M", is_third_body=True)
22
+
23
+ # Chemical phases
24
+ gas = mc.Phase(name="gas", species=[A, B, C, M])
25
+
26
+ # Reactions
27
+ my_arrhenius = mc.Arrhenius(
28
+ name="my arrhenius",
29
+ A=32.1, B=-2.3, C=102.3, D=63.4, E=-1.3,
30
+ gas_phase=gas,
31
+ reactants=[B],
32
+ products=[C],
33
+ other_properties={"__irrelevant": "2"},
34
+ )
35
+
36
+ my_other_arrhenius = mc.Arrhenius(
37
+ name="my other arrhenius",
38
+ A=29.3, B=-1.5, Ea=101.2, D=82.6, E=-0.98,
39
+ gas_phase=gas,
40
+ reactants=[A],
41
+ products=[(1.2, B)]
42
+ )
43
+
44
+ my_troe = mc.Troe(
45
+ name="my troe",
46
+ gas_phase=gas,
47
+ k0_A=1.2e-12,
48
+ k0_B=167,
49
+ k0_C=3,
50
+ kinf_A=136,
51
+ kinf_B=5,
52
+ kinf_C=24,
53
+ Fc=0.9,
54
+ N=0.8,
55
+ reactants=[B, A],
56
+ products=[C],
57
+ other_properties={"__irrelevant": "2"},
58
+ )
59
+
60
+ my_ternary = mc.TernaryChemicalActivation(
61
+ name="my ternary chemical activation",
62
+ gas_phase=gas,
63
+ k0_A=32.1,
64
+ k0_B=-2.3,
65
+ k0_C=102.3,
66
+ kinf_A=63.4,
67
+ kinf_B=-1.3,
68
+ kinf_C=908.5,
69
+ Fc=1.3,
70
+ N=32.1,
71
+ reactants=[B, A],
72
+ products=[C],
73
+ other_properties={"__irrelevant": "2"},
74
+ )
75
+
76
+ my_branched = mc.Branched(
77
+ name="my branched",
78
+ gas_phase=gas,
79
+ reactants=[A],
80
+ alkoxy_products=[B],
81
+ nitrate_products=[C],
82
+ X=1.2e-4,
83
+ Y=167,
84
+ a0=0.15,
85
+ n=9,
86
+ other_properties={"__irrelevant": "2"},
87
+ )
88
+
89
+ my_tunneling = mc.Tunneling(
90
+ name="my tunneling",
91
+ gas_phase=gas,
92
+ reactants=[B],
93
+ products=[C],
94
+ A=123.45,
95
+ B=1200.0,
96
+ C=1.0e8,
97
+ other_properties={"__irrelevant": "2"},
98
+ )
99
+
100
+ my_surface = mc.Surface(
101
+ name="my surface",
102
+ gas_phase=gas,
103
+ gas_phase_species=A,
104
+ reaction_probability=2.0e-2,
105
+ gas_phase_products=[B, C],
106
+ other_properties={"__irrelevant": "2"},
107
+ )
108
+
109
+ photo_b = mc.Photolysis(
110
+ name="photo B",
111
+ gas_phase=gas,
112
+ reactants=[B],
113
+ products=[C],
114
+ scaling_factor=12.3,
115
+ other_properties={"__irrelevant": "2"},
116
+ )
117
+
118
+ my_emission = mc.Emission(
119
+ name="my emission",
120
+ gas_phase=gas,
121
+ products=[B],
122
+ scaling_factor=12.3,
123
+ other_properties={"__irrelevant": "2"},
124
+ )
125
+
126
+ my_first_order_loss = mc.FirstOrderLoss(
127
+ name="my first order loss",
128
+ gas_phase=gas,
129
+ reactants=[C],
130
+ scaling_factor=12.3,
131
+ other_properties={"__irrelevant": "2"},
132
+ )
133
+
134
+ user_defined = mc.UserDefined(
135
+ name="my user defined",
136
+ gas_phase=gas,
137
+ reactants=[A, B],
138
+ products=[(1.3, C)],
139
+ scaling_factor=12.3,
140
+ other_properties={"__irrelevant": "2"}
141
+ )
142
+
143
+ # Mechanism
144
+ return mc.Mechanism(
145
+ name="Full Configuration",
146
+ species=[A, B, C, M],
147
+ phases=[gas],
148
+ reactions=[my_arrhenius, my_other_arrhenius, my_troe, my_ternary,
149
+ my_branched, my_tunneling, my_surface, photo_b,
150
+ my_emission, my_first_order_loss, user_defined],
151
+ version=mc.Version(1, 0, 0),
152
+ )
153
+
154
+
155
+ def get_test_solver(mech: Mechanism) -> MICM:
156
+ """Helper function to create a test solver."""
157
+ return MICM(mechanism=mech)
158
+
159
+
160
+ def test_state_initialization():
161
+ """Test State initialization with various grid cell configurations."""
162
+ # Use the test mechanism
163
+ mech = create_test_mechanism()
164
+
165
+ # Create MICM instance
166
+ solver = get_test_solver(mech)
167
+
168
+ # Test with valid input
169
+ state = solver.create_state(number_of_grid_cells=1)
170
+ assert isinstance(state, State)
171
+
172
+ # Test with multiple grid cells
173
+ state_multi = solver.create_state(number_of_grid_cells=3)
174
+ assert isinstance(state_multi, State)
175
+
176
+ # Test with invalid input
177
+ with pytest.raises(ValueError, match="number_of_grid_cells must be greater than 0"):
178
+ solver.create_state(number_of_grid_cells=0)
179
+
180
+
181
+ def test_set_get_concentrations():
182
+ """Test setting and getting concentrations."""
183
+ # Use the test mechanism
184
+ mech = create_test_mechanism()
185
+ solver = get_test_solver(mech)
186
+
187
+ # Test single grid cell
188
+ state = solver.create_state(number_of_grid_cells=1)
189
+ concentrations = {"A": 1.0, "B": 2.0, "C": 3.0}
190
+ state.set_concentrations(concentrations)
191
+ result = state.get_concentrations()
192
+ assert result["A"][0] == 1.0
193
+ assert result["B"][0] == 2.0
194
+ assert result["C"][0] == 3.0
195
+
196
+ # Test multiple grid cells
197
+ state_multi = solver.create_state(number_of_grid_cells=2)
198
+ concentrations_multi = {"A": [1.0, 2.0], "B": [3.0, 4.0], "C": [5.0, 6.0]}
199
+ state_multi.set_concentrations(concentrations_multi)
200
+ result_multi = state_multi.get_concentrations()
201
+ assert result_multi["A"] == [1.0, 2.0]
202
+ assert result_multi["B"] == [3.0, 4.0]
203
+ assert result_multi["C"] == [5.0, 6.0]
204
+
205
+ # Test invalid species
206
+ with pytest.raises(ValueError, match="Species D not found in the mechanism"):
207
+ state.set_concentrations({"D": 1.0})
208
+
209
+ # Test invalid length
210
+ with pytest.raises(ValueError, match="must have length"):
211
+ state_multi.set_concentrations({"A": [1.0]})
212
+
213
+ # Test cannot set third-body species
214
+ with pytest.raises(ValueError, match="Species M not found in the mechanism"):
215
+ state.set_concentrations({"M": 1.0})
216
+
217
+
218
+ def test_set_get_conditions():
219
+ """Test setting and getting environmental conditions."""
220
+ # Use the test mechanism
221
+ mech = create_test_mechanism()
222
+ solver = get_test_solver(mech)
223
+
224
+ # Test single grid cell
225
+ state = solver.create_state(number_of_grid_cells=1)
226
+ state.set_conditions(temperatures=300.0, pressures=101325.0)
227
+ conditions = state.get_conditions()
228
+ assert conditions["temperature"][0] == 300.0
229
+ assert conditions["pressure"][0] == 101325.0
230
+ assert np.isclose(conditions["air_density"][0], 40.9, rtol=0.1) # Approximate value from ideal gas law
231
+
232
+ # Test multiple grid cells
233
+ state_multi = solver.create_state(number_of_grid_cells=2)
234
+ state_multi.set_conditions(
235
+ temperatures=[300.0, 310.0],
236
+ pressures=[101325.0, 101325.0],
237
+ air_densities=[40.9, 39.5]
238
+ )
239
+ conditions_multi = state_multi.get_conditions()
240
+ assert conditions_multi["temperature"] == [300.0, 310.0]
241
+ assert conditions_multi["pressure"] == [101325.0, 101325.0]
242
+ assert conditions_multi["air_density"] == [40.9, 39.5]
243
+
244
+ # Test invalid input length
245
+ with pytest.raises(ValueError, match="must be a list of length"):
246
+ state_multi.set_conditions(temperatures=[300.0])
247
+
248
+
249
+ def test_set_get_user_defined_rate_parameters():
250
+ """Test setting and getting user-defined rate parameters."""
251
+ # Use the test mechanism which includes a user-defined reaction
252
+ mech = create_test_mechanism()
253
+ solver = get_test_solver(mech)
254
+
255
+ # Test single grid cell
256
+ state = solver.create_state(number_of_grid_cells=1)
257
+ params = {"EMIS.my emission": 1.0}
258
+ state.set_user_defined_rate_parameters(params)
259
+ result = state.get_user_defined_rate_parameters()
260
+ assert result["EMIS.my emission"][0] == 1.0
261
+
262
+ # Test multiple grid cells
263
+ state_multi = solver.create_state(number_of_grid_cells=2)
264
+ params_multi = {"PHOTO.photo B": [1.0, 2.0]}
265
+ state_multi.set_user_defined_rate_parameters(params_multi)
266
+ result_multi = state_multi.get_user_defined_rate_parameters()
267
+ assert result_multi["PHOTO.photo B"] == [1.0, 2.0]
268
+
269
+ # Test invalid parameter
270
+ with pytest.raises(ValueError, match="User-defined rate parameter invalid_param not found"):
271
+ state.set_user_defined_rate_parameters({"invalid_param": 1.0})
272
+
273
+ solver = get_test_solver(mech)
274
+
275
+ state = solver.create_state(number_of_grid_cells=1)
276
+
277
+ # Test species ordering
278
+ species_ordering = state.get_species_ordering()
279
+ assert isinstance(species_ordering, dict)
280
+ assert len(species_ordering) == 3 # A, B, C (M is third-body and not included)
281
+
282
+ # Dictionary style access
283
+ assert species_ordering["A"] >= 0
284
+ assert species_ordering["B"] >= 0
285
+ assert species_ordering["C"] >= 0
286
+
287
+ # Using get() method with default value
288
+ assert species_ordering.get("A", -1) >= 0 # returns value if key exists
289
+ assert species_ordering.get("Z", -1) == -1 # returns -1 since Z doesn't exist
290
+
291
+ # Test key membership
292
+ assert "A" in species_ordering
293
+ assert "B" in species_ordering
294
+ assert "C" in species_ordering
295
+ assert "M" not in species_ordering # third-body not included
296
+
297
+ # Test parameter ordering
298
+ param_ordering = state.get_user_defined_rate_parameters_ordering()
299
+ assert isinstance(param_ordering, dict)
300
+ assert len(param_ordering) == 6
301
+
302
+ # Convert dict keys to list using list() function
303
+ param_names = list(param_ordering.keys())
304
+ assert len(param_names) == 6
305
+ assert isinstance(param_names[0], str)
306
+
307
+ # Alternative way using list comprehension
308
+ param_names_alt = [key for key in param_ordering]
309
+ assert param_names_alt == param_names
310
+
311
+ # Sort the keys if needed - useful for consistent ordering in tests
312
+ sorted_param_names = sorted(param_ordering.keys())
313
+ assert len(sorted_param_names) == 6
314
+ assert all(isinstance(name, str) for name in sorted_param_names)
315
+
316
+ # Verify all expected keys are present
317
+ expected_params = [
318
+ "PHOTO.photo B",
319
+ "EMIS.my emission",
320
+ "LOSS.my first order loss",
321
+ "SURF.my surface.effective radius [m]",
322
+ "SURF.my surface.particle number concentration [# m-3]",
323
+ "USER.my user defined"
324
+ ]
325
+ assert sorted(expected_params) == sorted(param_names)
@@ -0,0 +1,32 @@
1
+ #!/bin/bash
2
+ set -e
3
+ set -x
4
+
5
+ target_arch="$(uname -m)"
6
+ echo "Detected target_arch: $target_arch"
7
+
8
+ dnf -y update
9
+
10
+ # For 64 bit systems can enable our fortran components, but we require netcdf
11
+ if [[ "$target_arch" == "x86_64" || "$target_arch" == "aarch64" ]]; then
12
+ dnf install -y epel-release
13
+ dnf install -y netcdf-devel netcdf-fortran-devel
14
+ fi
15
+
16
+ dnf install -y tree wget zip lapack-devel
17
+
18
+ # 64 bit intel and amd systems support building cuda
19
+ if [ "$target_arch" = "x86_64" ]; then
20
+ # Install CUDA 12.8 for x86_64 on AlmaLinux 8 (manylinux_2_28) - supports GCC 14
21
+ dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
22
+ dnf install --setopt=obsoletes=0 -y \
23
+ cuda-nvcc-12-8 \
24
+ cuda-cudart-devel-12-8 \
25
+ libcurand-devel-12-8 \
26
+ libcublas-devel-12-8
27
+ ln -sf cuda-12.8 /usr/local/cuda
28
+
29
+ # Verify CUDA installation
30
+ echo "=== CUDA Installation Verification ==="
31
+ /usr/local/cuda/bin/nvcc --version
32
+ fi
@@ -165,30 +165,31 @@ class State():
165
165
  k += 1
166
166
 
167
167
  def set_conditions(self,
168
- temperatures: Union[Union[float, int], List[Union[float, int]]],
169
- pressures: Union[Union[float, int], List[Union[float, int]]],
168
+ temperatures: Optional[Union[Union[float, int], List[Union[float, int]]]] = None,
169
+ pressures: Optional[Union[Union[float, int], List[Union[float, int]]]] = None,
170
170
  air_densities: Optional[Union[Union[float, int], List[Union[float, int]]]] = None):
171
171
  """
172
172
  Set the conditions for the state. The individual conditions can be a single value
173
173
  when solving for a single grid cell, or a list of values when solving for multiple grid cells.
174
174
  If air density is not provided, it will be calculated from the Ideal Gas Law using the provided
175
- temperature and pressure.
175
+ temperature and pressure. If temperature or pressure are not provided, their values will remain
176
+ unchanged.
176
177
 
177
178
  Parameters
178
179
  ----------
179
- temperatures : Union[float, List[float]]
180
+ temperatures : Optional[Union[float, List[float]]]
180
181
  Temperature in Kelvin.
181
- pressures : Union[float, List[float]]
182
+ pressures : Optional[Union[float, List[float]]]
182
183
  Pressure in Pascals.
183
184
  air_densities : Optional[Union[float, List[float]]]
184
185
  Air density in mol m-3. If not provided, it will be calculated from the Ideal Gas Law.
185
186
  """
186
- if isinstance(temperatures, float) or isinstance(temperatures, int):
187
+ if temperatures is not None and (isinstance(temperatures, float) or isinstance(temperatures, int)):
187
188
  if self.__number_of_grid_cells > 1:
188
189
  raise ValueError(
189
190
  f"temperatures must be a list of length {self.__number_of_grid_cells}.")
190
191
  temperatures = [temperatures]
191
- if isinstance(pressures, float) or isinstance(pressures, int):
192
+ if pressures is not None and (isinstance(pressures, float) or isinstance(pressures, int)):
192
193
  if self.__number_of_grid_cells > 1:
193
194
  raise ValueError(
194
195
  f"pressures must be a list of length {self.__number_of_grid_cells}.")
@@ -198,10 +199,10 @@ class State():
198
199
  raise ValueError(
199
200
  f"air_densities must be a list of length {self.__number_of_grid_cells}.")
200
201
  air_densities = [air_densities]
201
- if len(temperatures) != self.__number_of_grid_cells:
202
+ if temperatures is not None and len(temperatures) != self.__number_of_grid_cells:
202
203
  raise ValueError(
203
204
  f"temperatures must be a list of length {self.__number_of_grid_cells}.")
204
- if len(pressures) != self.__number_of_grid_cells:
205
+ if pressures is not None and len(pressures) != self.__number_of_grid_cells:
205
206
  raise ValueError(
206
207
  f"pressures must be a list of length {self.__number_of_grid_cells}.")
207
208
  if air_densities is not None and len(air_densities) != self.__number_of_grid_cells:
@@ -210,10 +211,10 @@ class State():
210
211
  k = 0
211
212
  for state in self.__states:
212
213
  for condition in state.conditions:
213
- condition.temperature = temperatures[k]
214
- condition.pressure = pressures[k]
215
- condition.air_density = air_densities[k] if air_densities is not None else pressures[k] / (
216
- GAS_CONSTANT * temperatures[k])
214
+ condition.temperature = temperatures[k] if temperatures is not None else condition.temperature
215
+ condition.pressure = pressures[k] if pressures is not None else condition.pressure
216
+ condition.air_density = air_densities[k] if air_densities is not None else condition.pressure / (
217
+ GAS_CONSTANT * condition.temperature)
217
218
  k += 1
218
219
 
219
220
  def get_concentrations(self) -> Dict[str, List[float]]:
@@ -334,11 +335,13 @@ class MICM():
334
335
  Mechanism object which specifies the chemical mechanism to use. If provided, this will be used
335
336
  to create the solver.
336
337
  solver_type : SolverType, optional
337
- Type of solver to use. If not provided, the default solver type will be used.
338
+ Type of solver to use. If not provided, the default Rosenbrock (with standard-ordered matrices) solver type will be used.
338
339
  ignore_non_gas_phases : bool, optional
339
340
  If True, non-gas phases will be ignored when configuring micm with the mechanism. This is only needed
340
341
  until micm properly supports non-gas phases. This option is only supported when passing in a mechanism.
341
342
  """
343
+ if solver_type is None:
344
+ solver_type = SolverType.rosenbrock_standard_order
342
345
  self.__solver_type = solver_type
343
346
  self.__vector_size = _vector_size(solver_type)
344
347
  if config_path is None and mechanism is None: