disdrodb 0.2.1__py3-none-any.whl → 0.4.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 (313) hide show
  1. disdrodb/__init__.py +3 -1
  2. disdrodb/_config.py +2 -3
  3. disdrodb/_version.py +2 -2
  4. disdrodb/accessor/__init__.py +2 -1
  5. disdrodb/accessor/methods.py +10 -9
  6. disdrodb/api/checks.py +3 -7
  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 +233 -32
  11. disdrodb/api/path.py +3 -7
  12. disdrodb/cli/disdrodb_check_metadata_archive.py +3 -2
  13. disdrodb/cli/disdrodb_check_products_options.py +45 -0
  14. disdrodb/cli/disdrodb_create_summary.py +54 -28
  15. disdrodb/cli/disdrodb_create_summary_station.py +41 -20
  16. disdrodb/cli/disdrodb_data_archive_directory.py +2 -3
  17. disdrodb/cli/disdrodb_download_archive.py +50 -30
  18. disdrodb/cli/disdrodb_download_metadata_archive.py +28 -16
  19. disdrodb/cli/disdrodb_download_station.py +58 -29
  20. disdrodb/cli/disdrodb_initialize_station.py +43 -23
  21. disdrodb/cli/disdrodb_metadata_archive_directory.py +2 -3
  22. disdrodb/cli/disdrodb_open_data_archive.py +17 -13
  23. disdrodb/cli/disdrodb_open_logs_directory.py +31 -21
  24. disdrodb/cli/disdrodb_open_metadata_archive.py +26 -13
  25. disdrodb/cli/disdrodb_open_metadata_directory.py +34 -23
  26. disdrodb/cli/disdrodb_open_product_directory.py +39 -23
  27. disdrodb/cli/disdrodb_open_readers_directory.py +2 -3
  28. disdrodb/cli/disdrodb_run.py +189 -0
  29. disdrodb/cli/disdrodb_run_l0.py +61 -70
  30. disdrodb/cli/disdrodb_run_l0_station.py +50 -55
  31. disdrodb/cli/disdrodb_run_l0a.py +53 -51
  32. disdrodb/cli/disdrodb_run_l0a_station.py +41 -40
  33. disdrodb/cli/disdrodb_run_l0b.py +51 -51
  34. disdrodb/cli/disdrodb_run_l0b_station.py +40 -39
  35. disdrodb/cli/disdrodb_run_l0c.py +56 -53
  36. disdrodb/cli/disdrodb_run_l0c_station.py +44 -41
  37. disdrodb/cli/disdrodb_run_l1.py +55 -51
  38. disdrodb/cli/disdrodb_run_l1_station.py +43 -40
  39. disdrodb/cli/disdrodb_run_l2e.py +56 -51
  40. disdrodb/cli/disdrodb_run_l2e_station.py +44 -40
  41. disdrodb/cli/disdrodb_run_l2m.py +55 -51
  42. disdrodb/cli/disdrodb_run_l2m_station.py +43 -40
  43. disdrodb/cli/disdrodb_run_station.py +184 -0
  44. disdrodb/cli/disdrodb_upload_archive.py +51 -42
  45. disdrodb/cli/disdrodb_upload_station.py +42 -36
  46. disdrodb/configs.py +20 -16
  47. disdrodb/constants.py +5 -2
  48. disdrodb/data_transfer/__init__.py +1 -3
  49. disdrodb/data_transfer/download_data.py +45 -61
  50. disdrodb/data_transfer/upload_data.py +7 -11
  51. disdrodb/data_transfer/zenodo.py +2 -4
  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 +47 -0
  75. disdrodb/fall_velocity/graupel.py +484 -0
  76. disdrodb/fall_velocity/hail.py +288 -0
  77. disdrodb/{l1/fall_velocity.py → fall_velocity/rain.py} +265 -44
  78. disdrodb/issue/__init__.py +1 -3
  79. disdrodb/issue/checks.py +2 -3
  80. disdrodb/issue/reader.py +2 -3
  81. disdrodb/issue/writer.py +2 -5
  82. disdrodb/l0/__init__.py +2 -1
  83. disdrodb/l0/check_configs.py +36 -29
  84. disdrodb/l0/check_standards.py +1 -4
  85. disdrodb/l0/configs/LPM/l0a_encodings.yml +17 -17
  86. disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +55 -55
  87. disdrodb/l0/configs/LPM/l0b_encodings.yml +17 -17
  88. disdrodb/l0/configs/LPM/raw_data_format.yml +17 -17
  89. disdrodb/l0/configs/LPM_V0/l0a_encodings.yml +2 -2
  90. disdrodb/l0/configs/LPM_V0/l0b_cf_attrs.yml +2 -2
  91. disdrodb/l0/configs/LPM_V0/l0b_encodings.yml +2 -2
  92. disdrodb/l0/configs/LPM_V0/raw_data_format.yml +2 -2
  93. disdrodb/l0/configs/ODM470/bins_diameter.yml +643 -0
  94. disdrodb/l0/configs/ODM470/bins_velocity.yml +0 -0
  95. disdrodb/l0/configs/ODM470/l0a_encodings.yml +11 -0
  96. disdrodb/l0/configs/ODM470/l0b_cf_attrs.yml +46 -0
  97. disdrodb/l0/configs/ODM470/l0b_encodings.yml +106 -0
  98. disdrodb/l0/configs/ODM470/raw_data_format.yml +111 -0
  99. disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +1 -1
  100. disdrodb/l0/l0_reader.py +2 -3
  101. disdrodb/l0/l0a_processing.py +6 -8
  102. disdrodb/l0/l0b_nc_processing.py +3 -6
  103. disdrodb/l0/l0b_processing.py +2 -16
  104. disdrodb/l0/l0c_processing.py +29 -12
  105. disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +2 -1
  106. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +18 -18
  107. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +18 -18
  108. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +18 -18
  109. disdrodb/l0/readers/LPM/GERMANY/DWD.py +244 -63
  110. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +65 -23
  111. disdrodb/l0/readers/LPM/ITALY/GID_LPM_AQ.py +277 -0
  112. disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +19 -18
  113. disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +23 -19
  114. disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +19 -21
  115. disdrodb/l0/readers/LPM/KIT/CHWALA.py +19 -20
  116. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +1 -1
  117. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +18 -18
  118. disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +19 -20
  119. disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +19 -20
  120. disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +19 -20
  121. disdrodb/l0/readers/LPM/SLOVENIA/UL.py +19 -20
  122. disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +19 -20
  123. disdrodb/l0/readers/LPM/UK/DIVEN.py +1 -1
  124. disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +19 -20
  125. disdrodb/l0/readers/LPM/USA/CHARLESTON.py +19 -20
  126. disdrodb/l0/readers/LPM/USA/DEVEX.py +255 -0
  127. disdrodb/l0/readers/LPM_V0/BELGIUM/ULIEGE.py +3 -5
  128. disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +4 -3
  129. disdrodb/l0/readers/ODM470/OCEAN/OCEANRAIN.py +124 -0
  130. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +1 -1
  131. disdrodb/l0/readers/PARSIVEL/BASQUECOUNTRY/EUSKALMET_OTT.py +2 -1
  132. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +2 -3
  133. disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +2 -1
  134. disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +2 -1
  135. disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +2 -1
  136. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +2 -1
  137. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +2 -1
  138. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +2 -1
  139. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +2 -1
  140. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +2 -1
  141. disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +2 -1
  142. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +2 -1
  143. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +2 -1
  144. disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +2 -1
  145. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +2 -1
  146. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +2 -1
  147. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +2 -1
  148. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +1 -1
  149. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +1 -1
  150. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +2 -1
  151. disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +2 -1
  152. disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +1 -1
  153. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +2 -1
  154. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +2 -1
  155. disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +2 -1
  156. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +2 -1
  157. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +2 -1
  158. disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +2 -1
  159. disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +1 -1
  160. disdrodb/l0/readers/PARSIVEL/KOREA/ICEPOP_MSC.py +159 -0
  161. disdrodb/l0/readers/PARSIVEL/NASA/LPVEX.py +1 -1
  162. disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +1 -1
  163. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +1 -1
  164. disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +1 -1
  165. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +1 -1
  166. disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +1 -1
  167. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +1 -1
  168. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +1 -3
  169. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +1 -3
  170. disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +2 -1
  171. disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +2 -1
  172. disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +2 -1
  173. disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +2 -3
  174. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +1 -1
  175. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +1 -1
  176. disdrodb/l0/readers/PARSIVEL2/CANADA/UQAM_NC.py +1 -1
  177. disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +1 -1
  178. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +2 -1
  179. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +2 -1
  180. disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +1 -1
  181. disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +2 -3
  182. disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +2 -2
  183. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +1 -3
  184. disdrodb/l0/readers/PARSIVEL2/GREECE/NOA.py +4 -3
  185. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +1 -3
  186. disdrodb/l0/readers/PARSIVEL2/ITALY/HYDROX.py +6 -3
  187. disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +1 -1
  188. disdrodb/l0/readers/PARSIVEL2/KIT/BURKINA_FASO.py +1 -1
  189. disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +1 -1
  190. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_MSC.py +161 -0
  191. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_UCLM.py +126 -0
  192. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +2 -1
  193. disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +1 -1
  194. disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +1 -1
  195. disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +3 -1
  196. disdrodb/l0/readers/PARSIVEL2/NASA/NSSTC.py +1 -1
  197. disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +2 -1
  198. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +1 -1
  199. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +1 -1
  200. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +2 -1
  201. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +2 -1
  202. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +1 -1
  203. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +1 -1
  204. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +1 -1
  205. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +2 -3
  206. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
  207. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +2 -1
  208. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +1 -1
  209. disdrodb/l0/readers/PARSIVEL2/NORWAY/UIB.py +10 -2
  210. disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +2 -3
  211. disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +1 -1
  212. disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +1 -1
  213. disdrodb/l0/readers/PARSIVEL2/SPAIN/GRANADA.py +2 -3
  214. disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +1 -1
  215. disdrodb/l0/readers/PARSIVEL2/SWEDEN/SMHI.py +2 -1
  216. disdrodb/l0/readers/PARSIVEL2/USA/CSU.py +1 -1
  217. disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +2 -1
  218. disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +2 -3
  219. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +2 -3
  220. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +2 -1
  221. disdrodb/l0/readers/RD80/BRAZIL/ATTO_RD80.py +1 -3
  222. disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +1 -3
  223. disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +1 -3
  224. disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +1 -3
  225. disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +1 -3
  226. disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +2 -3
  227. disdrodb/l0/readers/SWS250/BELGIUM/KMI.py +2 -3
  228. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +2 -3
  229. disdrodb/l0/readers/template_reader_raw_text_data.py +2 -3
  230. disdrodb/l0/standards.py +4 -5
  231. disdrodb/l0/template_tools.py +7 -11
  232. disdrodb/l1/__init__.py +2 -1
  233. disdrodb/l1/classification.py +914 -0
  234. disdrodb/l1/processing.py +36 -106
  235. disdrodb/l1/resampling.py +13 -3
  236. disdrodb/l1_env/__init__.py +1 -1
  237. disdrodb/l1_env/routines.py +7 -6
  238. disdrodb/l2/__init__.py +2 -1
  239. disdrodb/l2/empirical_dsd.py +58 -31
  240. disdrodb/l2/processing.py +327 -61
  241. disdrodb/metadata/checks.py +10 -13
  242. disdrodb/metadata/download.py +5 -4
  243. disdrodb/metadata/geolocation.py +3 -4
  244. disdrodb/metadata/info.py +3 -5
  245. disdrodb/metadata/manipulation.py +1 -3
  246. disdrodb/metadata/reader.py +1 -3
  247. disdrodb/metadata/search.py +1 -4
  248. disdrodb/metadata/standards.py +1 -3
  249. disdrodb/metadata/writer.py +1 -3
  250. disdrodb/physics/__init__.py +17 -0
  251. disdrodb/physics/atmosphere.py +273 -0
  252. disdrodb/physics/water.py +131 -0
  253. disdrodb/physics/wrappers.py +63 -0
  254. disdrodb/psd/__init__.py +1 -2
  255. disdrodb/psd/fitting.py +23 -9
  256. disdrodb/psd/models.py +2 -1
  257. disdrodb/routines/__init__.py +6 -1
  258. disdrodb/routines/l0.py +39 -25
  259. disdrodb/routines/l1.py +23 -16
  260. disdrodb/routines/l2.py +12 -9
  261. disdrodb/routines/options.py +117 -73
  262. disdrodb/routines/options_validation.py +728 -0
  263. disdrodb/routines/wrappers.py +460 -40
  264. disdrodb/scattering/__init__.py +1 -2
  265. disdrodb/scattering/axis_ratio.py +6 -6
  266. disdrodb/scattering/permittivity.py +9 -8
  267. disdrodb/scattering/routines.py +33 -15
  268. disdrodb/summary/__init__.py +1 -1
  269. disdrodb/summary/routines.py +95 -30
  270. disdrodb/utils/__init__.py +1 -1
  271. disdrodb/utils/archiving.py +18 -10
  272. disdrodb/utils/attrs.py +7 -5
  273. disdrodb/utils/cli.py +8 -10
  274. disdrodb/utils/compression.py +10 -13
  275. disdrodb/utils/coords.py +45 -0
  276. disdrodb/utils/dask.py +7 -5
  277. disdrodb/utils/dataframe.py +5 -6
  278. disdrodb/utils/decorators.py +3 -4
  279. disdrodb/utils/dict.py +1 -1
  280. disdrodb/utils/directories.py +5 -7
  281. disdrodb/utils/encoding.py +4 -5
  282. disdrodb/utils/event.py +1 -1
  283. disdrodb/utils/list.py +1 -3
  284. disdrodb/utils/logger.py +1 -3
  285. disdrodb/utils/manipulations.py +175 -4
  286. disdrodb/utils/pydantic.py +81 -0
  287. disdrodb/utils/routines.py +2 -3
  288. disdrodb/utils/subsetting.py +1 -1
  289. disdrodb/utils/time.py +6 -4
  290. disdrodb/utils/warnings.py +2 -3
  291. disdrodb/utils/writer.py +5 -3
  292. disdrodb/utils/xarray.py +31 -3
  293. disdrodb/utils/yaml.py +1 -3
  294. disdrodb/viz/__init__.py +1 -1
  295. disdrodb/viz/plots.py +193 -18
  296. {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/METADATA +5 -4
  297. disdrodb-0.4.0.dist-info/RECORD +361 -0
  298. {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/entry_points.txt +3 -0
  299. disdrodb/etc/products/L1/1MIN.yaml +0 -13
  300. disdrodb/etc/products/L1/LPM/1MIN.yaml +0 -13
  301. disdrodb/etc/products/L1/LPM_V0/1MIN.yaml +0 -13
  302. disdrodb/etc/products/L1/PARSIVEL/1MIN.yaml +0 -13
  303. disdrodb/etc/products/L1/PARSIVEL2/1MIN.yaml +0 -13
  304. disdrodb/etc/products/L1/PWS100/1MIN.yaml +0 -13
  305. disdrodb/etc/products/L1/RD80/1MIN.yaml +0 -13
  306. disdrodb/etc/products/L1/SWS250/1MIN.yaml +0 -13
  307. disdrodb/etc/products/L2M/10MIN.yaml +0 -12
  308. disdrodb/l1/beard_model.py +0 -662
  309. disdrodb/l1/filters.py +0 -205
  310. disdrodb-0.2.1.dist-info/RECORD +0 -329
  311. {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/WHEEL +0 -0
  312. {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/licenses/LICENSE +0 -0
  313. {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/top_level.txt +0 -0
@@ -1,662 +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
- ####---------------------------------------------------------------------------.
389
- #### Wrappers
390
- def retrieve_air_pressure(ds_env):
391
- """Retrieve air pressure."""
392
- if "air_pressure" in ds_env:
393
- return ds_env["air_pressure"]
394
- air_pressure = get_air_pressure_at_height(
395
- altitude=ds_env["altitude"],
396
- latitude=ds_env["latitude"],
397
- temperature=ds_env["temperature"],
398
- sea_level_air_pressure=ds_env["sea_level_air_pressure"],
399
- lapse_rate=ds_env["lapse_rate"],
400
- )
401
- return air_pressure
402
-
403
-
404
- def retrieve_air_dynamic_viscosity(ds_env):
405
- """Retrieve air dynamic viscosity."""
406
- air_viscosity = get_air_dynamic_viscosity(ds_env["temperature"])
407
- return air_viscosity
408
-
409
-
410
- def retrieve_air_density(ds_env):
411
- """Retrieve air density."""
412
- temperature = ds_env["temperature"]
413
- relative_humidity = ds_env["relative_humidity"]
414
- air_pressure = retrieve_air_pressure(ds_env)
415
- vapor_pressure = get_vapor_actual_pressure(
416
- relative_humidity=relative_humidity,
417
- temperature=temperature,
418
- )
419
- air_density = get_air_density(
420
- temperature=temperature,
421
- air_pressure=air_pressure,
422
- vapor_pressure=vapor_pressure,
423
- )
424
- return air_density
425
-
426
-
427
- ####---------------------------------------------------------------------------.
428
- #### Beard model
429
-
430
-
431
- def get_raindrop_reynolds_number(diameter, temperature, air_density, water_density, g):
432
- """Compute raindrop Reynolds number.
433
-
434
- It quantifies the relative strength of the convective inertia and linear viscous
435
- forces acting on the drop at terminal velocity.
436
-
437
- Estimates Reynolds number for drops with diameter between 19 um and 7 mm.
438
- Coefficients are taken from Table 1 of Beard 1976.
439
-
440
- Reference: Beard 1976; Pruppacher & Klett 1978
441
- See also Table A1 in Rahman et al., 2020.
442
-
443
- Parameters
444
- ----------
445
- diameter : float
446
- Diameter of the raindrop in meters.
447
- temperature : float
448
- Temperature in Kelvin.
449
- air_density : float
450
- Density of air in kg/m^3.
451
- water_density : float
452
- Density of water in kg/m^3.
453
- g : float
454
- Gravitational acceleration in m/s^2.
455
-
456
- Returns
457
- -------
458
- float
459
- Reynolds number for the raindrop.
460
- """
461
- # Define mask for small and large particles
462
- small_diam_mask = diameter < 1.07e-3 # < 1mm
463
-
464
- # Compute properties
465
- pure_water_surface_tension = get_pure_water_surface_tension(temperature) # N/m
466
- air_viscosity = get_air_dynamic_viscosity(temperature) # kg/(m*s) (aka Pa*s).
467
- delta_density = water_density - air_density
468
-
469
- # Compute Davies number for small droplets
470
- davis_number = 4 * air_density * delta_density * g * diameter**3 / (3 * air_viscosity**2)
471
-
472
- # Compute the slip correction (is approx 1 and can be discarded)
473
- # l0 = 6.62*1e-8 # m
474
- # v0 = 0.01818 # g / m / s
475
- # p0 = 101_325_25 # Pa
476
- # t0 = 293.15 # K
477
- # c_sc = 1 + 2.51*l0*(air_viscosity/v0)*(air_pressure/p0)*((temperature/t0)**3)/diameter
478
-
479
- # Compute modified Bond and physical property numbers for large droplets
480
- bond_number = 4 * delta_density * g * diameter**2 / (3 * pure_water_surface_tension)
481
- property_number = pure_water_surface_tension**3 * air_density**2 / (air_viscosity**4 * delta_density * g)
482
-
483
- # Compute Reynolds_number_for small particles (diameter < 0.00107) (1 mm)
484
- # --> First 9 bins of Parsivel ...
485
- b = [-3.18657, 0.992696, -0.00153193, -0.000987059, -0.000578878, 0.0000855176, -0.00000327815]
486
- x = np.log(davis_number)
487
- y = b[0] + sum(b * x**i for i, b in enumerate(b[1:], start=1))
488
- reynolds_number_small = np.exp(y) # TODO: miss C_sc = slip correction factor ?
489
-
490
- # Compute Reynolds_number_for large particles (diameter >= 0.00107)
491
- b = [-5.00015, 5.23778, -2.04914, 0.475294, -0.0542819, 0.00238449]
492
- log_property_number = np.log(property_number) / 6
493
- x = np.log(bond_number) + log_property_number
494
- y = b[0]
495
- y = b[0] + sum(b * x**i for i, b in enumerate(b[1:], start=1))
496
- reynolds_number_large = np.exp(log_property_number + y)
497
-
498
- # Define final reynolds number
499
- reynolds_number = xr.where(small_diam_mask, reynolds_number_small, reynolds_number_large)
500
- return reynolds_number
501
-
502
-
503
- def get_drag_coefficient(diameter, air_density, water_density, fall_velocity, g=9.81):
504
- """
505
- Computes the drag coefficient for a raindrop.
506
-
507
- Parameters
508
- ----------
509
- diameter : float
510
- Diameter of the raindrop in meters.
511
- air_density : float
512
- Density of air in kg/m^3.
513
- water_density : float
514
- Density of water in kg/m^3.
515
- fall_velocity : float
516
- Terminal fall velocity of the raindrop in m/s.
517
- g : float
518
- Gravitational acceleration in m/s^2.
519
-
520
- Returns
521
- -------
522
- float
523
- Drag coefficient of the raindrop.
524
- """
525
- delta_density = water_density - air_density
526
- drag_coefficient = 4 * delta_density * g * diameter / (3 * air_density * fall_velocity**2)
527
- return drag_coefficient
528
-
529
-
530
- def get_fall_velocity_beard_1976(diameter, temperature, air_density, water_density, g):
531
- """
532
- Computes the terminal fall velocity of a raindrop in still air.
533
-
534
- Reference: Beard 1976; Pruppacher & Klett 1978
535
-
536
- Parameters
537
- ----------
538
- diameter : float
539
- Diameter of the raindrop in meters.
540
- temperature : float
541
- Temperature in Kelvin.
542
- air_density : float
543
- Density of air in kg/m^3.
544
- water_density : float
545
- Density of water in kg/m^3.
546
- g : float
547
- Gravitational acceleration in m/s^2.
548
-
549
- Returns
550
- -------
551
- float
552
- Terminal fall velocity of the raindrop in m/s.
553
- """
554
- air_viscosity = get_air_dynamic_viscosity(temperature)
555
- reynolds_number = get_raindrop_reynolds_number(
556
- diameter=diameter,
557
- temperature=temperature,
558
- air_density=air_density,
559
- water_density=water_density,
560
- g=g,
561
- )
562
- fall_velocity = air_viscosity * reynolds_number / (air_density * diameter)
563
- return fall_velocity
564
-
565
-
566
- def retrieve_fall_velocity(
567
- diameter,
568
- altitude,
569
- latitude,
570
- temperature,
571
- relative_humidity,
572
- air_pressure=None,
573
- sea_level_air_pressure=101_325,
574
- gas_constant_dry_air=287.04,
575
- lapse_rate=0.0065,
576
- ):
577
- """
578
- Computes the terminal fall velocity and drag coefficients for liquid raindrops.
579
-
580
- Parameters
581
- ----------
582
- diameter : float
583
- Diameter of the raindrop in meters.
584
- altitude : float
585
- Altitude in meters.
586
- temperature : float
587
- Temperature in Kelvin.
588
- relative_humidity : float
589
- Relative humidity. A value between 0 and 1.
590
- latitude : float
591
- Latitude in degrees.
592
- air_pressure : float
593
- Air pressure in Pascals.
594
- If None, air_pressure at altitude is inferred assuming
595
- a standard atmospheric pressure at sea level.
596
- sea_level_air_pressure : float
597
- Standard atmospheric pressure at sea level in Pascals.
598
- The default is 101_325 Pascal.
599
- gas_constant_dry_air : float, optional
600
- Gas constant for dry air in J/(kg*K). The default is 287.04 is J/(kg*K).
601
- lapse_rate : float, optional
602
- Standard atmospheric lapse rate in K/m. The default is 0.0065 K/m.
603
-
604
- Returns
605
- -------
606
- tuple
607
- Terminal fall velocity and drag coefficients for liquid raindrops.
608
- """
609
- # Retrieve air pressure at altitude if not specified
610
- if air_pressure is None:
611
- air_pressure = get_air_pressure_at_height(
612
- altitude=altitude,
613
- latitude=latitude,
614
- temperature=temperature,
615
- sea_level_air_pressure=sea_level_air_pressure,
616
- lapse_rate=lapse_rate,
617
- gas_constant_dry_air=gas_constant_dry_air,
618
- )
619
-
620
- # else
621
- # --> Estimate sea_level_air_pressure from air_pressure ?
622
-
623
- # Retrieve vapour pressure (from relative humidity)
624
- vapor_pressure = get_vapor_actual_pressure(
625
- relative_humidity=relative_humidity,
626
- temperature=temperature,
627
- )
628
-
629
- # Retrieve air density
630
- air_density = get_air_density(
631
- temperature=temperature,
632
- air_pressure=air_pressure,
633
- vapor_pressure=vapor_pressure,
634
- gas_constant_dry_air=gas_constant_dry_air,
635
- )
636
-
637
- # Retrieve water density
638
- water_density = get_water_density(
639
- temperature=temperature,
640
- air_pressure=air_pressure,
641
- sea_level_air_pressure=sea_level_air_pressure,
642
- )
643
-
644
- # Retrieve accurate gravitational_acceleration
645
- g = get_gravitational_acceleration(altitude=altitude, latitude=latitude)
646
-
647
- # Compute fall velocity
648
- fall_velocity = get_fall_velocity_beard_1976(
649
- diameter=diameter,
650
- temperature=temperature,
651
- air_density=air_density,
652
- water_density=water_density,
653
- g=g,
654
- )
655
-
656
- # drag_coefficient = get_drag_coefficient(diameter=diameter,
657
- # air_density=air_density,
658
- # water_density=water_density,
659
- # g=g.
660
- # fall_velocity=fall_velocity)
661
-
662
- return fall_velocity