disdrodb 0.2.1__py3-none-any.whl → 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. disdrodb/__init__.py +1 -1
  2. disdrodb/_config.py +1 -3
  3. disdrodb/_version.py +2 -2
  4. disdrodb/accessor/__init__.py +1 -1
  5. disdrodb/accessor/methods.py +9 -9
  6. disdrodb/api/checks.py +1 -3
  7. disdrodb/api/configs.py +1 -3
  8. disdrodb/api/create_directories.py +4 -6
  9. disdrodb/api/info.py +1 -3
  10. disdrodb/api/io.py +9 -8
  11. disdrodb/api/path.py +1 -3
  12. disdrodb/cli/disdrodb_check_metadata_archive.py +2 -2
  13. disdrodb/cli/disdrodb_check_products_options.py +44 -0
  14. disdrodb/cli/disdrodb_create_summary.py +48 -22
  15. disdrodb/cli/disdrodb_create_summary_station.py +39 -18
  16. disdrodb/cli/disdrodb_data_archive_directory.py +1 -3
  17. disdrodb/cli/disdrodb_download_archive.py +45 -24
  18. disdrodb/cli/disdrodb_download_metadata_archive.py +27 -16
  19. disdrodb/cli/disdrodb_download_station.py +56 -26
  20. disdrodb/cli/disdrodb_initialize_station.py +40 -20
  21. disdrodb/cli/disdrodb_metadata_archive_directory.py +1 -3
  22. disdrodb/cli/disdrodb_open_data_archive.py +16 -11
  23. disdrodb/cli/disdrodb_open_logs_directory.py +29 -18
  24. disdrodb/cli/disdrodb_open_metadata_archive.py +25 -11
  25. disdrodb/cli/disdrodb_open_metadata_directory.py +32 -20
  26. disdrodb/cli/disdrodb_open_product_directory.py +38 -21
  27. disdrodb/cli/disdrodb_open_readers_directory.py +1 -3
  28. disdrodb/cli/disdrodb_run.py +189 -0
  29. disdrodb/cli/disdrodb_run_l0.py +55 -64
  30. disdrodb/cli/disdrodb_run_l0_station.py +47 -52
  31. disdrodb/cli/disdrodb_run_l0a.py +47 -45
  32. disdrodb/cli/disdrodb_run_l0a_station.py +38 -37
  33. disdrodb/cli/disdrodb_run_l0b.py +45 -45
  34. disdrodb/cli/disdrodb_run_l0b_station.py +37 -36
  35. disdrodb/cli/disdrodb_run_l0c.py +50 -47
  36. disdrodb/cli/disdrodb_run_l0c_station.py +41 -38
  37. disdrodb/cli/disdrodb_run_l1.py +49 -45
  38. disdrodb/cli/disdrodb_run_l1_station.py +40 -37
  39. disdrodb/cli/disdrodb_run_l2e.py +50 -45
  40. disdrodb/cli/disdrodb_run_l2e_station.py +41 -37
  41. disdrodb/cli/disdrodb_run_l2m.py +49 -45
  42. disdrodb/cli/disdrodb_run_l2m_station.py +40 -37
  43. disdrodb/cli/disdrodb_run_station.py +184 -0
  44. disdrodb/cli/disdrodb_upload_archive.py +45 -35
  45. disdrodb/cli/disdrodb_upload_station.py +39 -32
  46. disdrodb/configs.py +13 -8
  47. disdrodb/constants.py +4 -2
  48. disdrodb/data_transfer/__init__.py +1 -3
  49. disdrodb/data_transfer/download_data.py +38 -54
  50. disdrodb/data_transfer/upload_data.py +1 -3
  51. disdrodb/data_transfer/zenodo.py +1 -3
  52. disdrodb/docs.py +1 -3
  53. disdrodb/etc/configs/attributes.yaml +52 -2
  54. disdrodb/etc/configs/encodings.yaml +45 -1
  55. disdrodb/etc/products/L0C/ODM470/global.yaml +5 -0
  56. disdrodb/etc/products/L0C/global.yaml +5 -0
  57. disdrodb/etc/products/L1/ODM470/global.yaml +6 -0
  58. disdrodb/etc/products/L1/global.yaml +0 -13
  59. disdrodb/etc/products/L2E/LPM/1MIN.yaml +1 -0
  60. disdrodb/etc/products/L2E/LPM/global.yaml +36 -0
  61. disdrodb/etc/products/L2E/LPM_V0/1MIN.yaml +1 -0
  62. disdrodb/etc/products/L2E/LPM_V0/global.yaml +36 -0
  63. disdrodb/etc/products/L2E/ODM470/1MIN.yaml +1 -0
  64. disdrodb/etc/products/L2E/ODM470/global.yaml +36 -0
  65. disdrodb/etc/products/L2E/PARSIVEL/1MIN.yaml +1 -0
  66. disdrodb/etc/products/L2E/PARSIVEL/global.yaml +36 -0
  67. disdrodb/etc/products/L2E/PARSIVEL2/1MIN.yaml +1 -0
  68. disdrodb/etc/products/L2E/PARSIVEL2/global.yaml +36 -0
  69. disdrodb/etc/products/L2E/PWS100/1MIN.yaml +1 -0
  70. disdrodb/etc/products/L2E/PWS100/global.yaml +36 -0
  71. disdrodb/etc/products/L2E/RD80/1MIN.yaml +19 -0
  72. disdrodb/etc/products/L2E/SWS250/1MIN.yaml +19 -0
  73. disdrodb/etc/products/L2E/global.yaml +16 -2
  74. disdrodb/fall_velocity/__init__.py +46 -0
  75. disdrodb/fall_velocity/graupel.py +483 -0
  76. disdrodb/fall_velocity/hail.py +287 -0
  77. disdrodb/{l1/fall_velocity.py → fall_velocity/rain.py} +264 -44
  78. disdrodb/issue/__init__.py +1 -3
  79. disdrodb/issue/checks.py +1 -3
  80. disdrodb/issue/reader.py +1 -3
  81. disdrodb/issue/writer.py +1 -3
  82. disdrodb/l0/__init__.py +1 -1
  83. disdrodb/l0/check_configs.py +25 -16
  84. disdrodb/l0/check_standards.py +1 -3
  85. disdrodb/l0/configs/ODM470/bins_diameter.yml +643 -0
  86. disdrodb/l0/configs/ODM470/bins_velocity.yml +0 -0
  87. disdrodb/l0/configs/ODM470/l0a_encodings.yml +11 -0
  88. disdrodb/l0/configs/ODM470/l0b_cf_attrs.yml +46 -0
  89. disdrodb/l0/configs/ODM470/l0b_encodings.yml +106 -0
  90. disdrodb/l0/configs/ODM470/raw_data_format.yml +111 -0
  91. disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +1 -1
  92. disdrodb/l0/l0_reader.py +1 -3
  93. disdrodb/l0/l0a_processing.py +1 -3
  94. disdrodb/l0/l0b_nc_processing.py +2 -4
  95. disdrodb/l0/l0b_processing.py +1 -3
  96. disdrodb/l0/l0c_processing.py +27 -11
  97. disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +1 -1
  98. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +1 -1
  99. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +1 -1
  100. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +1 -1
  101. disdrodb/l0/readers/LPM/GERMANY/DWD.py +190 -12
  102. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +47 -6
  103. disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +1 -1
  104. disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +5 -2
  105. disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +1 -3
  106. disdrodb/l0/readers/LPM/KIT/CHWALA.py +1 -3
  107. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +1 -1
  108. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +1 -1
  109. disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +1 -3
  110. disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +1 -3
  111. disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +1 -3
  112. disdrodb/l0/readers/LPM/SLOVENIA/UL.py +1 -3
  113. disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +1 -3
  114. disdrodb/l0/readers/LPM/UK/DIVEN.py +1 -1
  115. disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +1 -3
  116. disdrodb/l0/readers/LPM/USA/CHARLESTON.py +1 -3
  117. disdrodb/l0/readers/LPM_V0/BELGIUM/ULIEGE.py +1 -3
  118. disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +1 -1
  119. disdrodb/l0/readers/ODM470/OCEAN/OCEANRAIN.py +123 -0
  120. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +1 -1
  121. disdrodb/l0/readers/PARSIVEL/BASQUECOUNTRY/EUSKALMET_OTT.py +1 -1
  122. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +1 -3
  123. disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +1 -1
  124. disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +1 -1
  125. disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +1 -1
  126. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +1 -1
  127. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +1 -1
  128. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +1 -1
  129. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +1 -1
  130. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +1 -1
  131. disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +1 -1
  132. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +1 -1
  133. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +1 -1
  134. disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +1 -1
  135. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +1 -1
  136. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +1 -1
  137. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +1 -1
  138. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +1 -1
  139. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +1 -1
  140. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +1 -1
  141. disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +1 -1
  142. disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +1 -1
  143. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +1 -1
  144. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +1 -1
  145. disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +1 -1
  146. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +1 -1
  147. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +1 -1
  148. disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +1 -1
  149. disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +1 -1
  150. disdrodb/l0/readers/PARSIVEL/KOREA/ICEPOP_MSC.py +159 -0
  151. disdrodb/l0/readers/PARSIVEL/NASA/LPVEX.py +1 -1
  152. disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +1 -1
  153. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +1 -1
  154. disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +1 -1
  155. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +1 -1
  156. disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +1 -1
  157. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +1 -1
  158. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +1 -3
  159. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +1 -3
  160. disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +1 -1
  161. disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +1 -1
  162. disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +1 -1
  163. disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +1 -3
  164. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +1 -1
  165. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +1 -1
  166. disdrodb/l0/readers/PARSIVEL2/CANADA/UQAM_NC.py +1 -1
  167. disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +1 -1
  168. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +1 -1
  169. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +1 -1
  170. disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +1 -1
  171. disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +1 -3
  172. disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +1 -1
  173. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +1 -3
  174. disdrodb/l0/readers/PARSIVEL2/GREECE/NOA.py +4 -3
  175. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +1 -3
  176. disdrodb/l0/readers/PARSIVEL2/ITALY/HYDROX.py +5 -3
  177. disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +1 -1
  178. disdrodb/l0/readers/PARSIVEL2/KIT/BURKINA_FASO.py +1 -1
  179. disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +1 -1
  180. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_MSC.py +161 -0
  181. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_UCLM.py +126 -0
  182. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +1 -1
  183. disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +1 -1
  184. disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +1 -1
  185. disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +3 -1
  186. disdrodb/l0/readers/PARSIVEL2/NASA/NSSTC.py +1 -1
  187. disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +1 -1
  188. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +1 -1
  189. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +1 -1
  190. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +1 -1
  191. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +1 -1
  192. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +1 -1
  193. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +1 -1
  194. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +1 -1
  195. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +1 -3
  196. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
  197. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +1 -1
  198. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +1 -1
  199. disdrodb/l0/readers/PARSIVEL2/NORWAY/UIB.py +10 -2
  200. disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +1 -3
  201. disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +1 -1
  202. disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +1 -1
  203. disdrodb/l0/readers/PARSIVEL2/SPAIN/GRANADA.py +1 -3
  204. disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +1 -1
  205. disdrodb/l0/readers/PARSIVEL2/SWEDEN/SMHI.py +1 -1
  206. disdrodb/l0/readers/PARSIVEL2/USA/CSU.py +1 -1
  207. disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +1 -1
  208. disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +1 -3
  209. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +1 -3
  210. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +1 -1
  211. disdrodb/l0/readers/RD80/BRAZIL/ATTO_RD80.py +1 -3
  212. disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +1 -3
  213. disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +1 -3
  214. disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +1 -3
  215. disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +1 -3
  216. disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +1 -3
  217. disdrodb/l0/readers/SWS250/BELGIUM/KMI.py +1 -3
  218. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +1 -3
  219. disdrodb/l0/readers/template_reader_raw_text_data.py +1 -3
  220. disdrodb/l0/standards.py +4 -5
  221. disdrodb/l0/template_tools.py +1 -3
  222. disdrodb/l1/__init__.py +1 -1
  223. disdrodb/l1/classification.py +913 -0
  224. disdrodb/l1/processing.py +36 -106
  225. disdrodb/l1/resampling.py +8 -3
  226. disdrodb/l1_env/__init__.py +1 -1
  227. disdrodb/l1_env/routines.py +6 -6
  228. disdrodb/l2/__init__.py +1 -1
  229. disdrodb/l2/empirical_dsd.py +57 -31
  230. disdrodb/l2/processing.py +327 -62
  231. disdrodb/metadata/checks.py +1 -3
  232. disdrodb/metadata/download.py +4 -4
  233. disdrodb/metadata/geolocation.py +1 -3
  234. disdrodb/metadata/info.py +1 -3
  235. disdrodb/metadata/manipulation.py +1 -3
  236. disdrodb/metadata/reader.py +1 -3
  237. disdrodb/metadata/search.py +1 -3
  238. disdrodb/metadata/standards.py +1 -3
  239. disdrodb/metadata/writer.py +1 -3
  240. disdrodb/physics/__init__.py +17 -0
  241. disdrodb/physics/atmosphere.py +272 -0
  242. disdrodb/physics/water.py +130 -0
  243. disdrodb/physics/wrappers.py +62 -0
  244. disdrodb/psd/__init__.py +1 -1
  245. disdrodb/psd/fitting.py +22 -9
  246. disdrodb/psd/models.py +1 -1
  247. disdrodb/routines/__init__.py +5 -1
  248. disdrodb/routines/l0.py +26 -16
  249. disdrodb/routines/l1.py +8 -6
  250. disdrodb/routines/l2.py +8 -4
  251. disdrodb/routines/options.py +116 -73
  252. disdrodb/routines/options_validation.py +728 -0
  253. disdrodb/routines/wrappers.py +431 -11
  254. disdrodb/scattering/__init__.py +1 -1
  255. disdrodb/scattering/axis_ratio.py +6 -6
  256. disdrodb/scattering/permittivity.py +8 -8
  257. disdrodb/scattering/routines.py +31 -13
  258. disdrodb/summary/__init__.py +1 -1
  259. disdrodb/summary/routines.py +83 -25
  260. disdrodb/utils/__init__.py +1 -1
  261. disdrodb/utils/archiving.py +16 -9
  262. disdrodb/utils/attrs.py +4 -3
  263. disdrodb/utils/cli.py +8 -10
  264. disdrodb/utils/compression.py +9 -11
  265. disdrodb/utils/dask.py +2 -3
  266. disdrodb/utils/dataframe.py +1 -3
  267. disdrodb/utils/decorators.py +1 -3
  268. disdrodb/utils/dict.py +1 -1
  269. disdrodb/utils/directories.py +3 -5
  270. disdrodb/utils/encoding.py +2 -4
  271. disdrodb/utils/event.py +1 -1
  272. disdrodb/utils/list.py +1 -3
  273. disdrodb/utils/logger.py +1 -3
  274. disdrodb/utils/manipulations.py +175 -5
  275. disdrodb/utils/pydantic.py +80 -0
  276. disdrodb/utils/routines.py +1 -3
  277. disdrodb/utils/subsetting.py +1 -1
  278. disdrodb/utils/time.py +3 -2
  279. disdrodb/utils/warnings.py +1 -3
  280. disdrodb/utils/writer.py +1 -3
  281. disdrodb/utils/xarray.py +30 -3
  282. disdrodb/utils/yaml.py +1 -3
  283. disdrodb/viz/__init__.py +1 -1
  284. disdrodb/viz/plots.py +192 -18
  285. {disdrodb-0.2.1.dist-info → disdrodb-0.3.0.dist-info}/METADATA +2 -2
  286. disdrodb-0.3.0.dist-info/RECORD +358 -0
  287. {disdrodb-0.2.1.dist-info → disdrodb-0.3.0.dist-info}/entry_points.txt +3 -0
  288. disdrodb/etc/products/L1/1MIN.yaml +0 -13
  289. disdrodb/etc/products/L1/LPM/1MIN.yaml +0 -13
  290. disdrodb/etc/products/L1/LPM_V0/1MIN.yaml +0 -13
  291. disdrodb/etc/products/L1/PARSIVEL/1MIN.yaml +0 -13
  292. disdrodb/etc/products/L1/PARSIVEL2/1MIN.yaml +0 -13
  293. disdrodb/etc/products/L1/PWS100/1MIN.yaml +0 -13
  294. disdrodb/etc/products/L1/RD80/1MIN.yaml +0 -13
  295. disdrodb/etc/products/L1/SWS250/1MIN.yaml +0 -13
  296. disdrodb/etc/products/L2M/10MIN.yaml +0 -12
  297. disdrodb/l1/beard_model.py +0 -662
  298. disdrodb/l1/filters.py +0 -205
  299. disdrodb-0.2.1.dist-info/RECORD +0 -329
  300. {disdrodb-0.2.1.dist-info → disdrodb-0.3.0.dist-info}/WHEEL +0 -0
  301. {disdrodb-0.2.1.dist-info → disdrodb-0.3.0.dist-info}/licenses/LICENSE +0 -0
  302. {disdrodb-0.2.1.dist-info → disdrodb-0.3.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,287 @@
1
+ # -----------------------------------------------------------------------------.
2
+ # Copyright (c) 2021-2026 DISDRODB developers
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ # -----------------------------------------------------------------------------.
17
+ """Theoretical models to estimate hailstones fall velocity based on particle maximum diameter in mm."""
18
+ import numpy as np
19
+ import xarray as xr
20
+
21
+ from disdrodb.constants import DIAMETER_DIMENSION
22
+ from disdrodb.l0.l0b_processing import ensure_valid_geolocation
23
+ from disdrodb.l1_env.routines import load_env_dataset
24
+ from disdrodb.physics.wrappers import retrieve_air_pressure
25
+ from disdrodb.utils.warnings import suppress_warnings
26
+
27
+
28
+ def get_fall_velocity_laurie_1960(diameter):
29
+ """Get hailstones fall velocity based on Laurie 1960 data.
30
+
31
+ The parametrizazion is reported in Table 3 of Heymsfield et al., 2018.
32
+
33
+ Parameters
34
+ ----------
35
+ diameter : array-like or float
36
+ Particle maximum diameter in millimeters [mm].
37
+
38
+
39
+ Returns
40
+ -------
41
+ fall_velocity : array-like or float
42
+ Terminal fall velocity [m s⁻¹].
43
+
44
+ References
45
+ ----------
46
+ Heymsfield, A., M. Szakáll, A. Jost, I. Giammanco, and R. Wright, 2018.
47
+ A Comprehensive Observational Study of Graupel and Hail Terminal Velocity, Mass Flux, and Kinetic Energy.
48
+ J. Atmos. Sci., 75, 3861-3885, https://doi.org/10.1175/JAS-D-18-0035.1.
49
+ """
50
+ fall_velocity = 13.95 * (0.1 * diameter) ** 0.51
51
+ return fall_velocity
52
+
53
+
54
+ def get_fall_velocity_knight_1983_low_density(diameter):
55
+ """Get low-density hailstones fall velocity based on Knight et al. 1983.
56
+
57
+ The parametrization is reported in Figure 3 of Knight et al. 1983.
58
+ It's valid for hail stone density between 0.31 and 0.61 g cm-3.
59
+
60
+ Parameters
61
+ ----------
62
+ diameter : array-like or float
63
+ Particle maximum diameter in millimeters [mm].
64
+
65
+
66
+ Returns
67
+ -------
68
+ fall_velocity : array-like or float
69
+ Terminal fall velocity [m s⁻¹].
70
+
71
+ References
72
+ ----------
73
+ Knight, N. C., and A. J. Heymsfield, 1983.
74
+ Measurement and Interpretation of Hailstone Density and Terminal Velocity.
75
+ J. Atmos. Sci., 40, 1510-1516. https://doi.org/10.1175/1520-0469(1983)040<1510:MAIOHD>2.0.CO;2.
76
+ """
77
+ fall_velocity = 8.445 * (0.1 * diameter) ** 0.553
78
+ return fall_velocity
79
+
80
+
81
+ def get_fall_velocity_knight_1983_high_density(diameter):
82
+ """Get low-density hailstones fall velocity based on Knight et al. 1983.
83
+
84
+ The parametrization is reported in Figure 6 of Knight et al. 1983.
85
+ It's valid for hail stone density around 0.82 g cm-3.
86
+
87
+ Parameters
88
+ ----------
89
+ diameter : array-like or float
90
+ Particle maximum diameter in millimeters [mm].
91
+
92
+
93
+ Returns
94
+ -------
95
+ fall_velocity : array-like or float
96
+ Terminal fall velocity [m s⁻¹].
97
+
98
+ References
99
+ ----------
100
+ Knight, N. C., and A. J. Heymsfield, 1983.
101
+ Measurement and Interpretation of Hailstone Density and Terminal Velocity.
102
+ J. Atmos. Sci., 40, 1510-1516. https://doi.org/10.1175/1520-0469(1983)040<1510:MAIOHD>2.0.CO;2.
103
+ """
104
+ fall_velocity = 10.58 * (0.1 * diameter) ** 0.267
105
+ return fall_velocity
106
+
107
+
108
+ def get_fall_velocity_heymsfield_2014(diameter):
109
+ """Get hail fall velocity from Heymsfield et al., 2014.
110
+
111
+ Use the Heymsfield et al., 2014 parameterization.
112
+
113
+ Parameters
114
+ ----------
115
+ diameter : array-like or float
116
+ Maximum Particle maximum diameter in millimeters [mm].
117
+
118
+ Returns
119
+ -------
120
+ fall_velocity : xarray.DataArray or numpy.ndarray
121
+ Terminal fall velocity [m s⁻¹].
122
+
123
+ References
124
+ ----------
125
+ Heymsfield, A. J., I. M. Giammanco, and R. Wright (2014).
126
+ Terminal velocities and kinetic energies of natural hailstones.
127
+ Geophys. Res. Lett., 41, 8666-8672, https://doi.org/10.1002/2014GL062324
128
+ """
129
+ fall_velocity = 12.28 * (0.1 * diameter) ** 0.57 # Dmax > 1.3 mm
130
+ return fall_velocity
131
+
132
+
133
+ def get_fall_velocity_heymsfield_2018(diameter):
134
+ """Get hailstones fall velocity from Heymsfield et al., 2018.
135
+
136
+ Parameters
137
+ ----------
138
+ diameter : array-like or float
139
+ Particle maximum diameter in millimeters [mm].
140
+
141
+ Returns
142
+ -------
143
+ fall_velocity : array-like or float
144
+ Terminal fall velocity [m s⁻¹].
145
+
146
+ References
147
+ ----------
148
+ Heymsfield, A., M. Szakáll, A. Jost, I. Giammanco, and R. Wright, 2018.
149
+ A Comprehensive Observational Study of Graupel and Hail Terminal Velocity, Mass Flux, and Kinetic Energy.
150
+ J. Atmos. Sci., 75, 3861-3885, https://doi.org/10.1175/JAS-D-18-0035.1.
151
+
152
+ Heymsfield, A., M. Szakáll, A. Jost, I. Giammanco, R. Wright, and J. Brimelow, 2020.
153
+ CORRIGENDUM.
154
+ J. Atmos. Sci., 77, 405-412, https://doi.org/10.1175/JAS-D-19-0185.1.
155
+ """
156
+ # Original incorrect formula from Heymsfield et al., 2018
157
+ # fall_velocity = 6.1 * (0.1 * diameter) ** 0.72 # eq 7 and 15
158
+
159
+ # Corrected formula from Heymsfield et al., 2020 (Corrigendum)
160
+ fall_velocity = 8.39 * (0.1 * diameter) ** 0.67
161
+ return fall_velocity
162
+
163
+
164
+ def get_fall_velocity_fehlmann_2020(diameter):
165
+ """Get hailstones fall velocity from Fehlmann et al., 2020."""
166
+ fall_velocity = 3.74 * diameter**0.5
167
+ return fall_velocity
168
+
169
+
170
+ ####------------------------------------------------------------------------------------
171
+ #### Wrappers
172
+
173
+
174
+ HAIL_FALL_VELOCITY_MODELS = {
175
+ "Laurie1960": get_fall_velocity_laurie_1960,
176
+ "Knight1983LD": get_fall_velocity_knight_1983_low_density,
177
+ "Knight1983HD": get_fall_velocity_knight_1983_high_density,
178
+ "Heymsfield2014": get_fall_velocity_heymsfield_2014,
179
+ "Heymsfield2018": get_fall_velocity_heymsfield_2018,
180
+ "Fehlmann2020": get_fall_velocity_fehlmann_2020,
181
+ }
182
+
183
+
184
+ def available_hail_fall_velocity_models():
185
+ """Return a list of the available hail fall velocity models."""
186
+ return list(HAIL_FALL_VELOCITY_MODELS)
187
+
188
+
189
+ def check_hail_fall_velocity_model(model):
190
+ """Check validity of the specified hail fall velocity model."""
191
+ available_models = available_hail_fall_velocity_models()
192
+ if model not in available_models:
193
+ raise ValueError(f"{model} is an invalid hail fall velocity model. Valid models: {available_models}.")
194
+ return model
195
+
196
+
197
+ def get_hail_fall_velocity_model(model):
198
+ """Return the specified hail fall velocity model.
199
+
200
+ Parameters
201
+ ----------
202
+ model : str
203
+ The model to use for calculating the rain drop fall velocity. Available models are:
204
+ 'Laurie1960', 'Knight1983LD', 'Knight1983HD', 'Heymsfield2014', 'Heymsfield2018', 'Fehlmann2020'.
205
+
206
+ Returns
207
+ -------
208
+ callable
209
+ A function which compute the hail fall velocity model
210
+ given the rain drop diameter in mm.
211
+
212
+ Notes
213
+ -----
214
+ This function serves as a wrapper to various hail fall velocity models.
215
+ It returns the appropriate model based on the `model` parameter.
216
+ """
217
+ model = check_hail_fall_velocity_model(model)
218
+ return HAIL_FALL_VELOCITY_MODELS[model]
219
+
220
+
221
+ def get_hail_fall_velocity(diameter, model, ds_env=None, minimum_diameter=4):
222
+ """Calculate the fall velocity of hails based on their diameter.
223
+
224
+ Parameters
225
+ ----------
226
+ diameter : array-like
227
+ The diameter of the hails in millimeters.
228
+ model : str
229
+ The model to use for calculating the hail fall velocity. Must be one of the following:
230
+ 'Laurie1960', 'Knight1983LD', 'Knight1983HD', 'Heymsfield2014', 'Heymsfield2018', 'Fehlmann2020'.
231
+ ds_env : xr.Dataset, optional
232
+ A dataset containing the following environmental variables:
233
+ - 'altitude' (m)
234
+ - 'latitude' (°)
235
+ - 'temperature' : Temperature in degrees Kelvin (K).
236
+ - 'relative_humidity' : Relative humidity. A value between 0 and 1.
237
+ - 'sea_level_air_pressure' : Sea level air pressure in Pascals (Pa).
238
+ - 'lapse_rate' : Lapse rate in degrees Celsius per meter (°C/m).
239
+ If not specified, sensible default values are used.
240
+
241
+ Returns
242
+ -------
243
+ fall_velocity : xr.DataArray
244
+ The calculated hail fall velocities per diameter.
245
+
246
+ """
247
+ # Check valid method
248
+ model = check_hail_fall_velocity_model(model)
249
+
250
+ # Copy diameter
251
+ if isinstance(diameter, xr.DataArray):
252
+ diameter = diameter.copy()
253
+ else:
254
+ diameter = np.atleast_1d(diameter)
255
+ diameter = xr.DataArray(diameter, dims=DIAMETER_DIMENSION, coords={DIAMETER_DIMENSION: diameter.copy()})
256
+
257
+ # Initialize ds_env if None
258
+ # --> Ensure valid altitude and geolocation
259
+ # - altitude requiredto correct for elevation (air_density)
260
+ # - latitude required for gravity
261
+ if ds_env is None:
262
+ ds_env = load_env_dataset()
263
+ for coord in ["altitude", "latitude"]:
264
+ ds_env = ensure_valid_geolocation(ds_env, coord=coord, errors="raise")
265
+
266
+ # Retrieve fall velocity
267
+ func = get_hail_fall_velocity_model(model)
268
+ with suppress_warnings(): # e.g. when diameter = 0
269
+ fall_velocity = func(diameter)
270
+
271
+ # Correct for altitude
272
+ air_pressure = retrieve_air_pressure(ds_env)
273
+ correction_factor = (101325 / air_pressure) ** 0.545
274
+ fall_velocity = fall_velocity * correction_factor
275
+
276
+ # Set to NaN for diameter outside [5, ...)
277
+ fall_velocity = fall_velocity.where(diameter > minimum_diameter)
278
+
279
+ # Ensure fall velocity is > 0 to avoid division by zero
280
+ # - Some models, at small diameter, can return negative/zero fall velocity
281
+ fall_velocity = fall_velocity.where(fall_velocity > 0)
282
+
283
+ # Add attributes
284
+ fall_velocity.name = "fall_velocity"
285
+ fall_velocity.attrs["units"] = "m/s"
286
+ fall_velocity.attrs["model"] = model
287
+ return fall_velocity.squeeze()
@@ -1,5 +1,5 @@
1
1
  # -----------------------------------------------------------------------------.
2
- # Copyright (c) 2021-2023 DISDRODB developers
2
+ # Copyright (c) 2021-2026 DISDRODB developers
3
3
  #
4
4
  # This program is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -21,6 +21,7 @@ import xarray as xr
21
21
  from disdrodb.constants import DIAMETER_DIMENSION
22
22
  from disdrodb.l0.l0b_processing import ensure_valid_geolocation
23
23
  from disdrodb.l1_env.routines import load_env_dataset
24
+ from disdrodb.physics.wrappers import retrieve_air_density
24
25
  from disdrodb.utils.warnings import suppress_warnings
25
26
 
26
27
 
@@ -138,8 +139,159 @@ def get_fall_velocity_van_dijk_2002(diameter):
138
139
  return fall_velocity
139
140
 
140
141
 
141
- def get_fall_velocity_beard_1976(diameter, ds_env):
142
- """Calculate the fall velocity of a particle using the Beard (1976) model.
142
+ ####---------------------------------------------------------------------------.
143
+ #### Beard model
144
+
145
+
146
+ def get_raindrop_reynolds_number(diameter, temperature, air_density, water_density, g):
147
+ """Compute raindrop Reynolds number.
148
+
149
+ It quantifies the relative strength of the convective inertia and linear viscous
150
+ forces acting on the drop at terminal velocity.
151
+
152
+ Estimates Reynolds number for drops with diameter between 19 um and 7 mm.
153
+ Coefficients are taken from Table 1 of Beard 1976.
154
+
155
+ Reference: Beard 1976; Pruppacher & Klett 1978
156
+ See also Table A1 in Rahman et al., 2020.
157
+
158
+ Parameters
159
+ ----------
160
+ diameter : float
161
+ Diameter of the raindrop in meters.
162
+ temperature : float
163
+ Temperature in Kelvin.
164
+ air_density : float
165
+ Density of air in kg/m^3.
166
+ water_density : float
167
+ Density of water in kg/m^3.
168
+ g : float
169
+ Gravitational acceleration in m/s^2.
170
+
171
+ Returns
172
+ -------
173
+ float
174
+ Reynolds number for the raindrop.
175
+ """
176
+ from disdrodb.physics.atmosphere import get_air_dynamic_viscosity
177
+ from disdrodb.physics.water import get_pure_water_surface_tension
178
+
179
+ # Define mask for small and large particles
180
+ small_diam_mask = diameter < 1.07e-3 # < 1mm
181
+
182
+ # Compute properties
183
+ pure_water_surface_tension = get_pure_water_surface_tension(temperature) # N/m
184
+ air_viscosity = get_air_dynamic_viscosity(temperature) # kg/(m*s) (aka Pa*s).
185
+ delta_density = water_density - air_density
186
+
187
+ # Compute Davies number for small droplets
188
+ davis_number = 4 * air_density * delta_density * g * diameter**3 / (3 * air_viscosity**2)
189
+
190
+ # Compute the slip correction (is approx 1 and can be discarded)
191
+ # l0 = 6.62*1e-8 # m
192
+ # v0 = 0.01818 # g / m / s
193
+ # p0 = 101_325_25 # Pa
194
+ # t0 = 293.15 # K
195
+ # c_sc = 1 + 2.51*l0*(air_viscosity/v0)*(air_pressure/p0)*((temperature/t0)**3)/diameter
196
+
197
+ # Compute modified Bond and physical property numbers for large droplets
198
+ bond_number = 4 * delta_density * g * diameter**2 / (3 * pure_water_surface_tension)
199
+ property_number = pure_water_surface_tension**3 * air_density**2 / (air_viscosity**4 * delta_density * g)
200
+
201
+ # Compute Reynolds_number_for small particles (diameter < 0.00107) (1 mm)
202
+ b = [-3.18657, 0.992696, -0.00153193, -0.000987059, -0.000578878, 0.0000855176, -0.00000327815]
203
+ x = np.log(davis_number)
204
+ y = b[0] + sum(b * x**i for i, b in enumerate(b[1:], start=1))
205
+ reynolds_number_small = np.exp(y) # TODO: miss C_sc = slip correction factor ?
206
+
207
+ # Compute Reynolds_number_for large particles (diameter >= 0.00107)
208
+ b = [-5.00015, 5.23778, -2.04914, 0.475294, -0.0542819, 0.00238449]
209
+ log_property_number = np.log(property_number) / 6
210
+ x = np.log(bond_number) + log_property_number
211
+ y = b[0] + sum(b * x**i for i, b in enumerate(b[1:], start=1))
212
+ reynolds_number_large = np.exp(log_property_number + y)
213
+
214
+ # Define final reynolds number
215
+ reynolds_number = xr.where(small_diam_mask, reynolds_number_small, reynolds_number_large)
216
+ return reynolds_number
217
+
218
+
219
+ def get_drag_coefficient(diameter, air_density, water_density, fall_velocity, g=9.81):
220
+ """
221
+ Computes the drag coefficient for a raindrop.
222
+
223
+ Parameters
224
+ ----------
225
+ diameter : float
226
+ Diameter of the raindrop in meters.
227
+ air_density : float
228
+ Density of air in kg/m^3.
229
+ water_density : float
230
+ Density of water in kg/m^3.
231
+ fall_velocity : float
232
+ Terminal fall velocity of the raindrop in m/s.
233
+ g : float
234
+ Gravitational acceleration in m/s^2.
235
+
236
+ Returns
237
+ -------
238
+ float
239
+ Drag coefficient of the raindrop.
240
+ """
241
+ delta_density = water_density - air_density
242
+ drag_coefficient = 4 * delta_density * g * diameter / (3 * air_density * fall_velocity**2)
243
+ return drag_coefficient
244
+
245
+
246
+ def get_raindrop_beard1976_fall_velocity(diameter, temperature, air_density, water_density, g):
247
+ """
248
+ Computes the terminal fall velocity of a raindrop in still air.
249
+
250
+ Reference: Beard 1976; Pruppacher & Klett 1978
251
+
252
+ Parameters
253
+ ----------
254
+ diameter : float
255
+ Diameter of the raindrop in millimeters.
256
+ temperature : float
257
+ Temperature in Kelvin.
258
+ air_density : float
259
+ Density of air in kg/m^3.
260
+ water_density : float
261
+ Density of water in kg/m^3.
262
+ g : float
263
+ Gravitational acceleration in m/s^2.
264
+
265
+ Returns
266
+ -------
267
+ float
268
+ Terminal fall velocity of the raindrop in m/s.
269
+ """
270
+ from disdrodb.physics.atmosphere import get_air_dynamic_viscosity
271
+
272
+ # Convert diameter to meter
273
+ diameter = diameter / 1000
274
+
275
+ # Compute air viscotiy and reynolds number
276
+ air_viscosity = get_air_dynamic_viscosity(temperature)
277
+ reynolds_number = get_raindrop_reynolds_number(
278
+ diameter=diameter,
279
+ temperature=temperature,
280
+ air_density=air_density,
281
+ water_density=water_density,
282
+ g=g,
283
+ )
284
+ # Compute fall velocity
285
+ fall_velocity = air_viscosity * reynolds_number / (air_density * diameter)
286
+ return fall_velocity
287
+
288
+
289
+ def retrieve_raindrop_beard_fall_velocity(
290
+ diameter,
291
+ ds_env,
292
+ ):
293
+ """
294
+ Computes the terminal fall velocity for liquid raindrops using the Beard (1976) model.
143
295
 
144
296
  Parameters
145
297
  ----------
@@ -150,56 +302,118 @@ def get_fall_velocity_beard_1976(diameter, ds_env):
150
302
  - 'altitude' : Altitude in meters (m).
151
303
  - 'latitude' : Latitude in degrees.
152
304
  - 'temperature' : Temperature in degrees Kelvin (K).
153
- - 'relative_humidity' : Relative humidity in percentage (%).
154
- - 'sea_level_air_pressure' : Sea level air pressure in Pascals (Pa).
155
- - 'air_pressure': Air pressure in Pascals (Pa).
156
- - 'lapse_rate' : Lapse rate in degrees Celsius per meter (°C/m).
305
+ - 'relative_humidity' : Relative humidity between 0 and 1.
306
+ - 'sea_level_air_pressure' : Standard atmospheric pressure at sea level in Pascals (Pa).
307
+ The default is 101_325 Pa.
308
+ - 'air_pressure': Air pressure in Pascals (Pa). If None, air_pressure at altitude is inferred.
309
+ - 'lapse_rate' : Atmospheric lapse rate in degrees Celsius or Kelvin per meter (°C/m).
310
+ The default is 0.0065 K/m.
311
+ - 'gas_constant_dry_air': Gas constant for dry air in J/(kg*K).
312
+ The default is 287.04 is J/(kg*K).
157
313
 
158
314
  Returns
159
315
  -------
160
316
  fall_velocity : array-like
161
- The calculated fall velocities of the raindrops.
317
+ Terminal fall velocity for liquid raindrops.
162
318
  """
163
- from disdrodb.l1.beard_model import retrieve_fall_velocity
164
-
165
- # Input diameter in mmm
166
- fall_velocity = retrieve_fall_velocity(
167
- diameter=diameter / 1000, # diameter expected in m !!!
168
- altitude=ds_env["altitude"],
169
- latitude=ds_env["latitude"],
170
- temperature=ds_env["temperature"],
171
- relative_humidity=ds_env["relative_humidity"],
172
- air_pressure=ds_env.get("air_pressure", None),
173
- sea_level_air_pressure=ds_env["sea_level_air_pressure"],
174
- lapse_rate=ds_env["lapse_rate"],
319
+ from disdrodb.physics.atmosphere import (
320
+ get_air_density,
321
+ get_air_pressure_at_height,
322
+ get_gravitational_acceleration,
323
+ get_vapor_actual_pressure,
324
+ )
325
+ from disdrodb.physics.water import get_water_density
326
+
327
+ # Retrieve relevant variables from ENV dataset
328
+ altitude = ds_env["altitude"]
329
+ latitude = ds_env["latitude"]
330
+ temperature = ds_env["temperature"]
331
+ relative_humidity = ds_env["relative_humidity"]
332
+ air_pressure = ds_env.get("air_pressure", None)
333
+ sea_level_air_pressure = ds_env.get("sea_level_air_pressure", 101_325)
334
+ gas_constant_dry_air = ds_env.get("gas_constant_dry_air", 287.04)
335
+ lapse_rate = ds_env.get("lapse_rate", 0.0065)
336
+
337
+ # Retrieve air pressure at altitude if not specified
338
+ if air_pressure is None:
339
+ air_pressure = get_air_pressure_at_height(
340
+ altitude=altitude,
341
+ latitude=latitude,
342
+ temperature=temperature,
343
+ sea_level_air_pressure=sea_level_air_pressure,
344
+ lapse_rate=lapse_rate,
345
+ gas_constant_dry_air=gas_constant_dry_air,
346
+ )
347
+
348
+ # Retrieve vapour pressure (from relative humidity)
349
+ vapor_pressure = get_vapor_actual_pressure(
350
+ relative_humidity=relative_humidity,
351
+ temperature=temperature,
175
352
  )
353
+
354
+ # Retrieve air density
355
+ air_density = get_air_density(
356
+ temperature=temperature,
357
+ air_pressure=air_pressure,
358
+ vapor_pressure=vapor_pressure,
359
+ gas_constant_dry_air=gas_constant_dry_air,
360
+ )
361
+
362
+ # Retrieve water density
363
+ water_density = get_water_density(
364
+ temperature=temperature,
365
+ air_pressure=air_pressure,
366
+ sea_level_air_pressure=sea_level_air_pressure,
367
+ )
368
+
369
+ # Retrieve accurate gravitational_acceleration
370
+ g = get_gravitational_acceleration(altitude=altitude, latitude=latitude)
371
+
372
+ # Compute fall velocity
373
+ fall_velocity = get_raindrop_beard1976_fall_velocity(
374
+ diameter=diameter,
375
+ temperature=temperature,
376
+ air_density=air_density,
377
+ water_density=water_density,
378
+ g=g,
379
+ )
380
+
381
+ # drag_coefficient = get_drag_coefficient(diameter=diameter,
382
+ # air_density=air_density,
383
+ # water_density=water_density,
384
+ # g=g.
385
+ # fall_velocity=fall_velocity)
386
+
387
+ # Clip output
176
388
  fall_velocity = fall_velocity.clip(min=0, max=None)
177
389
  return fall_velocity
178
390
 
179
391
 
180
- RAINDROP_FALL_VELOCITY_MODELS = {
392
+ #### --------------------------------------------------------------------------------------
393
+ #### WRAPPERS
394
+ RAIN_FALL_VELOCITY_MODELS = {
181
395
  "Atlas1973": get_fall_velocity_atlas_1973,
182
- "Beard1976": get_fall_velocity_beard_1976,
396
+ "Beard1976": retrieve_raindrop_beard_fall_velocity,
183
397
  "Brandes2002": get_fall_velocity_brandes_2002,
184
398
  "Uplinger1981": get_fall_velocity_uplinger_1981,
185
399
  "VanDijk2002": get_fall_velocity_van_dijk_2002,
186
400
  }
187
401
 
188
402
 
189
- def available_raindrop_fall_velocity_models():
403
+ def available_rain_fall_velocity_models():
190
404
  """Return a list of the available raindrop fall velocity models."""
191
- return list(RAINDROP_FALL_VELOCITY_MODELS)
405
+ return list(RAIN_FALL_VELOCITY_MODELS)
192
406
 
193
407
 
194
- def check_raindrop_fall_velocity_model(model):
408
+ def check_rain_fall_velocity_model(model):
195
409
  """Check validity of the specified raindrop fall velocity model."""
196
- available_models = available_raindrop_fall_velocity_models()
410
+ available_models = available_rain_fall_velocity_models()
197
411
  if model not in available_models:
198
412
  raise ValueError(f"{model} is an invalid raindrop fall velocity model. Valid models: {available_models}.")
199
413
  return model
200
414
 
201
415
 
202
- def get_raindrop_fall_velocity_model(model):
416
+ def get_rain_fall_velocity_model(model):
203
417
  """Return the specified raindrop fall velocity model.
204
418
 
205
419
  Parameters
@@ -219,11 +433,11 @@ def get_raindrop_fall_velocity_model(model):
219
433
  This function serves as a wrapper to various raindrop fall velocity models.
220
434
  It returns the appropriate model based on the `model` parameter.
221
435
  """
222
- model = check_raindrop_fall_velocity_model(model)
223
- return RAINDROP_FALL_VELOCITY_MODELS[model]
436
+ model = check_rain_fall_velocity_model(model)
437
+ return RAIN_FALL_VELOCITY_MODELS[model]
224
438
 
225
439
 
226
- def get_raindrop_fall_velocity(diameter, model, ds_env=None):
440
+ def get_rain_fall_velocity(diameter, model, ds_env=None):
227
441
  """Calculate the fall velocity of raindrops based on their diameter.
228
442
 
229
443
  Parameters
@@ -261,7 +475,7 @@ def get_raindrop_fall_velocity(diameter, model, ds_env=None):
261
475
 
262
476
  """
263
477
  # Check valid method
264
- model = check_raindrop_fall_velocity_model(model)
478
+ model = check_rain_fall_velocity_model(model)
265
479
 
266
480
  # Copy diameter
267
481
  if isinstance(diameter, xr.DataArray):
@@ -270,24 +484,31 @@ def get_raindrop_fall_velocity(diameter, model, ds_env=None):
270
484
  diameter = np.atleast_1d(diameter)
271
485
  diameter = xr.DataArray(diameter, dims=DIAMETER_DIMENSION, coords={DIAMETER_DIMENSION: diameter.copy()})
272
486
 
273
- # Initialize ds_env if None and method == "Beard1976"
274
- if model == "Beard1976":
275
- if ds_env is None:
276
- ds_env = load_env_dataset()
487
+ # Initialize ds_env
488
+ if ds_env is None:
489
+ ds_env = load_env_dataset()
277
490
 
278
- # Ensure valid altitude and geolocation
279
- # - altitude required by Beard
280
- # - latitude required for gravity
281
- for coord in ["altitude", "latitude"]:
282
- ds_env = ensure_valid_geolocation(ds_env, coord=coord, errors="raise")
491
+ # Ensure valid altitude and geolocation
492
+ # - altitude required by Beard
493
+ # - latitude required for gravity
494
+ for coord in ["altitude", "latitude"]:
495
+ ds_env = ensure_valid_geolocation(ds_env, coord=coord, errors="raise")
283
496
 
284
497
  # Retrieve fall velocity
285
- func = get_raindrop_fall_velocity_model(model)
498
+ func = get_rain_fall_velocity_model(model)
286
499
  with suppress_warnings(): # e.g. when diameter = 0 for Beard1976
287
500
  fall_velocity = func(diameter, ds_env=ds_env) if model == "Beard1976" else func(diameter)
288
501
 
502
+ # Correct for altitude
503
+ if model != "Beard1976":
504
+ air_density_height = retrieve_air_density(ds_env)
505
+ air_density_sea_surface = 1.225 # kg/m3 (International Standard Atmosphere air density at sea level)
506
+ correction_factor = (air_density_sea_surface / air_density_height) ** (diameter * 0.025 + 0.375)
507
+ fall_velocity = fall_velocity * correction_factor
508
+
289
509
  # Set to NaN for diameter outside [0, 10)
290
510
  fall_velocity = fall_velocity.where(diameter < 10).where(diameter > 0)
511
+
291
512
  # Ensure fall velocity is > 0 to avoid division by zero
292
513
  # - Some models, at small diameter, can return negative/zero fall velocity
293
514
  fall_velocity = fall_velocity.where(fall_velocity > 0)
@@ -299,7 +520,7 @@ def get_raindrop_fall_velocity(diameter, model, ds_env=None):
299
520
  return fall_velocity.squeeze()
300
521
 
301
522
 
302
- def get_raindrop_fall_velocity_from_ds(ds, ds_env=None, model="Beard1976"):
523
+ def get_rain_fall_velocity_from_ds(ds, ds_env=None, model="Beard1976", diameter="diameter_bin_center"):
303
524
  """Compute the raindrop fall velocity.
304
525
 
305
526
  Parameters
@@ -349,6 +570,5 @@ def get_raindrop_fall_velocity_from_ds(ds, ds_env=None, model="Beard1976"):
349
570
  ds_env = load_env_dataset(ds)
350
571
 
351
572
  # Compute raindrop fall velocity
352
- fall_velocity = get_raindrop_fall_velocity(diameter=ds["diameter_bin_center"], model=model, ds_env=ds_env) # mn
353
-
573
+ fall_velocity = get_rain_fall_velocity(diameter=ds[diameter], model=model, ds_env=ds_env) # mn
354
574
  return fall_velocity