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
@@ -1,618 +0,0 @@
1
- # -----------------------------------------------------------------------------.
2
- # Copyright (c) 2021-2023 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
- """Utilities to estimate the drop fall velocity using the Beard model."""
18
-
19
-
20
- import numpy as np
21
- import xarray as xr
22
-
23
-
24
- def get_gravitational_acceleration(latitude, altitude=0):
25
- """
26
- Computes gravitational acceleration at a given altitude and latitude.
27
-
28
- Parameters
29
- ----------
30
- altitude : float
31
- Altitude in meters. The default is 0 m (sea level).
32
- latitude : float
33
- Latitude in degrees.
34
-
35
- Returns
36
- -------
37
- float
38
- Gravitational acceleration in m/s^2.
39
- """
40
- g0 = 9.806229 - 0.025889372 * np.cos(2 * np.deg2rad(latitude))
41
- return g0 - 2.879513 * altitude / 1e6
42
-
43
-
44
- def get_air_pressure_at_height(
45
- altitude,
46
- latitude,
47
- temperature,
48
- sea_level_air_pressure=101_325,
49
- lapse_rate=0.0065,
50
- gas_constant_dry_air=287.04,
51
- ):
52
- """
53
- Computes the air pressure at a given height in a standard atmosphere.
54
-
55
- According to the hypsometric formula of Brutsaert 1982; Ulaby et al. 1981
56
-
57
- Parameters
58
- ----------
59
- altitude : float
60
- Altitude in meters.
61
- latitude : float
62
- Latitude in degrees.
63
- temperature : float
64
- Temperature at altitude in Kelvin.
65
- sea_level_air_pressure : float, optional
66
- Standard atmospheric pressure at sea level in Pascals. The default is 101_325 Pascals.
67
- lapse_rate : float, optional
68
- Standard atmospheric lapse rate in K/m. The default is 0.0065 K/m.
69
- gas_constant_dry_air : float, optional
70
- Gas constant for dry air in J/(kg*K). The default is 287.04 J/(kg*K).
71
-
72
- Returns
73
- -------
74
- float
75
- Air pressure in Pascals.
76
- """
77
- g = get_gravitational_acceleration(altitude=altitude, latitude=latitude)
78
- return sea_level_air_pressure * np.exp(
79
- -g / (lapse_rate * gas_constant_dry_air) * np.log(1 + lapse_rate * altitude / temperature),
80
- )
81
-
82
-
83
- def get_air_temperature_at_height(altitude, sea_level_temperature, lapse_rate=0.0065):
84
- """
85
- Computes the air temperature at a given height in a standard atmosphere.
86
-
87
- Reference: Brutsaert 1982; Ulaby et al. 1981
88
-
89
- Parameters
90
- ----------
91
- altitude : float
92
- Altitude in meters.
93
- sea_level_temperature : float
94
- Standard temperature at sea level in Kelvin.
95
- lapse_rate : float, optional
96
- Standard atmospheric lapse rate in K/m. The default is 0.0065 K/m.
97
-
98
- Returns
99
- -------
100
- float
101
- Air temperature in Kelvin.
102
- """
103
- return sea_level_temperature - lapse_rate * altitude
104
-
105
-
106
- def get_vapor_actual_pressure_at_height(
107
- altitude,
108
- sea_level_temperature,
109
- sea_level_relative_humidity,
110
- sea_level_air_pressure=101_325,
111
- lapse_rate=0.0065,
112
- ):
113
- """
114
- Computes the vapor pressure using Yamamoto's exponential relationship.
115
-
116
- Reference: Brutsaert 1982
117
-
118
- Parameters
119
- ----------
120
- altitude : float
121
- Altitude in meters.
122
- sea_level_temperature : float
123
- Standard temperature at sea level in Kelvin.
124
- sea_level_relative_humidity : float
125
- Relative humidity at sea level. A value between 0 and 1.
126
- sea_level_air_pressure : float, optional
127
- Standard atmospheric pressure at sea level in Pascals. The default is 101_325 Pascals.
128
- lapse_rate : float, optional
129
- Standard atmospheric lapse rate in K/m. The default is 0.0065 K/m.
130
-
131
- Returns
132
- -------
133
- float
134
- Vapor pressure in Pascals.
135
- """
136
- temperature_at_altitude = get_air_temperature_at_height(
137
- altitude=altitude,
138
- sea_level_temperature=sea_level_temperature,
139
- lapse_rate=lapse_rate,
140
- )
141
- esat = get_vapor_saturation_pressure(sea_level_temperature)
142
- actual_vapor = sea_level_relative_humidity / (1 / esat - (1 - sea_level_relative_humidity) / sea_level_air_pressure)
143
- return actual_vapor * np.exp(-(5.8e3 * lapse_rate / (temperature_at_altitude**2) + 5.5e-5) * altitude)
144
-
145
-
146
- def get_vapor_saturation_pressure(temperature):
147
- """
148
- Computes the saturation vapor pressure over water as a function of temperature.
149
-
150
- Use formulation and coefficients of Wexler (1976, 1977).
151
- References: Brutsaert 1982; Pruppacher & Klett 1978; Flatau & al. 1992
152
-
153
- Parameters
154
- ----------
155
- temperature : float
156
- Temperature in Kelvin.
157
-
158
- Returns
159
- -------
160
- float
161
- Saturation vapor pressure in Pascal.
162
- """
163
- # Polynomial coefficients
164
- g = [
165
- -0.29912729e4,
166
- -0.60170128e4,
167
- 0.1887643854e2,
168
- -0.28354721e-1,
169
- 0.17838301e-4,
170
- -0.84150417e-9,
171
- 0.44412543e-12,
172
- 0.2858487e1,
173
- ]
174
- # Perform polynomial accumulation using Horner rule
175
- esat = g[6]
176
- for i in [5, 4, 3, 2]:
177
- esat = esat * temperature + g[i]
178
- esat = esat + g[7] * np.log(temperature)
179
- for i in [1, 0]:
180
- esat = esat * temperature + g[i]
181
- return np.exp(esat / (temperature**2))
182
-
183
-
184
- def get_vapor_actual_pressure(relative_humidity, temperature):
185
- """
186
- Computes the actual vapor pressure over water.
187
-
188
- Parameters
189
- ----------
190
- relative_humidity : float
191
- Relative humidity. A value between 0 and 1.
192
- temperature : float
193
- Temperature in Kelvin.
194
-
195
- Returns
196
- -------
197
- float
198
- Actual vapor pressure in Pascal.
199
- """
200
- esat = get_vapor_saturation_pressure(temperature)
201
- return relative_humidity * esat
202
-
203
-
204
- def get_pure_water_density(temperature):
205
- """
206
- Computes the density of pure water at standard pressure.
207
-
208
- For temperatures above freezing uses Kell formulation.
209
- For temperatures below freezing use Dorsch & Boyd formulation.
210
-
211
- References: Pruppacher & Klett 1978; Weast & Astle 1980
212
-
213
- Parameters
214
- ----------
215
- temperature : float
216
- Temperature in Kelvin.
217
-
218
- Returns
219
- -------
220
- float
221
- Density of pure water in kg/m^3.
222
- """
223
- # Convert to Celsius
224
- temperature = temperature - 273.15
225
-
226
- # Define mask
227
- above_freezing_mask = temperature > 0
228
-
229
- # Compute density above freezing temperature
230
- c = [9.9983952e2, 1.6945176e1, -7.9870401e-3, -4.6170461e-5, 1.0556302e-7, -2.8054253e-10, 1.6879850e-2]
231
- density = c[0] + sum(c * temperature**i for i, c in enumerate(c[1:6], start=1))
232
- density_above_0 = density / (1 + c[6] * temperature)
233
-
234
- # Compute density below freezing temperature
235
- c = [999.84, 0.086, -0.0108]
236
- density_below_0 = c[0] + sum(c * temperature**i for i, c in enumerate(c[1:], start=1))
237
-
238
- # Define final density
239
- density = xr.where(above_freezing_mask, density_above_0, density_below_0)
240
- return density
241
-
242
-
243
- def get_pure_water_compressibility(temperature):
244
- """
245
- Computes the isothermal compressibility of pure ordinary water.
246
-
247
- Reference: Kell, Weast & Astle 1980
248
-
249
- Parameters
250
- ----------
251
- temperature : float
252
- Temperature in Kelvin.
253
-
254
- Returns
255
- -------
256
- float
257
- Compressibility of water in Pascals.
258
- """
259
- # Convert to Celsius
260
- temperature = temperature - 273.15
261
-
262
- # Compute compressibility
263
- c = [5.088496e1, 6.163813e-1, 1.459187e-3, 2.008438e-5, -5.857727e-8, 4.10411e-10, 1.967348e-2]
264
- compressibility = c[0] + sum(c * temperature**i for i, c in enumerate(c[1:6], start=1))
265
- compressibility = compressibility / (1 + c[6] * temperature) * 1e-11
266
- return compressibility
267
-
268
-
269
- def get_pure_water_surface_tension(temperature):
270
- """
271
- Computes the surface tension of pure ordinary water against air.
272
-
273
- Reference: Pruppacher & Klett 1978
274
-
275
- Parameters
276
- ----------
277
- temperature : float
278
- Temperature in Kelvin.
279
-
280
- Returns
281
- -------
282
- float
283
- Surface tension in N/m.
284
- """
285
- sigma = 0.0761 - 0.000155 * (temperature - 273.15)
286
- return sigma
287
-
288
-
289
- def get_air_dynamic_viscosity(temperature):
290
- """
291
- Computes the dynamic viscosity of dry air.
292
-
293
- Reference: Beard 1977; Pruppacher & Klett 1978
294
-
295
- Parameters
296
- ----------
297
- temperature : float
298
- Temperature in Kelvin.
299
-
300
- Returns
301
- -------
302
- float
303
- Dynamic viscosity of dry air in kg/(m*s) (aka Pa*s).
304
- """
305
- # Convert to Celsius
306
- temperature = temperature - 273.15
307
-
308
- # Define mask
309
- above_freezing_mask = temperature > 0
310
-
311
- # Compute viscosity above freezing temperature
312
- viscosity_above_0 = (1.721 + 0.00487 * temperature) / 1e5
313
-
314
- # Compute viscosity below freezing temperature
315
- viscosity_below_0 = (1.718 + 0.0049 * temperature - 1.2 * temperature**2 / 1e5) / 1e5
316
-
317
- # Define final viscosity
318
- viscosity = xr.where(above_freezing_mask, viscosity_above_0, viscosity_below_0)
319
- return viscosity
320
-
321
-
322
- def get_air_density(temperature, air_pressure, vapor_pressure, gas_constant_dry_air=287.04):
323
- """
324
- Computes the air density according to the equation of state for moist air.
325
-
326
- Reference: Brutsaert 1982
327
-
328
- Parameters
329
- ----------
330
- temperature : float
331
- Temperature in Kelvin.
332
- air_pressure : float
333
- Air pressure in Pascals.
334
- vapor_pressure : float
335
- Vapor pressure in Pascals.
336
- gas_constant_dry_air : float, optional
337
- Gas constant for dry air in J/(kg*K). The default is 287.04 J/(kg*K).
338
-
339
- Returns
340
- -------
341
- float
342
- Air density in kg/m^3.
343
- """
344
- # # Define constant for water vapor in J/(kg·K)
345
- # gas_constant_water_vapor=461.5
346
-
347
- # # Partial pressure of dry air (Pa)
348
- # pressure_dry_air = air_pressure - vapor_pressure
349
-
350
- # # Density of dry air (kg/m^3)
351
- # density_dry_air = pressure_dry_air / (gas_constant_dry_air * temperature)
352
-
353
- # # Density of water vapor (kg/m^3)
354
- # density_water_vapor = vapor_pressure / (gas_constant_water_vapor * temperature)
355
-
356
- # # Total air density (kg/m^3)
357
- # air_density = density_dry_air + density_water_vapor
358
-
359
- return air_pressure * (1 - 0.378 * vapor_pressure / air_pressure) / (gas_constant_dry_air * temperature)
360
-
361
-
362
- def get_water_density(temperature, air_pressure, sea_level_air_pressure=101_325):
363
- """
364
- Computes the density of water according to Weast & Astle 1980.
365
-
366
- Parameters
367
- ----------
368
- temperature : float
369
- Temperature in Kelvin.
370
- air_pressure : float
371
- Air pressure in Pascals.
372
- sea_level_air_pressure : float
373
- Standard atmospheric pressure at sea level in Pascals.
374
- The default is 101_325 Pascal.
375
- freezing_temperature : float, optional
376
- Freezing temperature of water in Kelvin. The default is 273.15 K.
377
-
378
- Returns
379
- -------
380
- float
381
- Water density in kg/m^3.
382
- """
383
- delta_pressure = sea_level_air_pressure - air_pressure
384
- water_compressibility = get_pure_water_compressibility(temperature)
385
- return get_pure_water_density(temperature) * np.exp(-1 * water_compressibility * delta_pressure)
386
-
387
-
388
- def get_raindrop_reynolds_number(diameter, temperature, air_density, water_density, g):
389
- """Compute raindrop Reynolds number.
390
-
391
- It quantifies the relative strength of the convective inertia and linear viscous
392
- forces acting on the drop at terminal velocity.
393
-
394
- Estimates Reynolds number for drops with diameter between 19 um and 7 mm.
395
- Coefficients are taken from Table 1 of Beard 1976.
396
-
397
- Reference: Beard 1976; Pruppacher & Klett 1978
398
-
399
- Parameters
400
- ----------
401
- diameter : float
402
- Diameter of the raindrop in meters.
403
- temperature : float
404
- Temperature in Kelvin.
405
- air_density : float
406
- Density of air in kg/m^3.
407
- water_density : float
408
- Density of water in kg/m^3.
409
- g : float
410
- Gravitational acceleration in m/s^2.
411
-
412
- Returns
413
- -------
414
- float
415
- Reynolds number for the raindrop.
416
- """
417
- # Define mask for small and large particles
418
- small_diam_mask = diameter < 1.07e-3 # < 1mm
419
-
420
- # Compute properties
421
- pure_water_surface_tension = get_pure_water_surface_tension(temperature) # N/m
422
- air_viscosity = get_air_dynamic_viscosity(temperature) # kg/(m*s) (aka Pa*s).
423
- delta_density = water_density - air_density
424
-
425
- # Compute Davis number for small droplets
426
- davis_number = 4 * air_density * delta_density * g * diameter**3 / (3 * air_viscosity**2)
427
-
428
- # Compute the slip correction (is approx 1 and can be discarded)
429
- # l0 = 6.62*1e-8 # m
430
- # v0 = 0.01818 # g / m / s
431
- # p0 = 101_325_25 # Pa
432
- # t0 = 293.15 # K
433
- # c_sc = 1 + 2.51*l0*(air_viscosity/v0)*(air_pressure/p0)*((temperature/t0)**3)/diameter
434
-
435
- # Compute modified Bond and physical property numbers for large droplets
436
- bond_number = 4 * delta_density * g * diameter**2 / (3 * pure_water_surface_tension)
437
- property_number = pure_water_surface_tension**3 * air_density**2 / (air_viscosity**4 * delta_density * g)
438
-
439
- # Compute Reynolds_number_for small particles (diameter < 0.00107) (1 mm)
440
- # --> First 9 bins of Parsivel ...
441
- b = [-3.18657, 0.992696, -0.00153193, -0.000987059, -0.000578878, 0.0000855176, -0.00000327815]
442
- x = np.log(davis_number)
443
- y = b[0] + sum(b * x**i for i, b in enumerate(b[1:], start=1))
444
- reynolds_number_small = np.exp(y) # TODO: miss C_sc = slip correction factor ?
445
-
446
- # Compute Reynolds_number_for large particles (diameter >= 0.00107)
447
- b = [-5.00015, 5.23778, -2.04914, 0.475294, -0.0542819, 0.00238449]
448
- log_property_number = np.log(property_number) / 6
449
- x = np.log(bond_number) + log_property_number
450
- y = b[0]
451
- y = b[0] + sum(b * x**i for i, b in enumerate(b[1:], start=1))
452
- reynolds_number_large = np.exp(log_property_number + y)
453
-
454
- # Define final reynolds number
455
- reynolds_number = xr.where(small_diam_mask, reynolds_number_small, reynolds_number_large)
456
- return reynolds_number
457
-
458
-
459
- def get_drag_coefficient(diameter, air_density, water_density, fall_velocity, g=9.81):
460
- """
461
- Computes the drag coefficient for a raindrop.
462
-
463
- Parameters
464
- ----------
465
- diameter : float
466
- Diameter of the raindrop in meters.
467
- air_density : float
468
- Density of air in kg/m^3.
469
- water_density : float
470
- Density of water in kg/m^3.
471
- fall_velocity : float
472
- Terminal fall velocity of the raindrop in m/s.
473
- g : float
474
- Gravitational acceleration in m/s^2.
475
-
476
- Returns
477
- -------
478
- float
479
- Drag coefficient of the raindrop.
480
- """
481
- delta_density = water_density - air_density
482
- drag_coefficient = 4 * delta_density * g * diameter / (3 * air_density * fall_velocity**2)
483
- return drag_coefficient
484
-
485
-
486
- def get_fall_velocity_beard_1976(diameter, temperature, air_density, water_density, g):
487
- """
488
- Computes the terminal fall velocity of a raindrop in still air.
489
-
490
- Reference: Beard 1976; Pruppacher & Klett 1978
491
-
492
- Parameters
493
- ----------
494
- diameter : float
495
- Diameter of the raindrop in meters.
496
- temperature : float
497
- Temperature in Kelvin.
498
- air_density : float
499
- Density of air in kg/m^3.
500
- water_density : float
501
- Density of water in kg/m^3.
502
- g : float
503
- Gravitational acceleration in m/s^2.
504
-
505
- Returns
506
- -------
507
- float
508
- Terminal fall velocity of the raindrop in m/s.
509
- """
510
- air_viscosity = get_air_dynamic_viscosity(temperature)
511
- reynolds_number = get_raindrop_reynolds_number(
512
- diameter=diameter,
513
- temperature=temperature,
514
- air_density=air_density,
515
- water_density=water_density,
516
- g=g,
517
- )
518
- fall_velocity = air_viscosity * reynolds_number / (air_density * diameter)
519
- return fall_velocity
520
-
521
-
522
- def retrieve_fall_velocity(
523
- diameter,
524
- altitude,
525
- latitude,
526
- temperature,
527
- relative_humidity,
528
- air_pressure=None,
529
- sea_level_air_pressure=101_325,
530
- gas_constant_dry_air=287.04,
531
- lapse_rate=0.0065,
532
- ):
533
- """
534
- Computes the terminal fall velocity and drag coefficients for liquid raindrops.
535
-
536
- Parameters
537
- ----------
538
- diameter : float
539
- Diameter of the raindrop in meters.
540
- altitude : float
541
- Altitude in meters.
542
- temperature : float
543
- Temperature in Kelvin.
544
- relative_humidity : float
545
- Relative humidity. A value between 0 and 1.
546
- latitude : float
547
- Latitude in degrees.
548
- air_pressure : float
549
- Air pressure in Pascals.
550
- If None, air_pressure at altitude is inferred assuming
551
- a standard atmospheric pressure at sea level.
552
- sea_level_air_pressure : float
553
- Standard atmospheric pressure at sea level in Pascals.
554
- The default is 101_325 Pascal.
555
- gas_constant_dry_air : float, optional
556
- Gas constant for dry air in J/(kg*K). The default is 287.04 is J/(kg*K).
557
- lapse_rate : float, optional
558
- Standard atmospheric lapse rate in K/m. The default is 0.0065 K/m.
559
-
560
- Returns
561
- -------
562
- tuple
563
- Terminal fall velocity and drag coefficients for liquid raindrops.
564
- """
565
- # Retrieve air pressure at altitude if not specified
566
- if air_pressure is None:
567
- air_pressure = get_air_pressure_at_height(
568
- altitude=altitude,
569
- latitude=latitude,
570
- temperature=temperature,
571
- sea_level_air_pressure=sea_level_air_pressure,
572
- lapse_rate=lapse_rate,
573
- gas_constant_dry_air=gas_constant_dry_air,
574
- )
575
-
576
- # else
577
- # --> Estimate sea_level_air_pressure from air_pressure ?
578
-
579
- # Retrieve vapour pressure (from relative humidity)
580
- vapor_pressure = get_vapor_actual_pressure(
581
- relative_humidity=relative_humidity,
582
- temperature=temperature,
583
- )
584
-
585
- # Retrieve air density
586
- air_density = get_air_density(
587
- temperature=temperature,
588
- air_pressure=air_pressure,
589
- vapor_pressure=vapor_pressure,
590
- gas_constant_dry_air=gas_constant_dry_air,
591
- )
592
-
593
- # Retrieve water density
594
- water_density = get_water_density(
595
- temperature=temperature,
596
- air_pressure=air_pressure,
597
- sea_level_air_pressure=sea_level_air_pressure,
598
- )
599
-
600
- # Retrieve accurate gravitational_acceleration
601
- g = get_gravitational_acceleration(altitude=altitude, latitude=latitude)
602
-
603
- # Compute fall velocity
604
- fall_velocity = get_fall_velocity_beard_1976(
605
- diameter=diameter,
606
- temperature=temperature,
607
- air_density=air_density,
608
- water_density=water_density,
609
- g=g,
610
- )
611
-
612
- # drag_coefficient = get_drag_coefficient(diameter=diameter,
613
- # air_density=air_density,
614
- # water_density=water_density,
615
- # g=g.
616
- # fall_velocity=fall_velocity)
617
-
618
- return fall_velocity