musica 0.8.1__tar.gz → 0.9.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.

Potentially problematic release.


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

Files changed (177) hide show
  1. {musica-0.8.1 → musica-0.9.0}/.github/workflows/pip.yml +1 -1
  2. {musica-0.8.1 → musica-0.9.0}/CITATION.cff +1 -1
  3. {musica-0.8.1 → musica-0.9.0}/CMakeLists.txt +2 -2
  4. {musica-0.8.1 → musica-0.9.0}/PKG-INFO +1 -1
  5. {musica-0.8.1 → musica-0.9.0}/cmake/dependencies.cmake +5 -2
  6. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.fortran-intel +1 -1
  7. {musica-0.8.1 → musica-0.9.0}/fortran/micm.F90 +129 -37
  8. {musica-0.8.1 → musica-0.9.0}/fortran/test/fetch_content_integration/CMakeLists.txt +2 -0
  9. musica-0.9.0/fortran/test/fetch_content_integration/test_micm_api.F90 +524 -0
  10. musica-0.9.0/fortran/test/fetch_content_integration/test_micm_box_model.F90 +126 -0
  11. musica-0.9.0/fortran/test/fetch_content_integration/test_tuvx_api.F90 +511 -0
  12. {musica-0.8.1 → musica-0.9.0}/fortran/test/unit/tuvx.F90 +99 -9
  13. {musica-0.8.1 → musica-0.9.0}/fortran/test/unit/util.F90 +14 -8
  14. {musica-0.8.1 → musica-0.9.0}/fortran/tuvx/grid.F90 +13 -13
  15. {musica-0.8.1 → musica-0.9.0}/fortran/tuvx/profile.F90 +19 -19
  16. {musica-0.8.1 → musica-0.9.0}/fortran/tuvx/radiator.F90 +18 -18
  17. {musica-0.8.1 → musica-0.9.0}/fortran/tuvx/tuvx.F90 +72 -6
  18. {musica-0.8.1 → musica-0.9.0}/fortran/util.F90 +27 -8
  19. {musica-0.8.1 → musica-0.9.0}/include/musica/micm.hpp +4 -3
  20. {musica-0.8.1 → musica-0.9.0}/include/musica/tuvx/tuvx.hpp +59 -1
  21. {musica-0.8.1 → musica-0.9.0}/include/musica/util.hpp +6 -1
  22. {musica-0.8.1 → musica-0.9.0}/python/test/test_analytical.py +158 -26
  23. {musica-0.8.1 → musica-0.9.0}/python/test/test_chapman.py +1 -1
  24. {musica-0.8.1 → musica-0.9.0}/python/wrapper.cpp +20 -2
  25. {musica-0.8.1 → musica-0.9.0}/src/micm/micm.cpp +25 -33
  26. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/fixed/config.json +15 -0
  27. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/from_host/config.json +15 -0
  28. {musica-0.8.1 → musica-0.9.0}/src/test/unit/micm/micm_c_api.cpp +170 -33
  29. {musica-0.8.1 → musica-0.9.0}/src/test/unit/tuvx/tuvx_run_from_config.cpp +59 -6
  30. {musica-0.8.1 → musica-0.9.0}/src/tuvx/CMakeLists.txt +1 -1
  31. {musica-0.8.1 → musica-0.9.0}/src/tuvx/grid.cpp +1 -1
  32. {musica-0.8.1 → musica-0.9.0}/src/tuvx/interface.F90 +80 -1
  33. {musica-0.8.1 → musica-0.9.0}/src/tuvx/interface_grid.F90 +6 -7
  34. {musica-0.8.1 → musica-0.9.0}/src/tuvx/interface_grid_map.F90 +0 -1
  35. {musica-0.8.1 → musica-0.9.0}/src/tuvx/interface_profile.F90 +0 -1
  36. {musica-0.8.1 → musica-0.9.0}/src/tuvx/interface_profile_map.F90 +0 -1
  37. {musica-0.8.1 → musica-0.9.0}/src/tuvx/interface_radiator_map.F90 +0 -1
  38. musica-0.8.1/src/tuvx/tuvx_util.F90 → musica-0.9.0/src/tuvx/interface_util.F90 +47 -3
  39. {musica-0.8.1 → musica-0.9.0}/src/tuvx/tuvx.cpp +37 -0
  40. {musica-0.8.1 → musica-0.9.0}/src/util.cpp +5 -0
  41. musica-0.8.1/fortran/test/fetch_content_integration/test_micm_api.F90 +0 -356
  42. musica-0.8.1/fortran/test/fetch_content_integration/test_micm_box_model.F90 +0 -68
  43. musica-0.8.1/fortran/test/fetch_content_integration/test_tuvx_api.F90 +0 -509
  44. {musica-0.8.1 → musica-0.9.0}/.clang-format +0 -0
  45. {musica-0.8.1 → musica-0.9.0}/.clang-tidy +0 -0
  46. {musica-0.8.1 → musica-0.9.0}/.dockerignore +0 -0
  47. {musica-0.8.1 → musica-0.9.0}/.github/workflows/clang_format.yml +0 -0
  48. {musica-0.8.1 → musica-0.9.0}/.github/workflows/clang_tidy.yml +0 -0
  49. {musica-0.8.1 → musica-0.9.0}/.github/workflows/docker.yml +0 -0
  50. {musica-0.8.1 → musica-0.9.0}/.github/workflows/fetch_content_integration.yml +0 -0
  51. {musica-0.8.1 → musica-0.9.0}/.github/workflows/gh_pages.yml +0 -0
  52. {musica-0.8.1 → musica-0.9.0}/.github/workflows/mac.yml +0 -0
  53. {musica-0.8.1 → musica-0.9.0}/.github/workflows/pep8.yml +0 -0
  54. {musica-0.8.1 → musica-0.9.0}/.github/workflows/release.yml +0 -0
  55. {musica-0.8.1 → musica-0.9.0}/.github/workflows/ubuntu.yml +0 -0
  56. {musica-0.8.1 → musica-0.9.0}/.github/workflows/windows.yml +0 -0
  57. {musica-0.8.1 → musica-0.9.0}/.gitignore +0 -0
  58. {musica-0.8.1 → musica-0.9.0}/LICENSE +0 -0
  59. {musica-0.8.1 → musica-0.9.0}/README.md +0 -0
  60. {musica-0.8.1 → musica-0.9.0}/cmake/FindSphinx.cmake +0 -0
  61. {musica-0.8.1 → musica-0.9.0}/cmake/SetDefaults.cmake +0 -0
  62. {musica-0.8.1 → musica-0.9.0}/cmake/cmake_uninstall.cmake.in +0 -0
  63. {musica-0.8.1 → musica-0.9.0}/cmake/musica.settings.in +0 -0
  64. {musica-0.8.1 → musica-0.9.0}/cmake/musicaConfig.cmake.in +0 -0
  65. {musica-0.8.1 → musica-0.9.0}/cmake/summary.cmake +0 -0
  66. {musica-0.8.1 → musica-0.9.0}/cmake/test_util.cmake +0 -0
  67. {musica-0.8.1 → musica-0.9.0}/configs/TS1/config.json +0 -0
  68. {musica-0.8.1 → musica-0.9.0}/configs/TS1/initial_conditions.csv +0 -0
  69. {musica-0.8.1 → musica-0.9.0}/configs/TS1/reactions.json +0 -0
  70. {musica-0.8.1 → musica-0.9.0}/configs/TS1/species.json +0 -0
  71. {musica-0.8.1 → musica-0.9.0}/configs/analytical/config.json +0 -0
  72. {musica-0.8.1 → musica-0.9.0}/configs/analytical/reactions.json +0 -0
  73. {musica-0.8.1 → musica-0.9.0}/configs/analytical/species.json +0 -0
  74. {musica-0.8.1 → musica-0.9.0}/configs/carbon_bond_5/config.json +0 -0
  75. {musica-0.8.1 → musica-0.9.0}/configs/carbon_bond_5/initial_conditions.csv +0 -0
  76. {musica-0.8.1 → musica-0.9.0}/configs/carbon_bond_5/reactions.json +0 -0
  77. {musica-0.8.1 → musica-0.9.0}/configs/carbon_bond_5/species.json +0 -0
  78. {musica-0.8.1 → musica-0.9.0}/configs/chapman/config.json +0 -0
  79. {musica-0.8.1 → musica-0.9.0}/configs/chapman/initial_conditions.csv +0 -0
  80. {musica-0.8.1 → musica-0.9.0}/configs/chapman/reactions.json +0 -0
  81. {musica-0.8.1 → musica-0.9.0}/configs/chapman/species.json +0 -0
  82. {musica-0.8.1 → musica-0.9.0}/configs/robertson/config.json +0 -0
  83. {musica-0.8.1 → musica-0.9.0}/configs/robertson/initial_conditions.csv +0 -0
  84. {musica-0.8.1 → musica-0.9.0}/configs/robertson/reactions.json +0 -0
  85. {musica-0.8.1 → musica-0.9.0}/configs/robertson/species.json +0 -0
  86. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile +0 -0
  87. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.docs +0 -0
  88. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.fortran-gcc +0 -0
  89. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.fortran-gcc.integration +0 -0
  90. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.fortran-nvhpc +0 -0
  91. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.memcheck +0 -0
  92. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.mpi +0 -0
  93. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.mpi_openmp +0 -0
  94. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.openmp +0 -0
  95. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.pip +0 -0
  96. {musica-0.8.1 → musica-0.9.0}/docker/Dockerfile.python +0 -0
  97. {musica-0.8.1 → musica-0.9.0}/docs/CMakeLists.txt +0 -0
  98. {musica-0.8.1 → musica-0.9.0}/docs/Makefile +0 -0
  99. {musica-0.8.1 → musica-0.9.0}/docs/Software Development Plan.pdf +0 -0
  100. {musica-0.8.1 → musica-0.9.0}/docs/make.bat +0 -0
  101. {musica-0.8.1 → musica-0.9.0}/docs/requirements.txt +0 -0
  102. {musica-0.8.1 → musica-0.9.0}/docs/source/_static/custom.css +0 -0
  103. {musica-0.8.1 → musica-0.9.0}/docs/source/_static/favicon/favicon.ico +0 -0
  104. {musica-0.8.1 → musica-0.9.0}/docs/source/_static/index_api.svg +0 -0
  105. {musica-0.8.1 → musica-0.9.0}/docs/source/_static/index_contribute.svg +0 -0
  106. {musica-0.8.1 → musica-0.9.0}/docs/source/_static/index_getting_started.svg +0 -0
  107. {musica-0.8.1 → musica-0.9.0}/docs/source/_static/index_user_guide.svg +0 -0
  108. {musica-0.8.1 → musica-0.9.0}/docs/source/api/index.rst +0 -0
  109. {musica-0.8.1 → musica-0.9.0}/docs/source/conf.py +0 -0
  110. {musica-0.8.1 → musica-0.9.0}/docs/source/contributing/index.rst +0 -0
  111. {musica-0.8.1 → musica-0.9.0}/docs/source/getting_started/getting_started.rst +0 -0
  112. {musica-0.8.1 → musica-0.9.0}/docs/source/getting_started/installation.rst +0 -0
  113. {musica-0.8.1 → musica-0.9.0}/docs/source/getting_started/overview.rst +0 -0
  114. {musica-0.8.1 → musica-0.9.0}/docs/source/index.rst +0 -0
  115. {musica-0.8.1 → musica-0.9.0}/docs/source/references.bib +0 -0
  116. {musica-0.8.1 → musica-0.9.0}/docs/source/tutorial/chapter0.rst +0 -0
  117. {musica-0.8.1 → musica-0.9.0}/docs/source/tutorial/chapter1.rst +0 -0
  118. {musica-0.8.1 → musica-0.9.0}/docs/source/tutorial/chapter2.rst +0 -0
  119. {musica-0.8.1 → musica-0.9.0}/docs/source/tutorial/tutorial.rst +0 -0
  120. {musica-0.8.1 → musica-0.9.0}/docs/source/user_guide/fortran_c.rst +0 -0
  121. {musica-0.8.1 → musica-0.9.0}/docs/source/user_guide/model_interface.rst +0 -0
  122. {musica-0.8.1 → musica-0.9.0}/docs/source/user_guide/user_guide.rst +0 -0
  123. {musica-0.8.1 → musica-0.9.0}/fortran/CMakeLists.txt +0 -0
  124. {musica-0.8.1 → musica-0.9.0}/fortran/packaging/CMakeLists.txt +0 -0
  125. {musica-0.8.1 → musica-0.9.0}/fortran/test/CMakeLists.txt +0 -0
  126. {musica-0.8.1 → musica-0.9.0}/fortran/test/fetch_content_integration/test_get_micm_version.F90 +0 -0
  127. {musica-0.8.1 → musica-0.9.0}/fortran/test/tutorial/CMakeLists.txt +0 -0
  128. {musica-0.8.1 → musica-0.9.0}/fortran/test/tutorial/demo.F90 +0 -0
  129. {musica-0.8.1 → musica-0.9.0}/fortran/test/unit/CMakeLists.txt +0 -0
  130. {musica-0.8.1 → musica-0.9.0}/fortran/test/unit/tuvx_mpi.F90 +0 -0
  131. {musica-0.8.1 → musica-0.9.0}/fortran/test/unit/tuvx_openmp.F90 +0 -0
  132. {musica-0.8.1 → musica-0.9.0}/fortran/tuvx/CMakeLists.txt +0 -0
  133. {musica-0.8.1 → musica-0.9.0}/fortran/tuvx/grid_map.F90 +0 -0
  134. {musica-0.8.1 → musica-0.9.0}/fortran/tuvx/profile_map.F90 +0 -0
  135. {musica-0.8.1 → musica-0.9.0}/fortran/tuvx/radiator_map.F90 +0 -0
  136. {musica-0.8.1 → musica-0.9.0}/include/musica/component_versions.hpp +0 -0
  137. {musica-0.8.1 → musica-0.9.0}/include/musica/tuvx/grid.hpp +0 -0
  138. {musica-0.8.1 → musica-0.9.0}/include/musica/tuvx/grid_map.hpp +0 -0
  139. {musica-0.8.1 → musica-0.9.0}/include/musica/tuvx/profile.hpp +0 -0
  140. {musica-0.8.1 → musica-0.9.0}/include/musica/tuvx/profile_map.hpp +0 -0
  141. {musica-0.8.1 → musica-0.9.0}/include/musica/tuvx/radiator.hpp +0 -0
  142. {musica-0.8.1 → musica-0.9.0}/include/musica/tuvx/radiator_map.hpp +0 -0
  143. {musica-0.8.1 → musica-0.9.0}/include/musica/version.hpp +0 -0
  144. {musica-0.8.1 → musica-0.9.0}/pyproject.toml +0 -0
  145. {musica-0.8.1 → musica-0.9.0}/python/CMakeLists.txt +0 -0
  146. {musica-0.8.1 → musica-0.9.0}/python/test/tuvx.py +0 -0
  147. {musica-0.8.1 → musica-0.9.0}/src/CMakeLists.txt +0 -0
  148. {musica-0.8.1 → musica-0.9.0}/src/component_versions.cpp +0 -0
  149. {musica-0.8.1 → musica-0.9.0}/src/micm/CMakeLists.txt +0 -0
  150. {musica-0.8.1 → musica-0.9.0}/src/packaging/CMakeLists.txt +0 -0
  151. {musica-0.8.1 → musica-0.9.0}/src/packaging/modulefile.lua.in +0 -0
  152. {musica-0.8.1 → musica-0.9.0}/src/test/CMakeLists.txt +0 -0
  153. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/fixed/O2_cross_section.nc +0 -0
  154. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/fixed/O2_parameters.txt +0 -0
  155. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/fixed/bar_cross_section.nc +0 -0
  156. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/fixed/foo_cross_section.nc +0 -0
  157. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/fixed/stand_alone_tuvx_config.json +0 -0
  158. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/from_host/O2_cross_section.nc +0 -0
  159. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/from_host/O2_parameters.txt +0 -0
  160. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/from_host/bar_cross_section.nc +0 -0
  161. {musica-0.8.1 → musica-0.9.0}/src/test/data/tuvx/from_host/foo_cross_section.nc +0 -0
  162. {musica-0.8.1 → musica-0.9.0}/src/test/data/util_index_mapping_from_file.json +0 -0
  163. {musica-0.8.1 → musica-0.9.0}/src/test/unit/CMakeLists.txt +0 -0
  164. {musica-0.8.1 → musica-0.9.0}/src/test/unit/component_versions.cpp +0 -0
  165. {musica-0.8.1 → musica-0.9.0}/src/test/unit/micm/CMakeLists.txt +0 -0
  166. {musica-0.8.1 → musica-0.9.0}/src/test/unit/micm/micm.cpp +0 -0
  167. {musica-0.8.1 → musica-0.9.0}/src/test/unit/tuvx/CMakeLists.txt +0 -0
  168. {musica-0.8.1 → musica-0.9.0}/src/test/unit/tuvx/tuvx_c_api.cpp +0 -0
  169. {musica-0.8.1 → musica-0.9.0}/src/test/unit/util.cpp +0 -0
  170. {musica-0.8.1 → musica-0.9.0}/src/tuvx/grid_map.cpp +0 -0
  171. {musica-0.8.1 → musica-0.9.0}/src/tuvx/interface_radiator.F90 +0 -0
  172. {musica-0.8.1 → musica-0.9.0}/src/tuvx/profile.cpp +0 -0
  173. {musica-0.8.1 → musica-0.9.0}/src/tuvx/profile_map.cpp +0 -0
  174. {musica-0.8.1 → musica-0.9.0}/src/tuvx/radiator.cpp +0 -0
  175. {musica-0.8.1 → musica-0.9.0}/src/tuvx/radiator_map.cpp +0 -0
  176. {musica-0.8.1 → musica-0.9.0}/src/version.cpp.in +0 -0
  177. {musica-0.8.1 → musica-0.9.0}/valgrind.supp +0 -0
