wrfrun 0.1.4__tar.gz → 0.1.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. wrfrun-0.1.6/.gitattributes +5 -0
  2. {wrfrun-0.1.4 → wrfrun-0.1.6}/.gitignore +1 -0
  3. {wrfrun-0.1.4 → wrfrun-0.1.6}/PKG-INFO +7 -4
  4. {wrfrun-0.1.4 → wrfrun-0.1.6}/README.md +6 -2
  5. {wrfrun-0.1.4 → wrfrun-0.1.6}/meson.build +1 -1
  6. {wrfrun-0.1.4 → wrfrun-0.1.6}/pyproject.toml +3 -3
  7. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/data.py +7 -6
  8. wrfrun-0.1.6/wrfrun/extension/goos_sst/README.md +10 -0
  9. wrfrun-0.1.6/wrfrun/extension/littler/README.md +9 -0
  10. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/littler/utils.py +1 -1
  11. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/meson.build +0 -1
  12. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/model/__init__.py +0 -3
  13. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/model/geodata.py +1 -1
  14. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/model/meson.build +3 -5
  15. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/model/run.py +4 -45
  16. wrfrun-0.1.6/wrfrun/model/utils/__init__.py +5 -0
  17. wrfrun-0.1.4/wrfrun/model/utils.py → wrfrun-0.1.6/wrfrun/model/utils/core.py +16 -7
  18. wrfrun-0.1.6/wrfrun/model/utils/meson.build +11 -0
  19. wrfrun-0.1.4/wrfrun/model/wrf.py → wrfrun-0.1.6/wrfrun/model/utils/wrf_utils.py +1 -1
  20. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/__init__.py +1 -0
  21. wrfrun-0.1.6/wrfrun/res/job_scheduler/__init__.py +8 -0
  22. wrfrun-0.1.6/wrfrun/res/job_scheduler/meson.build +8 -0
  23. wrfrun-0.1.6/wrfrun/res/job_scheduler/pbs.template +6 -0
  24. wrfrun-0.1.6/wrfrun/res/job_scheduler/slurm.template +6 -0
  25. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/meson.build +1 -0
  26. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/run.py +1 -2
  27. wrfrun-0.1.4/.gitattributes +0 -3
  28. {wrfrun-0.1.4 → wrfrun-0.1.6}/LICENSE +0 -0
  29. {wrfrun-0.1.4 → wrfrun-0.1.6}/main.py +0 -0
  30. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/__init__.py +0 -0
  31. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/core/__init__.py +0 -0
  32. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/core/config.py +0 -0
  33. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/core/constant.py +0 -0
  34. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/core/meson.build +0 -0
  35. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/core/namelist.py +0 -0
  36. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/core/server.py +0 -0
  37. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/__init__.py +0 -0
  38. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/goos_sst/__init__.py +0 -0
  39. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/goos_sst/goos_sst.py +0 -0
  40. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/goos_sst/meson.build +0 -0
  41. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/goos_sst/res/Vtable.ERA_GOOS_SST +0 -0
  42. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/goos_sst/res/__init__.py +0 -0
  43. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/goos_sst/res/meson.build +0 -0
  44. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/goos_sst/utils.py +0 -0
  45. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/littler/__init__.py +0 -0
  46. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/littler/meson.build +0 -0
  47. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/micaps/README.md +0 -0
  48. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/extension/utils.py +0 -0
  49. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/meson.build +0 -0
  50. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/model/core.py +0 -0
  51. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/model/namelist.py +0 -0
  52. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/model/plot.py +0 -0
  53. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/model/scheme.py +0 -0
  54. /wrfrun-0.1.4/wrfrun/model/ndown.py → /wrfrun-0.1.6/wrfrun/model/utils/ndown_utils.py +0 -0
  55. /wrfrun-0.1.4/wrfrun/model/wps.py → /wrfrun-0.1.6/wrfrun/model/utils/wps_utils.py +0 -0
  56. /wrfrun-0.1.4/wrfrun/model/wrfda.py → /wrfrun-0.1.6/wrfrun/model/utils/wrfda_utils.py +0 -0
  57. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/pbs.py +0 -0
  58. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/plot/__init__.py +0 -0
  59. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/plot/meson.build +0 -0
  60. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/plot/wps.py +0 -0
  61. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/config.yaml.template +0 -0
  62. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/extension/__init__.py +0 -0
  63. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/extension/meson.build +0 -0
  64. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/extension/plotgrids.ncl +0 -0
  65. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/geogrid/GEOGRID.SHAN_DONG_LANDUSE_SOIL_TOP.TBL +0 -0
  66. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/geogrid/__init__.py +0 -0
  67. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/geogrid/meson.build +0 -0
  68. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/metgrid/METGRID.TBL +0 -0
  69. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/metgrid/__init__.py +0 -0
  70. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/metgrid/meson.build +0 -0
  71. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/namelist/__init__.py +0 -0
  72. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/namelist/meson.build +0 -0
  73. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/namelist/namelist.input.da_wrfvar.template +0 -0
  74. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/namelist/namelist.input.dfi.template +0 -0
  75. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/namelist/namelist.input.real.template +0 -0
  76. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/namelist/namelist.input.wrf.template +0 -0
  77. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/namelist/namelist.wps.template +0 -0
  78. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/namelist/parame.in.template +0 -0
  79. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/run.sh.template +0 -0
  80. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/ungrib/__init__.py +0 -0
  81. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/res/ungrib/meson.build +0 -0
  82. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/utils.py +0 -0
  83. {wrfrun-0.1.4 → wrfrun-0.1.6}/wrfrun/workspace.py +0 -0
