disdrodb 0.2.0__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 (315) 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 +18 -11
  6. disdrodb/api/checks.py +2 -4
  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 +15 -9
  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 +1 -14
  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 +17 -3
  74. disdrodb/etc/products/L2M/global.yaml +1 -1
  75. disdrodb/fall_velocity/__init__.py +46 -0
  76. disdrodb/fall_velocity/graupel.py +483 -0
  77. disdrodb/fall_velocity/hail.py +287 -0
  78. disdrodb/{l1/fall_velocity.py → fall_velocity/rain.py} +265 -50
  79. disdrodb/issue/__init__.py +1 -3
  80. disdrodb/issue/checks.py +3 -5
  81. disdrodb/issue/reader.py +1 -3
  82. disdrodb/issue/writer.py +1 -3
  83. disdrodb/l0/__init__.py +1 -1
  84. disdrodb/l0/check_configs.py +26 -17
  85. disdrodb/l0/check_standards.py +1 -3
  86. disdrodb/l0/configs/LPM/l0a_encodings.yml +0 -1
  87. disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +0 -4
  88. disdrodb/l0/configs/LPM/l0b_encodings.yml +9 -9
  89. disdrodb/l0/configs/LPM/raw_data_format.yml +11 -11
  90. disdrodb/l0/configs/LPM_V0/bins_diameter.yml +103 -0
  91. disdrodb/l0/configs/LPM_V0/bins_velocity.yml +103 -0
  92. disdrodb/l0/configs/LPM_V0/l0a_encodings.yml +45 -0
  93. disdrodb/l0/configs/LPM_V0/l0b_cf_attrs.yml +180 -0
  94. disdrodb/l0/configs/LPM_V0/l0b_encodings.yml +410 -0
  95. disdrodb/l0/configs/LPM_V0/raw_data_format.yml +474 -0
  96. disdrodb/l0/configs/ODM470/bins_diameter.yml +643 -0
  97. disdrodb/l0/configs/ODM470/bins_velocity.yml +0 -0
  98. disdrodb/l0/configs/ODM470/l0a_encodings.yml +11 -0
  99. disdrodb/l0/configs/ODM470/l0b_cf_attrs.yml +46 -0
  100. disdrodb/l0/configs/ODM470/l0b_encodings.yml +106 -0
  101. disdrodb/l0/configs/ODM470/raw_data_format.yml +111 -0
  102. disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +1 -1
  103. disdrodb/l0/configs/PARSIVEL/raw_data_format.yml +8 -8
  104. disdrodb/l0/configs/PARSIVEL2/raw_data_format.yml +9 -9
  105. disdrodb/l0/l0_reader.py +1 -3
  106. disdrodb/l0/l0a_processing.py +7 -5
  107. disdrodb/l0/l0b_nc_processing.py +2 -4
  108. disdrodb/l0/l0b_processing.py +27 -22
  109. disdrodb/l0/l0c_processing.py +37 -11
  110. disdrodb/l0/manuals/LPM_V0.pdf +0 -0
  111. disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +1 -1
  112. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +1 -1
  113. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +1 -1
  114. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +1 -1
  115. disdrodb/l0/readers/LPM/GERMANY/DWD.py +190 -12
  116. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +63 -14
  117. disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +279 -0
  118. disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +279 -0
  119. disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +3 -5
  120. disdrodb/l0/readers/LPM/KIT/CHWALA.py +1 -3
  121. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +1 -1
  122. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +103 -0
  123. disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +214 -0
  124. disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +206 -0
  125. disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +1 -3
  126. disdrodb/l0/readers/LPM/SLOVENIA/UL.py +1 -3
  127. disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +1 -3
  128. disdrodb/l0/readers/LPM/UK/DIVEN.py +1 -1
  129. disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +217 -0
  130. disdrodb/l0/readers/LPM/USA/CHARLESTON.py +227 -0
  131. disdrodb/l0/readers/{LPM → LPM_V0}/BELGIUM/ULIEGE.py +34 -52
  132. disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +240 -0
  133. disdrodb/l0/readers/ODM470/OCEAN/OCEANRAIN.py +123 -0
  134. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +1 -1
  135. disdrodb/l0/readers/PARSIVEL/BASQUECOUNTRY/EUSKALMET_OTT.py +1 -1
  136. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +1 -3
  137. disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +1 -1
  138. disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +1 -1
  139. disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +1 -1
  140. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +1 -1
  141. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +1 -1
  142. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +1 -1
  143. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +1 -1
  144. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +1 -1
  145. disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +1 -1
  146. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +1 -1
  147. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +1 -1
  148. disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +1 -1
  149. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +1 -1
  150. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +1 -1
  151. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +1 -1
  152. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +1 -1
  153. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +1 -1
  154. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +1 -1
  155. disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +1 -1
  156. disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +1 -1
  157. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +1 -1
  158. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +1 -1
  159. disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +1 -1
  160. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +1 -1
  161. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +1 -1
  162. disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +1 -1
  163. disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +1 -1
  164. disdrodb/l0/readers/PARSIVEL/KOREA/ICEPOP_MSC.py +159 -0
  165. disdrodb/l0/readers/PARSIVEL/NASA/LPVEX.py +26 -14
  166. disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +2 -2
  167. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +1 -1
  168. disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +1 -1
  169. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +1 -1
  170. disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +1 -1
  171. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +1 -1
  172. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +1 -3
  173. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +1 -3
  174. disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +1 -1
  175. disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +1 -1
  176. disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +2 -2
  177. disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +1 -3
  178. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +1 -1
  179. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +1 -1
  180. disdrodb/l0/readers/PARSIVEL2/CANADA/UQAM_NC.py +1 -1
  181. disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +1 -1
  182. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +1 -1
  183. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +1 -1
  184. disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +1 -1
  185. disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +1 -3
  186. disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +1 -1
  187. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +1 -3
  188. disdrodb/l0/readers/PARSIVEL2/GREECE/NOA.py +4 -3
  189. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +1 -3
  190. disdrodb/l0/readers/PARSIVEL2/ITALY/HYDROX.py +5 -3
  191. disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +155 -0
  192. disdrodb/l0/readers/PARSIVEL2/KIT/BURKINA_FASO.py +1 -1
  193. disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +1 -1
  194. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_MSC.py +161 -0
  195. disdrodb/l0/readers/PARSIVEL2/{NASA/GCPEX.py → KOREA/ICEPOP_UCLM.py} +51 -31
  196. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +1 -1
  197. disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +15 -8
  198. disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +9 -4
  199. disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +31 -6
  200. disdrodb/l0/readers/PARSIVEL2/NASA/NSSTC.py +1 -1
  201. disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +1 -1
  202. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +1 -1
  203. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +1 -1
  204. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +1 -1
  205. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +1 -1
  206. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +2 -2
  207. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +1 -1
  208. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +1 -1
  209. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +1 -3
  210. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
  211. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +1 -1
  212. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +1 -1
  213. disdrodb/l0/readers/{PARSIVEL/NASA/PIERS.py → PARSIVEL2/NORWAY/UIB.py} +65 -31
  214. disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +7 -6
  215. disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +1 -1
  216. disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +1 -1
  217. disdrodb/l0/readers/PARSIVEL2/SPAIN/GRANADA.py +1 -3
  218. disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +1 -1
  219. disdrodb/l0/readers/PARSIVEL2/SWEDEN/SMHI.py +1 -1
  220. disdrodb/l0/readers/PARSIVEL2/USA/CSU.py +138 -0
  221. disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +49 -22
  222. disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +1 -3
  223. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +1 -3
  224. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +1 -1
  225. disdrodb/l0/readers/{PARSIVEL/NASA/IFLOODS.py → RD80/BRAZIL/ATTO_RD80.py} +50 -36
  226. disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +1 -3
  227. disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +1 -3
  228. disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +1 -3
  229. disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +1 -3
  230. disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +1 -3
  231. disdrodb/l0/readers/{SW250 → SWS250}/BELGIUM/KMI.py +2 -4
  232. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +1 -3
  233. disdrodb/l0/readers/template_reader_raw_text_data.py +1 -3
  234. disdrodb/l0/standards.py +4 -5
  235. disdrodb/l0/template_tools.py +1 -3
  236. disdrodb/l1/__init__.py +1 -1
  237. disdrodb/l1/classification.py +913 -0
  238. disdrodb/l1/processing.py +36 -106
  239. disdrodb/l1/resampling.py +8 -3
  240. disdrodb/l1_env/__init__.py +1 -1
  241. disdrodb/l1_env/routines.py +6 -6
  242. disdrodb/l2/__init__.py +1 -1
  243. disdrodb/l2/empirical_dsd.py +61 -31
  244. disdrodb/l2/processing.py +327 -62
  245. disdrodb/metadata/checks.py +1 -3
  246. disdrodb/metadata/download.py +4 -4
  247. disdrodb/metadata/geolocation.py +1 -3
  248. disdrodb/metadata/info.py +1 -3
  249. disdrodb/metadata/manipulation.py +1 -3
  250. disdrodb/metadata/reader.py +1 -3
  251. disdrodb/metadata/search.py +1 -3
  252. disdrodb/metadata/standards.py +1 -3
  253. disdrodb/metadata/writer.py +1 -3
  254. disdrodb/physics/__init__.py +17 -0
  255. disdrodb/physics/atmosphere.py +272 -0
  256. disdrodb/physics/water.py +130 -0
  257. disdrodb/physics/wrappers.py +62 -0
  258. disdrodb/psd/__init__.py +1 -1
  259. disdrodb/psd/fitting.py +22 -9
  260. disdrodb/psd/models.py +1 -1
  261. disdrodb/routines/__init__.py +5 -1
  262. disdrodb/routines/l0.py +28 -18
  263. disdrodb/routines/l1.py +8 -6
  264. disdrodb/routines/l2.py +8 -4
  265. disdrodb/routines/options.py +116 -71
  266. disdrodb/routines/options_validation.py +728 -0
  267. disdrodb/routines/wrappers.py +431 -11
  268. disdrodb/scattering/__init__.py +1 -1
  269. disdrodb/scattering/axis_ratio.py +9 -6
  270. disdrodb/scattering/permittivity.py +8 -8
  271. disdrodb/scattering/routines.py +32 -14
  272. disdrodb/summary/__init__.py +1 -1
  273. disdrodb/summary/routines.py +146 -86
  274. disdrodb/utils/__init__.py +1 -1
  275. disdrodb/utils/archiving.py +16 -9
  276. disdrodb/utils/attrs.py +4 -3
  277. disdrodb/utils/cli.py +8 -10
  278. disdrodb/utils/compression.py +13 -13
  279. disdrodb/utils/dask.py +33 -14
  280. disdrodb/utils/dataframe.py +1 -3
  281. disdrodb/utils/decorators.py +1 -3
  282. disdrodb/utils/dict.py +1 -1
  283. disdrodb/utils/directories.py +3 -5
  284. disdrodb/utils/encoding.py +2 -4
  285. disdrodb/utils/event.py +1 -1
  286. disdrodb/utils/list.py +1 -3
  287. disdrodb/utils/logger.py +1 -3
  288. disdrodb/utils/manipulations.py +182 -6
  289. disdrodb/utils/pydantic.py +80 -0
  290. disdrodb/utils/routines.py +1 -3
  291. disdrodb/utils/subsetting.py +1 -1
  292. disdrodb/utils/time.py +3 -2
  293. disdrodb/utils/warnings.py +1 -3
  294. disdrodb/utils/writer.py +1 -3
  295. disdrodb/utils/xarray.py +30 -3
  296. disdrodb/utils/yaml.py +1 -3
  297. disdrodb/viz/__init__.py +1 -1
  298. disdrodb/viz/plots.py +197 -21
  299. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/METADATA +2 -2
  300. disdrodb-0.3.0.dist-info/RECORD +358 -0
  301. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/entry_points.txt +3 -0
  302. disdrodb/etc/products/L1/1MIN.yaml +0 -13
  303. disdrodb/etc/products/L1/LPM/1MIN.yaml +0 -13
  304. disdrodb/etc/products/L1/PARSIVEL/1MIN.yaml +0 -13
  305. disdrodb/etc/products/L1/PARSIVEL2/1MIN.yaml +0 -13
  306. disdrodb/etc/products/L1/PWS100/1MIN.yaml +0 -13
  307. disdrodb/etc/products/L1/RD80/1MIN.yaml +0 -13
  308. disdrodb/etc/products/L1/SWS250/1MIN.yaml +0 -13
  309. disdrodb/etc/products/L2M/10MIN.yaml +0 -12
  310. disdrodb/l1/beard_model.py +0 -618
  311. disdrodb/l1/filters.py +0 -203
  312. disdrodb-0.2.0.dist-info/RECORD +0 -312
  313. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/WHEEL +0 -0
  314. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/licenses/LICENSE +0 -0
  315. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,483 @@
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 the graupel 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_density, retrieve_air_dynamic_viscosity, retrieve_air_pressure
25
+ from disdrodb.utils.warnings import suppress_warnings
26
+
27
+
28
+ def get_graupel_density(diameter):
29
+ """Estimate the graupel particle density.
30
+
31
+ Use the Heymsfield & Wright (2014) parameterization.
32
+
33
+ At 5mm, graupel density only 140 kg/m3 ...
34
+
35
+ Parameters
36
+ ----------
37
+ diameter : array-like or float
38
+ Particle maximum diameter in millimeters [mm].
39
+
40
+ Returns
41
+ -------
42
+ graupel_density : xarray.DataArray or numpy.ndarray
43
+ Graupel density [kg/m3].
44
+
45
+ References
46
+ ----------
47
+ Heymsfield, A. J., and Wright, R., 2014.
48
+ Graupel and Hail Terminal Velocities: Does a Supercritical Reynolds Number Apply?
49
+ J. Atmos. Sci., 71, 3392-3403, https://doi.org/10.1175/JAS-D-14-0034.1.
50
+ """
51
+ graupel_density = 0.18 * (diameter * 0.1) ** 0.33 * 1000
52
+ return graupel_density
53
+
54
+
55
+ def get_fall_velocity_lee_2015(diameter):
56
+ """
57
+ Compute terminal fall velocity of lump graupel.
58
+
59
+ Use Lee et al., 2015 empirical formula.
60
+
61
+ Parameters
62
+ ----------
63
+ diameter : array-like or float
64
+ Particle maximum diameter in millimeters [mm].
65
+
66
+ Returns
67
+ -------
68
+ fall_velocity : ndarray or xarray.DataArray
69
+ Terminal fall velocity [m s⁻¹].
70
+ """
71
+ fall_velocity = 1.10 * diameter**0.28
72
+ return fall_velocity
73
+
74
+
75
+ def get_fall_velocity_locatelli_1974_lump(diameter):
76
+ """
77
+ Compute terminal fall velocity of lump graupel.
78
+
79
+ Use Locatelli and Hobbs 1974 empirical formula.
80
+
81
+ Parameters
82
+ ----------
83
+ diameter : array-like or float
84
+ Particle maximum diameter in millimeters [mm].
85
+
86
+ Returns
87
+ -------
88
+ fall_velocity : ndarray or xarray.DataArray
89
+ Terminal fall velocity [m s⁻¹].
90
+
91
+ Reference
92
+ ---------
93
+ Locatelli, J. D., and P. V. Hobbs (1974).
94
+ Fall speeds and masses of solid precipitation particles
95
+ J. Geophys. Res., 79(15), 2185-2197, doi:10.1029/JC079i015p02185.
96
+ """
97
+ fall_velocity = 1.3 * diameter**0.66 # Dmax [0.5-3]
98
+ # fall_velocity = 1.16*diameter**0.46, # Dmax [0.5-2]
99
+ # fall_velocity = 1.5*diameter**0.37 # Dmax [0.5-1]
100
+ return fall_velocity
101
+
102
+
103
+ def get_fall_velocity_locatelli_1974_conical(diameter):
104
+ """
105
+ Compute terminal fall velocity of cone-shaped graupel.
106
+
107
+ Use Locatelli and Hobbs 1974 empirical formula.
108
+
109
+ Parameters
110
+ ----------
111
+ diameter : array-like or float
112
+ Particle maximum diameter in millimeters [mm].
113
+
114
+ Returns
115
+ -------
116
+ fall_velocity : ndarray or xarray.DataArray
117
+ Terminal fall velocity [m s⁻¹].
118
+
119
+ Reference
120
+ ---------
121
+ Locatelli, J. D., and P. V. Hobbs (1974).
122
+ Fall speeds and masses of solid precipitation particles
123
+ J. Geophys. Res., 79(15), 2185-2197, doi:10.1029/JC079i015p02185.
124
+ """
125
+ fall_velocity = 1.20 * diameter**0.65
126
+ return fall_velocity
127
+
128
+
129
+ def get_fall_velocity_locatelli_1974_hexagonal(diameter):
130
+ """
131
+ Compute terminal fall velocity of hexagonal graupel.
132
+
133
+ Use Locatelli and Hobbs 1974 empirical formula.
134
+
135
+ Parameters
136
+ ----------
137
+ diameter : array-like or float
138
+ Particle maximum diameter in millimeters [mm].
139
+
140
+ Returns
141
+ -------
142
+ fall_velocity : ndarray or xarray.DataArray
143
+ Terminal fall velocity [m s⁻¹].
144
+
145
+ Reference
146
+ ---------
147
+ Locatelli, J. D., and P. V. Hobbs (1974).
148
+ Fall speeds and masses of solid precipitation particles
149
+ J. Geophys. Res., 79(15), 2185-2197, doi:10.1029/JC079i015p02185.
150
+ """
151
+ fall_velocity = 1.10 * diameter**0.57
152
+ return fall_velocity
153
+
154
+
155
+ def get_fall_velocity_heymsfield_2014(diameter):
156
+ """
157
+ Compute terminal velocity of graupel and small hail.
158
+
159
+ Use Heymsfield & Wright (2014) empirical formula.
160
+
161
+ Parameters
162
+ ----------
163
+ diameter : array-like or float
164
+ Particle maximum diameter in millimeters [mm].
165
+
166
+ Returns
167
+ -------
168
+ fall_velocity : ndarray or xarray.DataArray
169
+ Terminal fall velocity [m s⁻¹].
170
+ Reference
171
+ ---------
172
+ Heymsfield, A. J., and Wright, R., 2014.
173
+ Graupel and hail terminal velocities: Observations and theory.
174
+ Journal of the Atmospheric Sciences* , 71(1), 339-353.
175
+ """
176
+ fall_velocity = 4.88 * (0.1 * diameter) ** 0.84
177
+ return fall_velocity
178
+
179
+
180
+ def get_fall_velocity_heymsfield_2018(diameter):
181
+ """Get graupel fall velocity from Heymsfield et al., 2018.
182
+
183
+ Use the Heymsfield et al., 2018 parameterization.
184
+
185
+ Parameters
186
+ ----------
187
+ diameter : array-like or float
188
+ Particle maximum diameter in millimeters [mm].
189
+
190
+
191
+ Returns
192
+ -------
193
+ fall_velocity : xarray.DataArray or numpy.ndarray
194
+ Terminal fall velocity [m s⁻¹].
195
+
196
+ References
197
+ ----------
198
+ Heymsfield, A., M. Szakáll, A. Jost, I. Giammanco, and R. Wright, 2018.
199
+ A Comprehensive Observational Study of Graupel and Hail Terminal Velocity, Mass Flux, and Kinetic Energy.
200
+ J. Atmos. Sci., 75, 3861-3885, https://doi.org/10.1175/JAS-D-18-0035.1.
201
+
202
+ Heymsfield, A., M. Szakáll, A. Jost, I. Giammanco, R. Wright, and J. Brimelow, 2020.
203
+ CORRIGENDUM.
204
+ J. Atmos. Sci., 77, 405-412, https://doi.org/10.1175/JAS-D-19-0185.1.
205
+ """
206
+ # Original incorrect formula from Heymsfield et al., 2018
207
+ # fall_velocity = 6.35 * (0.1 * diameter) ** 0.87 # 0.87 in Table 3. 0.97 in Eq 8
208
+
209
+ # Corrected formula from Heymsfield et al., 2020 (Corrigendum)
210
+ fall_velocity = 7.59 * (0.1 * diameter) ** 0.89
211
+ return fall_velocity
212
+
213
+
214
+ ####----------------------------------------------------------------------
215
+ #### Heymsfield_2014 graupel model
216
+
217
+
218
+ def get_graupel_heymsfield_2014_fall_velocity(
219
+ diameter,
220
+ graupel_density=500.0,
221
+ air_density=1.225,
222
+ air_dynamic_viscosity=1.81e-5,
223
+ g=9.81,
224
+ ):
225
+ r"""
226
+ Compute the terminal fall velocity of sleet, graupel and small hail particles.
227
+
228
+ Use the Heymsfield & Wright (2014) parameterization.
229
+
230
+ Parameters
231
+ ----------
232
+ diameter : array-like or float
233
+ Particle maximum diameter in millimeters [mm].
234
+ air_density : float, optional
235
+ Air density [kg m⁻³]. Default is 1.225 (typical at sea level, 15°C).
236
+ graupel_density : float, optional
237
+ Bulk density of the ice particle [kg m⁻³].
238
+ Defaults to 500 kg m⁻³ (typical for graupel; hail can be ~900).
239
+ air_dynamic_viscosity : float, optional
240
+ Dynamic viscosity of air [kg m⁻¹ s⁻¹].
241
+ Default is 1.81e-5 (air at 15°C, 1 atm).
242
+ g : float, optional
243
+ Acceleration due to gravity [m s⁻²]. Default is 9.81.
244
+
245
+ Returns
246
+ -------
247
+ fall_velocity : xarray.DataArray
248
+ Terminal fall velocity [m s⁻¹].
249
+
250
+ Notes
251
+ -----
252
+ The relationship is based on empirical fits to the Reynolds number (Re)
253
+ as a function of a dimensionless variable X:
254
+
255
+ .. math::
256
+
257
+ X = \\frac{4}{3} D^3 \\rho_b g \\frac{\\rho_a}{\\eta_a^2}
258
+
259
+ Two regimes are used to compute the Reynolds number :math:`Re` as a function of
260
+ the dimensionless parameter :math:`X`:
261
+
262
+ .. math::
263
+
264
+ Re =
265
+ \\begin{cases}
266
+ 0.106\\, X^{0.693}, & \\text{for } X < 6.77 \\times 10^{4} \\\\
267
+ 0.55\\, X^{0.545}, & \\text{for } X \\ge 6.77 \\times 10^{4}
268
+ \\end{cases}
269
+
270
+ The terminal fall velocity :math:`v_t` is then obtained as:
271
+
272
+ .. math::
273
+
274
+ v_t = \\frac{Re\\, \\eta_a}{\\rho_a\\, D}
275
+
276
+ where:
277
+
278
+
279
+ - :math:`Re` — Reynolds number (dimensionless)
280
+ - :math:`\\eta_a` — dynamic viscosity of air [kg m⁻¹ s⁻¹]
281
+ - :math:`\\rho_a` — air density [kg m⁻³]
282
+ - :math:`D` — particle diameter [m]
283
+ - :math:`\\rho_b` — bulk density of the particle [kg m⁻³]
284
+ - :math:`g` — gravitational acceleration [m s⁻²]
285
+
286
+ References
287
+ ----------
288
+ Heymsfield, A. J., and Wright, R., 2014.
289
+ Graupel and Hail Terminal Velocities: Does a Supercritical Reynolds Number Apply?
290
+ J. Atmos. Sci., 71, 3392-3403, https://doi.org/10.1175/JAS-D-14-0034.1.
291
+ """
292
+ diameter = xr.DataArray(diameter / 1000)
293
+
294
+ # Compute Davies (or Best) number
295
+ X = (4 / 3) * diameter**3 * graupel_density * g * air_density / air_dynamic_viscosity**2
296
+
297
+ Re = xr.where(
298
+ X < 6.77e4,
299
+ 0.106 * X**0.693,
300
+ 0.55 * X**0.545,
301
+ )
302
+
303
+ fall_velocity = Re * air_dynamic_viscosity / (air_density * diameter)
304
+ return fall_velocity
305
+
306
+
307
+ def retrieve_graupel_heymsfield2014_fall_velocity(
308
+ diameter,
309
+ ds_env,
310
+ graupel_density=500.0,
311
+ ):
312
+ """
313
+ Compute the terminal fall velocity of sleet, graupel and small hail particles.
314
+
315
+ Use the Heymsfield & Wright (2014) parameterization.
316
+
317
+ Parameters
318
+ ----------
319
+ diameter : array-like
320
+ Diameter of the graupel particles in millimeters.
321
+ ds_env : xr.Dataset
322
+ A dataset containing the following environmental variables:
323
+ - 'altitude' : Altitude in meters (m).
324
+ - 'latitude' : Latitude in degrees.
325
+ - 'temperature' : Temperature in degrees Kelvin (K).
326
+ - 'relative_humidity' : Relative humidity between 0 and 1.
327
+ - 'sea_level_air_pressure' : Standard atmospheric pressure at sea level in Pascals (Pa).
328
+ The default is 101_325 Pa.
329
+ - 'air_pressure': Air pressure in Pascals (Pa). If None, air_pressure at altitude is inferred.
330
+ - 'lapse_rate' : Atmospheric lapse rate in degrees Celsius or Kelvin per meter (°C/m).
331
+ The default is 0.0065 K/m.
332
+ - 'gas_constant_dry_air': Gas constant for dry air in J/(kg*K). The default is 287.04 is J/(kg*K).
333
+ graupel_density : float, optional
334
+ Bulk density of the ice particle [kg m⁻³].
335
+ Defaults to 500 kg m⁻³ (typical for graupel; hail can be ~900).
336
+
337
+ Returns
338
+ -------
339
+ fall_velocity : array-like
340
+ Terminal fall velocity for the graupel particles.
341
+ """
342
+ air_viscosity = retrieve_air_dynamic_viscosity(ds_env)
343
+ air_density = retrieve_air_density(ds_env)
344
+ fall_velocity = get_graupel_heymsfield_2014_fall_velocity(
345
+ diameter=diameter,
346
+ graupel_density=graupel_density,
347
+ air_density=air_density,
348
+ air_dynamic_viscosity=air_viscosity,
349
+ )
350
+ return fall_velocity
351
+
352
+
353
+ ####------------------------------------------------------------------------------------
354
+ #### Wrappers
355
+
356
+
357
+ GRAUPEL_FALL_VELOCITY_MODELS = {
358
+ "Lee2015": get_fall_velocity_lee_2015,
359
+ "Locatelli1974Lump": get_fall_velocity_locatelli_1974_lump,
360
+ "Locatelli1974Conical": get_fall_velocity_locatelli_1974_conical,
361
+ "Locatelli1974Hexagonal": get_fall_velocity_locatelli_1974_hexagonal,
362
+ "Heymsfield2014": get_fall_velocity_heymsfield_2014,
363
+ "Heymsfield2018": get_fall_velocity_heymsfield_2018,
364
+ }
365
+
366
+
367
+ def available_graupel_fall_velocity_models():
368
+ """Return a list of the available graupel fall velocity models."""
369
+ return list(GRAUPEL_FALL_VELOCITY_MODELS)
370
+
371
+
372
+ def check_graupel_fall_velocity_model(model):
373
+ """Check validity of the specified graupel fall velocity model."""
374
+ available_models = available_graupel_fall_velocity_models()
375
+ if model not in available_models:
376
+ raise ValueError(f"{model} is an invalid graupel fall velocity model. Valid models: {available_models}.")
377
+ return model
378
+
379
+
380
+ def get_graupel_fall_velocity_model(model):
381
+ """Return the specified graupel fall velocity model.
382
+
383
+ Parameters
384
+ ----------
385
+ model : str
386
+ The model to use for calculating the rain drop fall velocity. Available models are:
387
+ 'Lee2015', 'Locatelli1974Lump', 'Locatelli1974Conical', 'Locatelli1974Hexagonal',
388
+ 'Heymsfield2014', 'Heymsfield2018'.
389
+
390
+ Returns
391
+ -------
392
+ callable
393
+ A function which compute the graupel fall velocity model
394
+ given the rain drop diameter in mm.
395
+
396
+ Notes
397
+ -----
398
+ This function serves as a wrapper to various graupel fall velocity models.
399
+ It returns the appropriate model based on the `model` parameter.
400
+ """
401
+ model = check_graupel_fall_velocity_model(model)
402
+ return GRAUPEL_FALL_VELOCITY_MODELS[model]
403
+
404
+
405
+ def get_graupel_fall_velocity(diameter, model, ds_env=None, minimum_diameter=0.5, maximum_diameter=5):
406
+ """Calculate the fall velocity of graupel based on their diameter.
407
+
408
+ Parameters
409
+ ----------
410
+ diameter : array-like
411
+ The diameter of the graupel in millimeters.
412
+ model : str
413
+ The model to use for calculating the graupel fall velocity. Must be one of the following:
414
+ 'Lee2015', 'Locatelli1974Lump', 'Locatelli1974Conical', 'Locatelli1974Hexagonal',
415
+ 'Heymsfield2014', 'Heymsfield2018'.
416
+ ds_env : xr.Dataset, optional
417
+ A dataset containing the following environmental variables:
418
+ - 'altitude' (m)
419
+ - 'latitude' (°)
420
+ - 'temperature' : Temperature in degrees Kelvin (K).
421
+ - 'relative_humidity' : Relative humidity. A value between 0 and 1.
422
+ - 'sea_level_air_pressure' : Sea level air pressure in Pascals (Pa).
423
+ - 'lapse_rate' : Lapse rate in degrees Celsius per meter (°C/m).
424
+ If not specified, sensible default values are used.
425
+
426
+ Returns
427
+ -------
428
+ fall_velocity : xr.DataArray
429
+ The calculated graupel fall velocities per diameter.
430
+
431
+ Notes
432
+ -----
433
+ The 'Beard1976' model requires additional environmental parameters.
434
+ These parameters can be provided through the `ds_env` argument.
435
+ If not provided, default values are be used.
436
+
437
+ For D < 0.12, Atlas1973 relationship results output V = 0 m/s !
438
+ For D < 0.05, VanDijk2002 relationship results output V = 0 m/s !
439
+ For D < 0.02, Brandes relationship results output V = 0 m/s !
440
+
441
+ """
442
+ # Check valid method
443
+ model = check_graupel_fall_velocity_model(model)
444
+
445
+ # Copy diameter
446
+ if isinstance(diameter, xr.DataArray):
447
+ diameter = diameter.copy()
448
+ else:
449
+ diameter = np.atleast_1d(diameter)
450
+ diameter = xr.DataArray(diameter, dims=DIAMETER_DIMENSION, coords={DIAMETER_DIMENSION: diameter.copy()})
451
+
452
+ # Initialize ds_env if None
453
+ # --> Ensure valid altitude and geolocation
454
+ # - altitude requiredto correct for elevation (air_density)
455
+ # - latitude required for gravity
456
+ if ds_env is None:
457
+ ds_env = load_env_dataset()
458
+ for coord in ["altitude", "latitude"]:
459
+ ds_env = ensure_valid_geolocation(ds_env, coord=coord, errors="raise")
460
+
461
+ # Retrieve fall velocity
462
+ func = get_graupel_fall_velocity_model(model)
463
+ with suppress_warnings(): # e.g. when diameter = 0 for Beard1976
464
+ fall_velocity = func(diameter, ds_env=ds_env) if model == "Beard1976" else func(diameter)
465
+
466
+ # Correct for altitude
467
+ air_pressure = retrieve_air_pressure(ds_env)
468
+ correction_factor = (101325 / air_pressure) ** 0.545
469
+ fall_velocity = fall_velocity * correction_factor
470
+
471
+ # Set to NaN for diameter outside [0.5, 5]
472
+ fall_velocity = fall_velocity.where(fall_velocity["diameter_bin_lower"] >= minimum_diameter)
473
+ fall_velocity = fall_velocity.where(fall_velocity["diameter_bin_upper"] <= maximum_diameter)
474
+
475
+ # Ensure fall velocity is > 0 to avoid division by zero
476
+ # - Some models, at small diameter, can return negative/zero fall velocity
477
+ fall_velocity = fall_velocity.where(fall_velocity > 0)
478
+
479
+ # Add attributes
480
+ fall_velocity.name = "fall_velocity"
481
+ fall_velocity.attrs["units"] = "m/s"
482
+ fall_velocity.attrs["model"] = model
483
+ return fall_velocity.squeeze()