@@ -13,7 +13,7 @@ jobs:
13
13
  fail-fast: false
14
14
  matrix:
15
15
  platform: [windows-latest, macos-13, ubuntu-latest]
16
- python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
16
+ python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
17
17
  # python versions: https://devguide.python.org/versions/
18
18
 
19
19
  runs-on: ${{ matrix.platform }}
@@ -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.8.0
67
+ version: 0.9.0
@@ -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.8.1)
4
+ project(musica-distribution VERSION 0.9.0)
5
5
 
6
6
  set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH};${PROJECT_SOURCE_DIR}/cmake)
7
7
  set(CMAKE_USER_MAKE_RULES_OVERRIDE ${CMAKE_MODULE_PATH}/SetDefaults.cmake)
@@ -30,7 +30,7 @@ option(MUSICA_BUILD_DOCS "Build the documentation" OFF)
30
30
  option(MUSICA_ENABLE_MICM "Enable MICM" ON)
31
31
  option(MUSICA_ENABLE_TUVX "Enable TUV-x" ON)
32
32
 
33
- set(MUSICA_SET_MICM_VECTOR_MATRIX_SIZE "1" CACHE STRING "Set MICM vector-ordered matrix dimension")
33
+ set(MUSICA_SET_MICM_VECTOR_MATRIX_SIZE "4" CACHE STRING "Set MICM vector-ordered matrix dimension")
34
34
 