@@ -0,0 +1,5 @@
1
+ .gitea/ export-ignore
2
+ .github/ export-ignore
3
+ images/ export-ignore
4
+ .readthedocs.yaml export-ignore
5
+ docs export-ignore
@@ -9,6 +9,7 @@ dist/
9
9
  wrfrun.egg-info/
10
10
  .idea/
11
11
  data/
12
+ docs/build
12
13
 
13
14
  **/*.1
14
15
  **/*.input_step1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wrfrun
3
- Version: 0.1.4
3
+ Version: 0.1.6
4
4
  Summary: wrfrun is a comprehensive toolkit for managing and using WRF
5
5
  Keywords: WRF
6
6
  Author-Email: Syize <syizeliu@gmail.com>
@@ -18,7 +18,6 @@ Requires-Dist: PyYAML
18
18
  Requires-Dist: pandas
19
19
  Requires-Dist: f90nml
20
20
  Requires-Dist: cdsapi
21
- Requires-Dist: seafog
22
21
  Requires-Dist: matplotlib
23
22
  Requires-Dist: Cartopy
24
23
  Requires-Dist: wrf-python
@@ -43,10 +42,14 @@ The following are the main features that wrfrun wants to achieve. These features
43
42
  - Real-time parsing of WRF logs, feedback on simulation progress.
44
43
  - Support for adding more functionality through extensions.
45
44
 
46
- ## Install
45
+ ## Installation
47
46
 
48
47
  Install using pip:
49
48
 
50
49
  ```bash
51
50
  pip install wrfrun
52
- ```
51
+ ```
52
+
53
+ ## Documentation
54
+
55
+ Please check [Wiki](https://github.com/Syize/wrfrun/wiki).
@@ -16,10 +16,14 @@ The following are the main features that wrfrun wants to achieve. These features
16
16
  - Real-time parsing of WRF logs, feedback on simulation progress.
17
17
  - Support for adding more functionality through extensions.
18
18
 
19
- ## Install
19
+ ## Installation
20
20
 
21
21
  Install using pip:
22
22
 
23
23
  ```bash
24
24
  pip install wrfrun