35
35
  cmake_dependent_option(
36
36
  MUSICA_ENABLE_PYTHON_LIBRARY "Adds pybind11, a lightweight header-only library that exposes C++ types in Python and vice versa" OFF "MUSICA_BUILD_C_CXX_INTERFACE" OFF)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: musica
3
- Version: 0.8.1
3
+ Version: 0.9.0
4
4
  Summary: MUSICA is a Python library for performing computational simulations in atmospheric chemistry.
5
5
  Home-page: https://wiki.ucar.edu/display/MUSICA/MUSICA+Home
6
6
  Author-Email: Matthew Dawsom <mattdawson@ucar.edu>, Jiwon Gim <jiwongim@ucar.edu>, David Fillmore <fillmore@ucar.edu>, Kyle Shores <kshores@ucar.edu>
@@ -62,7 +62,7 @@ endif()
62
62
  if (MUSICA_ENABLE_MICM AND MUSICA_BUILD_C_CXX_INTERFACE)
63
63
 
64
64
  set_git_default(MICM_GIT_REPOSITORY https://github.com/NCAR/micm.git)
65
- set_git_default(MICM_GIT_TAG b3c462a)
65
+ set_git_default(MICM_GIT_TAG v.3.7.0)
66
66
 
67
67
  FetchContent_Declare(micm
68
68
  GIT_REPOSITORY ${MICM_GIT_REPOSITORY}
@@ -86,7 +86,7 @@ if (MUSICA_ENABLE_TUVX AND MUSICA_BUILD_C_CXX_INTERFACE)
86
86
  set(TUVX_INSTALL_INCLUDE_DIR ${MUSICA_INSTALL_INCLUDE_DIR} CACHE STRING "" FORCE)
87
87
 
88
88
  set_git_default(TUVX_GIT_REPOSITORY https://github.com/NCAR/tuv-x.git)
89
- set_git_default(TUVX_GIT_TAG v0.10.0)
89
+ set_git_default(TUVX_GIT_TAG v0.10.1)
90
90
 
91
91
  FetchContent_Declare(tuvx
92
92
  GIT_REPOSITORY ${TUVX_GIT_REPOSITORY}
@@ -94,6 +94,9 @@ if (MUSICA_ENABLE_TUVX AND MUSICA_BUILD_C_CXX_INTERFACE)
94
94
  GIT_PROGRESS NOT ${FETCHCONTENT_QUIET}
95
95
  )
96
96
 
97
+ set(TUVX_ENABLE_TESTS OFF)
98
+ set(TUVX_ENABLE_REGRESSION_TESTS OFF)
99
+
97
100
  FetchContent_MakeAvailable(tuvx)
98
101
  endif()
99
102
 
@@ -1,5 +1,5 @@
1
1
  # versions and sizes from here: https://hub.docker.com/r/intel/oneapi-hpckit/tags
2
- FROM intel/oneapi-hpckit:latest
2
+ FROM intel/oneapi-hpckit:2024.0.1-devel-ubuntu22.04
3
3
 
4
4
  # Based off of this: https://dgpu-docs.intel.com/driver/installation.html#repository-public-key-used-for-package-and-repository-signing
5
5
  # however those docs (at the time of this writing are incorrect) and this is the correct url
@@ -10,7 +10,7 @@ module musica_micm
10
10
  implicit none
11
11
 
12
12
  public :: micm_t, solver_stats_t, get_micm_version
13
- public :: Rosenbrock, RosenbrockStandardOrder, BackwardEuler, BackwardEulerStandardOrder
13
+ public :: UndefinedSolver, Rosenbrock, RosenbrockStandardOrder, BackwardEuler, BackwardEulerStandardOrder
14
14
  private
15
15
 
16
16
  !> Wrapper for c solver stats
@@ -28,6 +28,7 @@ module musica_micm
28
28
  ! We could use Fortran 2023 enum type feature if Fortran 2023 is supported
29
29
  ! https://fortran-lang.discourse.group/t/enumerator-type-in-bind-c-derived-type-best-practice/5947/2
30
30
  enum, bind(c)
31
+ enumerator :: UndefinedSolver = 0
31
32
  enumerator :: Rosenbrock = 1
32
33
  enumerator :: RosenbrockStandardOrder = 2
33
34
  enumerator :: BackwardEuler = 3
@@ -135,10 +136,14 @@ module musica_micm
135
136
  type :: micm_t
136
137
  type(mappings_t), pointer :: species_ordering => null()
137
138
  type(mappings_t), pointer :: user_defined_reaction_rates => null()
138
- type(c_ptr), private :: ptr = c_null_ptr
139
+ type(c_ptr), private :: ptr = c_null_ptr
140
+ integer, private :: number_of_grid_cells = 0
141
+ integer, private :: solver_type = UndefinedSolver
139
142
  contains
140
143
  ! Solve the chemical system
141
- procedure :: solve
144
+ procedure, private :: solve_arrays
145
+ procedure, private :: solve_c_ptrs
146
+ generic :: solve => solve_arrays, solve_c_ptrs
142
147
  ! Get species properties
143
148
  procedure :: get_species_property_string
144
149
  procedure :: get_species_property_double
@@ -191,9 +196,11 @@ contains
191
196
  use musica_util, only: error_t_c, error_t, copy_mappings
192
197
  type(micm_t), pointer :: this
193
198
  character(len=*), intent(in) :: config_path
194
- integer(c_int), intent(in) :: solver_type
195
- integer(c_int), intent(in) :: num_grid_cells
199
+ integer, intent(in) :: solver_type
200
+ integer, intent(in) :: num_grid_cells
196
201
  type(error_t), intent(inout) :: error
202
+
203
+ ! local variables
197
204
  character(len=1, kind=c_char) :: c_config_path(len_trim(config_path)+1)
198
205
  integer :: n, i
199
206
  type(error_t_c) :: error_c
@@ -206,7 +213,10 @@ contains
206
213
  end do
207
214
  c_config_path(n+1) = c_null_char
208
215
 
209
- this%ptr = create_micm_c(c_config_path, solver_type, num_grid_cells, error_c)
216
+ this%number_of_grid_cells = num_grid_cells
217
+ this%solver_type = solver_type
218
+ this%ptr = create_micm_c( c_config_path, int(solver_type, kind=c_int), &
219
+ int(num_grid_cells, kind=c_int), error_c )
210
220
  error = error_t(error_c)
211
221
  if (.not. error%is_success()) then
212
222
  deallocate(this)
@@ -233,41 +243,121 @@ contains
233
243
 
234
244
  end function constructor
235
245
 
236
- subroutine solve(this, time_step, temperature, pressure, air_density, concentrations, &
237
- user_defined_reaction_rates, solver_state, solver_stats, error)
246
+ !> Solves the chemical system
247
+ !!
248
+ !! This function accepts fortran arrays and checks their sizes
249
+ !! against the number of grid cells and the species/rate parameter ordering.
250
+ subroutine solve_arrays(this, time_step, temperature, pressure, air_density, &
251
+ concentrations, user_defined_reaction_rates, solver_state, solver_stats, error)
238
252
  use iso_c_binding, only: c_loc
253
+ use iso_fortran_env, only: real64
254
+ use musica_util, only: string_t, string_t_c, error_t_c, error_t
255
+ class(micm_t), intent(in) :: this
256
+ real(real64), intent(in) :: time_step
257
+ real(real64), target, contiguous, intent(in) :: temperature(:)
258
+ real(real64), target, contiguous, intent(in) :: pressure(:)
259
+ real(real64), target, contiguous, intent(in) :: air_density(:)
260
+ real(real64), target, contiguous, intent(inout) :: concentrations(:,:)
261
+ real(real64), target, contiguous, intent(in) :: user_defined_reaction_rates(:,:)
262
+ type(string_t), intent(out) :: solver_state
263
+ type(solver_stats_t), intent(out) :: solver_stats
264
+ type(error_t), intent(out) :: error
265
+
266
+ type(string_t_c) :: solver_state_c
267
+ type(solver_stats_t_c) :: solver_stats_c
268
+ type(error_t_c) :: error_c
269
+
270
+ if (size(temperature) .ne. this%number_of_grid_cells) then
271
+ error = error_t(1, "MICM_SOLVE", "Temperature array size does not match number of grid cells")
272
+ return
273
+ end if
274
+ if (size(pressure) .ne. this%number_of_grid_cells) then
275
+ error = error_t(1, "MICM_SOLVE", "Pressure array size does not match number of grid cells")
276
+ return
277
+ end if
278
+ if (size(air_density) .ne. this%number_of_grid_cells) then
279
+ error = error_t(1, "MICM_SOLVE", "Air density array size does not match number of grid cells")
280
+ return
281
+ end if
282
+ if (this%solver_type .eq. Rosenbrock .or. this%solver_type .eq. BackwardEuler) then
283
+ if (size(concentrations, 1) .ne. this%number_of_grid_cells) then
284
+ error = error_t(1, "MICM_SOLVE", "Concentrations array dimension 1 does not match number of grid cells")
285
+ return
286
+ end if
287
+ if (size(concentrations, 2) .ne. this%species_ordering%size()) then
288
+ error = error_t(1, "MICM_SOLVE", "Concentrations array dimension 2 does not match species ordering")
289
+ return
290
+ end if
291
+ if (size(user_defined_reaction_rates, 1) .ne. this%number_of_grid_cells) then
292
+ error = error_t(1, "MICM_SOLVE", "User defined reaction rates array dimension 1 does not match number of grid cells")
293
+ return
294
+ end if
295
+ if (size(user_defined_reaction_rates, 2) .ne. this%user_defined_reaction_rates%size()) then
296
+ error = error_t(1, "MICM_SOLVE", "User defined reaction rates array dimension 2 does not match user defined reaction rates ordering")
297
+ return
298
+ end if
299
+ else
300
+ if (size(concentrations, 1) .ne. this%species_ordering%size()) then
301
+ error = error_t(1, "MICM_SOLVE", "Concentrations array dimension 1 does not match species ordering")
302
+ return
303
+ end if
304
+ if (size(concentrations, 2) .ne. this%number_of_grid_cells) then
305
+ error = error_t(1, "MICM_SOLVE", "Concentrations array dimension 2 does not match number of grid cells")
306
+ return
307
+ end if
308
+ if (size(user_defined_reaction_rates, 1) .ne. this%user_defined_reaction_rates%size()) then
309
+ error = error_t(1, "MICM_SOLVE", "User defined reaction rates array dimension 1 does not match user defined reaction rates ordering")
310
+ return
311
+ end if
312
+ if (size(user_defined_reaction_rates, 2) .ne. this%number_of_grid_cells) then
313
+ error = error_t(1, "MICM_SOLVE", "User defined reaction rates array dimension 2 does not match number of grid cells")
314
+ return
315
+ end if
316
+ end if
317
+
318
+ call micm_solve_c(this%ptr, real(time_step, kind=c_double), c_loc(temperature), &
319
+ c_loc(pressure), c_loc(air_density), c_loc(concentrations), &
320
+ c_loc(user_defined_reaction_rates), &
321
+ solver_state_c, solver_stats_c, error_c)
322
+
323
+ solver_state = string_t(solver_state_c)
324
+ solver_stats = solver_stats_t(solver_stats_c)
325
+ error = error_t(error_c)
326
+
327
+ end subroutine solve_arrays
328
+
329
+ !> Solves the chemical system
330
+ !!
331
+ !! This function accepts c pointers and does not check their sizes.
332
+ !! The user is responsible for ensuring the sizes are correct.
333
+ subroutine solve_c_ptrs(this, time_step, temperature, pressure, air_density, &
334
+ concentrations, user_defined_reaction_rates, solver_state, solver_stats, error)
335
+ use iso_fortran_env, only: real64
239
336
  use musica_util, only: string_t, string_t_c, error_t_c, error_t
240
- class(micm_t) :: this
241
- real(c_double), intent(in) :: time_step
242
- real(c_double), target, intent(in) :: temperature(:)
243
- real(c_double), target, intent(in) :: pressure(:)
244
- real(c_double), target, intent(in) :: air_density(:)
245
- real(c_double), target, intent(inout) :: concentrations(:)
246
- real(c_double), target, intent(in) :: user_defined_reaction_rates(:)
247
- type(string_t), intent(out) :: solver_state
248
- type(solver_stats_t), intent(out) :: solver_stats
249
- type(error_t), intent(out) :: error
337
+ class(micm_t), intent(in) :: this
338
+ real(real64), intent(in) :: time_step
339
+ type(c_ptr), intent(in) :: temperature
340
+ type(c_ptr), intent(in) :: pressure
341
+ type(c_ptr), intent(in) :: air_density
342
+ type(c_ptr), intent(in) :: concentrations
343
+ type(c_ptr), intent(in) :: user_defined_reaction_rates
344
+ type(string_t), intent(out) :: solver_state
345
+ type(solver_stats_t), intent(out) :: solver_stats
346
+ type(error_t), intent(out) :: error
250
347
 
251
348
  type(string_t_c) :: solver_state_c
252
349
  type(solver_stats_t_c) :: solver_stats_c
253
350
  type(error_t_c) :: error_c
254
- type(c_ptr) :: temperature_c, pressure_c, air_density_c, concentrations_c, &
255
- user_defined_reaction_rates_c
256
-
257
- temperature_c = c_loc(temperature)
258
- pressure_c = c_loc(pressure)
259
- air_density_c = c_loc(air_density)
260
- concentrations_c = c_loc(concentrations)
261
- user_defined_reaction_rates_c = c_loc(user_defined_reaction_rates)
262
- call micm_solve_c(this%ptr, time_step, temperature_c, pressure_c, air_density_c, &
263
- concentrations_c, user_defined_reaction_rates_c, solver_state_c, &
264
- solver_stats_c, error_c)
351
+
352
+ call micm_solve_c(this%ptr, real(time_step, kind=c_double), temperature, pressure, &
353
+ air_density, concentrations, user_defined_reaction_rates, &
354
+ solver_state_c, solver_stats_c, error_c)
265
355
 
266
356
  solver_state = string_t(solver_state_c)
267
357
  solver_stats = solver_stats_t(solver_stats_c)
268
358
  error = error_t(error_c)
269
359
 
270
- end subroutine solve
360
+ end subroutine solve_c_ptrs
271
361
 
272
362
  !> Constructor for solver_stats_t object that takes ownership of solver_stats_t_c
273
363
  function solver_stats_t_constructor( c_solver_stats ) result( new_solver_stats )
@@ -359,8 +449,9 @@ contains
359
449
 
360
450
  !> Get the final time the solver iterated to
361
451
  function solver_stats_t_final_time( this ) result( final_time )
452
+ use iso_fortran_env, only: real64
362
453
  class(solver_stats_t), intent(in) :: this
363
- real :: final_time
454
+ real(real64) :: final_time
364
455
 
365
456
  final_time = this%final_time_
366
457
 
@@ -382,15 +473,16 @@ contains
382
473
  end function get_species_property_string
383
474
 
384
475
  function get_species_property_double(this, species_name, property_name, error) result(value)
476
+ use iso_fortran_env, only: real64
385
477
  use musica_util, only: error_t_c, error_t, to_c_string
386
478
  class(micm_t) :: this
387
479
  character(len=*), intent(in) :: species_name, property_name
388
480
  type(error_t), intent(inout) :: error
389
- real(c_double) :: value
481
+ real(real64) :: value
390
482
 
391
483
  type(error_t_c) :: error_c
392
- value = get_species_property_double_c(this%ptr, &
393
- to_c_string(species_name), to_c_string(property_name), error_c)
484
+ value = real( get_species_property_double_c( this%ptr, to_c_string(species_name), &
485
+ to_c_string(property_name), error_c ), kind=real64 )
394
486
  error = error_t(error_c)
395
487
  end function get_species_property_double
396
488
 
@@ -399,11 +491,11 @@ contains
399
491
  class(micm_t) :: this
400
492
  character(len=*), intent(in) :: species_name, property_name
401
493
  type(error_t), intent(inout) :: error
402
- integer(c_int) :: value
494
+ integer :: value
403
495
 
404
496
  type(error_t_c) :: error_c
405
- value = get_species_property_int_c(this%ptr, &
406
- to_c_string(species_name), to_c_string(property_name), error_c)
497
+ value = int( get_species_property_int_c(this%ptr, &
498
+ to_c_string(species_name), to_c_string(property_name), error_c) )
407
499
  error = error_t(error_c)
408
500
  end function get_species_property_int
409
501
 
@@ -48,6 +48,8 @@ if (MUSICA_ENABLE_MICM)
48
48
  LINKER_LANGUAGE Fortran
49
49
  )
50
50
 
51
+ target_compile_definitions(test_micm_fortran_api PUBLIC MICM_VECTOR_MATRIX_SIZE=${MUSICA_SET_MICM_VECTOR_MATRIX_SIZE})
52
+
51
53
  add_test(
52
54
  NAME test_micm_fortran_api
53
55
  COMMAND $<TARGET_FILE:test_micm_fortran_api>