25
- ```
25
+ ```
26
+
27
+ ## Documentation
28
+
29
+ Please check [Wiki](https://github.com/Syize/wrfrun/wiki).
@@ -1,7 +1,7 @@
1
1
  project(
2
2
  'wrfrun',
3
3
  'c',
4
- version: '0.1.4',
4
+ version: '0.1.6',
5
5
  license: 'BSD-3',
6
6
  meson_version: '>=0.64.0',
7
7
  default_options: ['warning_level=2'],
@@ -1,10 +1,10 @@
1
1
  [build-system]
2
2
  build-backend = "mesonpy"
3
- requires = ["meson-python", "numpy<2.0.0"]
3
+ requires = ["meson-python"]
4
4
 
5
5
  [project]
6
6
  name = "wrfrun"
7
- version = "0.1.4"
7
+ version = "0.1.6"
8
8
  readme = "README.md"
9
9
  license = { text = "GPL-3.0-or-later" }
10
10
  requires-python = '>=3.10'
@@ -14,7 +14,7 @@ maintainers = [
14
14
  ]
15
15
  keywords = [ "WRF", ]
16
16
  description = "wrfrun is a comprehensive toolkit for managing and using WRF"
17
- dependencies = ["xarray", "netCDF4", "rich", "PyYAML", "pandas", "f90nml", "cdsapi", "seafog", "matplotlib", "Cartopy", "wrf-python", "cfgrib"]
17
+ dependencies = ["xarray", "netCDF4", "rich", "PyYAML", "pandas", "f90nml", "cdsapi", "matplotlib", "Cartopy", "wrf-python", "cfgrib"]
18
18
 
19
19
  [project.urls]
20
20
  homepage = "https://github.com/Syize/wrfrun"
@@ -4,7 +4,7 @@ from os.path import exists, dirname
4
4
  from typing import Union, List, Tuple
5
5
 
6
6
  from pandas import date_range
7
- from seafog import goos_sst_find_data
7
+ # from seafog import goos_sst_find_data
8
8
 
9
9
  import cdsapi
10
10
 
@@ -315,9 +315,9 @@ def prepare_wps_input_data(area: Tuple[int, int, int, int]):
315
315
  download_data(start_date, end_date, hour_step, area, f"{bg_save_path}/pressure.grib",
316
316
  data_format="grib", data_type="pressure", overwrite=True)
317
317
 
318
- logger.info(f"Download NearGOOS data...")
319
- download_data(start_date, end_date, hour_step, area,
320
- save_path=sst_save_path, data_type="goos", overwrite=True)
318
+ # logger.info(f"Download NearGOOS data...")
319
+ # download_data(start_date, end_date, hour_step, area,
320
+ # save_path=sst_save_path, data_type="goos", overwrite=True)
321
321
 
322
322
 
323
323
  def download_data(
@@ -394,9 +394,10 @@ def download_data(
394
394
  )
395
395
  pressure_level = None
396
396
  elif data_type == "goos":
397
+ logger.warning(f"NEAR-GOOS SST data hasn't been supported yet")
397
398
  # download sst data
398
- for _date in date_list:
399
- _ = goos_sst_find_data(_date, save_path=save_path)
399
+ # for _date in date_list:
400
+ # _ = goos_sst_find_data(_date, save_path=save_path)
400
401
 
401
402
  return ""
402
403
  else:
@@ -0,0 +1,10 @@
1
+ # GOOS SST extension
2
+
3
+ This extension can replace SKT (SKin Temperature) values in ERA5 reanalysis data with the SST (Sea Surface Temperature) from GOOS (Global Ocean Observing System). A new GRIB file will be generated so you can input it to WRF through `ungrib.exe` and `metgrid.exe`.
4
+
5
+ A [Vtable file](res/Vtable.ERA_GOOS_SST) is also provided for `ungrib.exe`.
6
+
7
+ ## Features
8
+
9
+ - Replace SKT in ERA5 data with GOOS SST and write new data to a GRIB file.
10
+ - While only ERA5 data is tested, data from other sources is supported theoretically.
@@ -0,0 +1,9 @@
1
+ # Little R extension
2
+
3
+ This extension can write data to `LITTLE_R` format for WRF data assimilation.
4
+
5
+ ## Features
6
+
7
+ - Provide `LittleR` class to write any data to `LITTLE_R` format.
8
+ - Write data to a zip file (end with `.zlr`, that is `Zipped Little R file`).
9
+ - Read data from the `.zlr` file, so you can create `LITTLE_R` file with the data.
@@ -14,7 +14,7 @@ def to_fstring(var: Union[int, float, bool, str], length: Union[int, Tuple[int,
14
14
  :param var: Basic variable, can be one of the ``[int, float, bool, str]``.
15
15
  :type var: Union[int, float, bool, str]
16
16
  :param length: The length of the output string.
17
- If the type of ``var`` is ``float``, the length must contains two parameters ``(total length, decimal length)``.
17
+ If the type of ``var`` is ``float``, the length must contain two parameters ``(total length, decimal length)``.
18
18
  :type length: Union[int, Tuple[int, int]]
19
19
  :return: Converted string.
20
20
  :rtype: str
@@ -6,5 +6,4 @@ py3.install_sources(
6
6
  subdir: 'wrfrun/extension'
7
7
  )
8
8
 
9
- subdir('goos_sst')
10
9
  subdir('littler')
@@ -1,8 +1,5 @@
1
1
  from .geodata import *
2
2
  from .namelist import *
3
- from .ndown import *
4
3
  from .plot import *
5
4
  from .run import *
6
5
  from .utils import *
7
- from .wps import *
8
- from .wrf import *
@@ -44,7 +44,7 @@ def _get_clip_area(index_area: tuple[int, int, int, int], row_num: int, col_num:
44
44
  Returns:
45
45
  tuple[int, int, int, int]: Clip area.
46
46
  """
47
- # caluclate tile area
47
+ # calculate tile area
48
48
  tile_area = (
49
49
  col_num * tile_x + 1,
50
50
  col_num * tile_x + tile_x,
@@ -4,13 +4,11 @@ py3.install_sources(
4
4
  'core.py',
5
5
  'geodata.py',
6
6
  'namelist.py',
7
- 'ndown.py',
8
7
  'plot.py',
9
8
  'run.py',
10
9
  'scheme.py',
11
- 'wps.py',
12
- 'wrf.py',
13
- 'wrfda.py',
14
10
  ],
15
11
  subdir: 'wrfrun/model'
16
- )
12
+ )
13
+
14
+ subdir('utils')
@@ -8,10 +8,7 @@ from wrfrun.pbs import get_core_num
8
8
  from wrfrun.utils import check_path, logger
9
9
  from .core import exec_geogrid, exec_metgrid, exec_ndown, exec_real, exec_ungrib, exec_wrf
10
10
  from .namelist import generate_namelist_file, prepare_dfi_namelist
11
- from .ndown import process_after_ndown
12
- from .utils import model_preprocess, model_postprocess
13
- from .wps import get_wif_dir, get_wif_prefix
14
- from .wrf import reconcile_namelist_metgrid
11
+ from .utils import model_preprocess, model_postprocess, process_after_ndown, get_wif_dir, get_wif_prefix, reconcile_namelist_metgrid
15
12
 
16
13
 
17
14
  def geogrid(geogrid_tbl_file: Union[str, None] = None):
@@ -48,8 +45,8 @@ def geogrid(geogrid_tbl_file: Union[str, None] = None):
48
45
 
49
46
  exec_geogrid(get_core_num())
50
47
 
51
- model_postprocess(WPS_WORK_PATH, log_save_path, startswith="geogrid.log", copy_only=False)
52
- model_postprocess(WPS_WORK_PATH, output_save_path, startswith="geo_em", outputs=["namelist.wps"])
48
+ model_postprocess(WPS_WORK_PATH, log_save_path, startswith="geogrid.log", copy_only=False, outputs="namelist.wps")
49
+ model_postprocess(WPS_WORK_PATH, output_save_path, startswith="geo_em")
53
50
 
54
51
  # for _file in listdir(WPS_WORK_PATH):
55
52
  # if _file.startswith("geogrid.log"):
@@ -205,21 +202,9 @@ def real(metgrid_path: Union[str, None] = None):
205
202
 
206
203
  exec_real(get_core_num())
207
204
 
208
- model_postprocess(WRF_WORK_PATH, output_save_path, startswith=["wrfbdy", "wrfinput", "wrflow"])
205
+ model_postprocess(WRF_WORK_PATH, output_save_path, startswith=("wrfbdy", "wrfinput", "wrflow"))
209
206
  model_postprocess(WRF_WORK_PATH, log_save_path, startswith="rsl.", outputs="namelist.input", copy_only=False)
210
207
 
211
- # for _file in listdir(WRF_WORK_PATH):
212
- # if _file.startswith("rsl."):
213
- # move(f"{WRF_WORK_PATH}/{_file}", f"{log_save_path}/{_file}")
214
- # elif _file.startswith("wrfbdy"):
215
- # copyfile(f"{WRF_WORK_PATH}/{_file}", f"{output_save_path}/{_file}")
216
- # elif _file.startswith("wrfinput"):
217
- # copyfile(f"{WRF_WORK_PATH}/{_file}", f"{output_save_path}/{_file}")
218
- # elif _file.startswith("wrflow"):
219
- # copyfile(f"{WRF_WORK_PATH}/{_file}", f"{output_save_path}/{_file}")
220
- #
221
- # move(f"{WRF_WORK_PATH}/namelist.input", f"{log_save_path}/namelist.input")
222
-
223
208
  logger.info(f"All real output files have been copied to {output_save_path}")
224
209
 
225
210
 
@@ -272,18 +257,6 @@ def dfi(real_output_path: Union[str, None] = None, update_real_output=True):
272
257
  model_postprocess(WRF_WORK_PATH, log_save_path, startswith="rsl.", outputs="namelist.input", copy_only=False)
273
258
  model_postprocess(WRF_WORK_PATH, output_save_path, outputs="wrfinput_initialized_d01")
274
259
 
275
- # for _file in listdir(WRF_WORK_PATH):
276
- # if _file.startswith("rsl."):
277
- # move(f"{WRF_WORK_PATH}/{_file}", f"{log_save_path}/{_file}")
278
- # elif _file == "wrfinput_initialized_d01":
279
- # move(f"{WRF_WORK_PATH}/{_file}", f"{output_save_path}/{_file}")
280
- # if update_real_output:
281
- # move(f"{real_output_path}/wrfinput_d01", f"{real_output_path}/wrfinput_d01_before_dfi")
282
- # copyfile(f"{output_save_path}/{_file}", f"{real_output_path}/wrfinput_d01")
283
- # logger.info(f"Replace real's output \"wrfinput_d01\" with output, old file has been renamed as \"wrfinput_d01_before_dfi\"")
284
- #
285
- # move(f"{WRF_WORK_PATH}/namelist.input", f"{log_save_path}/namelist.input")
286
-
287
260
  if update_real_output:
288
261
  move(f"{real_output_path}/wrfinput_d01", f"{real_output_path}/wrfinput_d01_before_dfi")
289
262
  copyfile(f"{output_save_path}/wrfinput_initialized_d01", f"{real_output_path}/wrfinput_d01")
@@ -336,14 +309,6 @@ def wrf(wrf_input_path: Union[str, None] = None):
336
309
  model_postprocess(WRF_WORK_PATH, log_save_path, startswith="rsl.", outputs="namelist.input", copy_only=False)
337
310
  model_postprocess(WRF_WORK_PATH, output_save_path, startswith="wrfout")
338
311
 
339
- # for _file in listdir(WRF_WORK_PATH):
340
- # if _file.startswith("rsl."):
341
- # move(f"{WRF_WORK_PATH}/{_file}", f"{log_save_path}/{_file}")
342
- # elif _file.startswith("wrfout"):
343
- # copyfile(f"{WRF_WORK_PATH}/{_file}", f"{output_save_path}/{_file}")
344
- #
345
- # move(f"{WRF_WORK_PATH}/namelist.input", f"{log_save_path}/namelist.input")
346
-
347
312
  logger.info(f"All wrf output files have been copied to {output_save_path}")
348
313
 
349
314
 
@@ -397,12 +362,6 @@ def ndown(wrfout_file_path: str, wrfinput_file_path: str, update_namelist=True):
397
362
 
398
363
  model_postprocess(WRF_WORK_PATH, log_save_path, startswith="rsl.", outputs="namelist.input", copy_only=False)
399
364
 
400
- # for _file in listdir(WRF_WORK_PATH):
401
- # if _file.startswith("rsl."):
402
- # move(f"{WRF_WORK_PATH}/{_file}", f"{log_save_path}/{_file}")
403
- #
404
- # move(f"{WRF_WORK_PATH}/namelist.input", f"{log_save_path}/namelist.input")
405
-
406
365
  logger.info(f"Rename ndown output `wrfinput_d02` to `wrfinput_d01`")
407
366
  move(f"{WRF_WORK_PATH}/wrfinput_d02", f"{output_save_path}/wrfinput_d01")
408
367
 
@@ -0,0 +1,5 @@
1
+ from .core import *
2
+ from .ndown_utils import *
3
+ from .wps_utils import *
4
+ from .wrf_utils import *
5
+ from .wrfda_utils import *
@@ -1,7 +1,7 @@
1
1
  from os import listdir, makedirs
2
2
  from os.path import basename, exists
3
3
  from shutil import copyfile, move
4
- from typing import Tuple, Union, List
4
+ from typing import Tuple, Union, List, Iterable
5
5
 
6
6
  from wrfrun.utils import logger
7
7
 
@@ -57,7 +57,7 @@ def model_preprocess(exec_name: str, work_path: str):
57
57
  copyfile(_file, f"{work_path}/{filename}")
58
58
 
59
59
 
60
- def model_postprocess(output_dir: str, save_path: str, startswith: Union[None, str, Tuple[str]] = None, endswith: Union[None, str, Tuple[str]] = None,
60
+ def model_postprocess(output_dir: str, save_path: str, startswith: Union[None, str, Tuple[str, ...]] = None, endswith: Union[None, str, Tuple[str, ...]] = None,
61
61
  outputs: Union[None, str, List[str]] = None, copy_only=True):
62
62
  """
63
63
  Save the results and logs from the model.
@@ -84,26 +84,35 @@ def model_postprocess(output_dir: str, save_path: str, startswith: Union[None, s
84
84
  save_file_list = []
85
85
 
86
86
  if startswith is not None:
87
+ _list = []
87
88
  for _file in file_list:
88
89
  if _file.startswith(startswith):
89
- save_file_list.append(_file)
90
+ _list.append(_file)
91
+ save_file_list += _list
92
+
93
+ logger.debug(f"Collect files match `startswith`: {_list}")
90
94
 
91
95
  if endswith is not None:
96
+ _list = []
92
97
  for _file in file_list:
93
98
  if _file.endswith(endswith):
94
- save_file_list.append(_file)
99
+ _list.append(_file)
100
+ save_file_list += _list
101
+
102
+ logger.debug(f"Collect files match `endswith`: {_list}")
95
103
 
96
104
  if outputs is not None:
97
- if isinstance(outputs, str):
98
- save_file_list.append(basename(outputs))
105
+ if isinstance(outputs, str) and outputs in file_list:
106
+ save_file_list.append(outputs)
99
107
  else:
100
- outputs = [basename(x) for x in outputs]
108
+ outputs = [x for x in outputs if x in file_list]
101
109
  save_file_list += outputs
102
110
 
103
111
  if len(save_file_list) < 1:
104
112
  return
105
113
 
106
114
  save_file_list = list(set(save_file_list))
115
+ logger.debug(f"Files to be processed: {save_file_list}")
107
116
 
108
117
  for _file in save_file_list:
109
118
  if copy_only:
@@ -0,0 +1,11 @@
1
+ py3.install_sources(
2
+ [
3
+ '__init__.py',
4
+ 'core.py',
5
+ 'ndown_utils.py',
6
+ 'wps_utils.py',
7
+ 'wrf_utils.py',
8
+ 'wrfda_utils.py',
9
+ ],
10
+ subdir: 'wrfrun/model/utils'
11
+ )
@@ -3,7 +3,7 @@ from shutil import move
3
3
 
4
4
  from wrfrun.core import WRFRUNConfig, WRFRUNConstants, WRFRUNNamelist
5
5
  from wrfrun.utils import check_path, logger
6
- from .wps import get_metgrid_levels
6
+ from .wps_utils import get_metgrid_levels
7
7
 
8
8
 
9
9
  def reconcile_namelist_metgrid(metgrid_path: str):
@@ -4,6 +4,7 @@ from .extension import *
4
4
  from .geogrid import *
5
5
  from .namelist import *
6
6
  from .ungrib import *
7
+ from .job_scheduler import *
7
8
 
8
9
 
9
10
  _RES_PATH = abspath(dirname(__file__))
@@ -0,0 +1,8 @@
1
+ from os.path import abspath, dirname
2
+
3
+
4
+ _RES_PATH = abspath(dirname(__file__))
5
+ PBS_TEMPLATE = f"{_RES_PATH}/pbs.template"
6
+ SLURM_TEMPLATE = f"{_RES_PATH}/slurm.template"
7
+
8
+ __all__ = ["PBS_TEMPLATE", "SLURM_TEMPLATE"]
@@ -0,0 +1,8 @@
1
+ py3.install_sources(
2
+ [
3
+ '__init__.py',
4
+ 'pbs.template',
5
+ 'slurm.template',
6
+ ],
7
+ subdir: 'wrfrun/res/job_scheduler'
8
+ )
@@ -0,0 +1,6 @@
1
+ #PBS -q batch
2
+ #PBS -N wrfrun
3
+ #PBS -o {STDOUT_LOG_PATH}
4
+ #PBS -e {STDERR_LOG_PATH}
5
+ #PBS -l nodes={NODE_NUM}:ppn={CORE_NUM}
6
+ #PBS -l walltime=9999:00:00
@@ -0,0 +1,6 @@
1
+ #SBATCH -J wrfrun %Job's name
2
+ #SBATCH -N{NODE_NUM} %node num
3
+ #SBATCH -n{CORE_NUM} %core num
4
+ #SBATCH --time=9999:00:00 %maximum run time
5
+ #SBATCH --output={STDOUT_LOG_PATH} %stdout output log path
6
+ #SBATCH --error={STDERR_LOG_PATH} %error output log path
@@ -12,3 +12,4 @@ subdir('geogrid')
12
12
  subdir('metgrid')
13
13
  subdir('namelist')
14
14
  subdir('ungrib')
15
+ subdir('job_scheduler')
@@ -12,8 +12,7 @@ from .core import WRFRUNConfig, WRFRUNConstants, WRFRunServer, WRFRunServerHandl
12
12
  from .data import prepare_wps_input_data
13
13
  from .model.namelist import prepare_wps_namelist, prepare_wrf_namelist, prepare_wrfda_namelist
14
14
  from .model.plot import plot_domain_area
15
- from .model.wps import clear_wps_logs
16
- from .model.wrf import clear_wrf_logs
15
+ from .model.utils import clear_wps_logs, clear_wrf_logs
17
16
  from .pbs import in_pbs, prepare_pbs_script
18
17
  from .utils import call_subprocess, check_path, logger, logger_add_file_handler
19
18
  from .workspace import prepare_workspace
@@ -1,3 +0,0 @@
1
- .gitea/ export-ignore
2
- .github/ export-ignore
3
- images/ export-ignore
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes