diff --git a/SRC/FEMAIN/Makefile b/SRC/FEMAIN/Makefile index 5be253d..b04ff07 100644 --- a/SRC/FEMAIN/Makefile +++ b/SRC/FEMAIN/Makefile @@ -159,8 +159,8 @@ all: FastEddy # Module=specific compile rules # ################################################################################ -../TIME_INTEGBRATION/CUDA/cuda_timeIntDevice.o: ../CUDA/cuda_timeIntDevice.cu \ - ../TIME_INTEGRATION.CUDA/cuda_RKschemes.cu +../TIME_INTEGRATION/CUDA/cuda_timeIntDevice.o: ../TIME_INTEGRATION/CUDA/cuda_timeIntDevice.cu \ + ../TIME_INTEGRATION/CUDA/cuda_RKschemes.cu $(TEST_CU_CC) $(TEST_CU_CFLAGS) -dc $< -o $@ ../IO/io.o: ../IO/io.c \ diff --git a/SRC/FEMAIN/Makefile.hip b/SRC/FEMAIN/Makefile.hip index cd7cc6a..0cbdbdd 100644 --- a/SRC/FEMAIN/Makefile.hip +++ b/SRC/FEMAIN/Makefile.hip @@ -33,7 +33,8 @@ TEST_CU_CC = hipcc -Rpass-analysis=kernel-resource-usage --gpu-max-threads-per-b ROCM_PATH ?= /opt/rocm MPI_ROOT ?= "" NETCDF_C_ROOT ?= "" -GPU_ARCH ?= gfx90a +#GPU_ARCH ?= gfx90a +GPU_ARCH ?= gfx942 # For compilation on NCAR's Casper or Derecho supercomputers use the OTHER_INCLUDES below OTHER_INCLUDES = -I${MPI_ROOT}/include @@ -121,6 +122,30 @@ TEST_OBJS = ./FastEddy.o \ ../PARAMETERS/parameters.o \ ../PARAMETERS/hashTable.o + +################################################################################ +# Extensions +################################################################################ +WITH_GAD = 0 +ifeq ($(WITH_GAD),1) + DEFINES+=-DGAD_EXT + INCLUDES+=-I../EXTENSIONS/GAD/ \ + -I../EXTENSIONS/GAD/CUDA/ + $(info WITH_GAD=1) + $(info ${DEFINES}) + $(info ${INCLUDES}) +endif + +WITH_URBAN = 0 +ifeq ($(WITH_URBAN),1) + DEFINES+=-DURBAN_EXT + INCLUDES+=-I../EXTENSIONS/URBAN/ \ + -I../EXTENSIONS/URBAN/CUDA/ + $(info WITH_URBAN=1) + $(info ${DEFINES}) + $(info ${INCLUDES}) +endif + ################################################################################ # Targets # ############################################################################### @@ -137,7 +162,6 @@ hipify: # Generic compile rules # ################################################################################ %.o: %.cu - rm -rf ./FastEddy_devlink.o; \ $(TEST_CU_CC) $(TEST_CU_CFLAGS) -fgpu-rdc -c $< -o $@ .c.o: @@ -149,7 +173,6 @@ hipify: ../TIME_INTEGRATION/CUDA/cuda_timeIntDevice.o: ../TIME_INTEGRATION/CUDA/cuda_timeIntDevice.cu \ ../TIME_INTEGRATION/CUDA/cuda_RKschemes.cu - rm -rf ./FastEddy_devlink.o; \ $(TEST_CU_CC) $(TEST_CU_CFLAGS) -fgpu-rdc -c $< -o $@ ../IO/io.o: ../IO/io.c \ @@ -160,7 +183,6 @@ hipify: ../FECUDA/fecuda_Device.o: ../FECUDA/fecuda_Device.cu \ ../FECUDA/fecuda_Utils.cu \ ../FECUDA/fecuda_PlugIns.cu - rm -rf ./FastEddy_devlink.o; \ $(TEST_CU_CC) $(TEST_CU_CFLAGS) -fgpu-rdc -c $< -o $@ ../HYDRO_CORE/CUDA/cuda_hydroCoreDevice.o: ../HYDRO_CORE/CUDA/cuda_hydroCoreDevice.cu \ @@ -178,8 +200,8 @@ hipify: ../HYDRO_CORE/CUDA/cuda_canopyDevice.cu \ ../HYDRO_CORE/CUDA/cuda_largeScaleForcingsDevice.cu \ ../HYDRO_CORE/CUDA/cuda_moistureDevice.cu \ - ../HYDRO_CORE/CUDA/cuda_filtersDevice.cu - rm -rf ./FastEddy_devlink.o; \ + ../HYDRO_CORE/CUDA/cuda_filtersDevice.cu \ + ../HYDRO_CORE/CUDA/cuda_cellpertDevice.cu $(TEST_CU_CC) $(TEST_CU_CFLAGS) -fgpu-rdc -c $< -o $@ ################################################################################ # Generic Executable @@ -190,6 +212,7 @@ FastEddy: COMP_FLAGS = ${TEST_CC} ${TEST_CFLAGS} TEST_DEPENDENCIES = ${TEST_OBJS} ${TEST_HDRS} FastEddy_devlink.o FastEddy_devlink.o: + rm -rf ./FastEddy_devlink.o; \ $(TEST_CU_CC) ${ARCH_CU_FLAGS} ${TEST_OBJS} ${TEST_LDFLAGS} ${TEST_LIBS} -fgpu-rdc --hip-link --emit-static-lib -o FastEddy_devlink.o FastEddy: ${TEST_DEPENDENCIES} ${COMP_FLAGS} -o FastEddy ${TEST_OBJS} ./FastEddy_devlink.o ${TEST_LDFLAGS} ${TEST_LIBS} diff --git a/docs/Tutorials/cases_extensions/GAD.rst b/docs/Tutorials/cases_extensions/GAD.rst index 1643787..9cfb6de 100644 --- a/docs/Tutorials/cases_extensions/GAD.rst +++ b/docs/Tutorials/cases_extensions/GAD.rst @@ -2,7 +2,7 @@ Turbine array flow with the GAD model ===================================== -This is an idealized scenario of wind farm (3 x 3 turbine array) flow in neutrally stratified boundary layer with an evolving wind direction spanning 90 degrees of clockwise turning over 40 minutes. This idealized scenario demonstrates the generalized actuator disk (GAD) implementation in FastEddy (*Sanchez Gomez et al., 2024*), with the inclusion of a turbine yawing capability to align with the meteorological wind direction at the turbine's nacelle. The initial and boundary conditions for this idealized case are derived from a horizontally averaged LES run of a neutral ABL with a geostrophic wind aligned in the zonal direction (:math:`[U_g,V_g]=[10.0,0.0]` m/s) with and a latitude of :math:`40.0^{\circ}` N. The required datasets to run this tutorial are provided at this Zenodo record [TO BE UPDATED]. +This is an idealized scenario of wind farm (3 x 3 turbine array) flow in neutrally stratified boundary layer with an evolving wind direction spanning 90 degrees of clockwise turning over 40 minutes. This idealized scenario demonstrates the generalized actuator disk (GAD) implementation in FastEddy (*Sanchez Gomez et al., 2024*), with the inclusion of a turbine yawing capability to align with the meteorological wind direction at the turbine's nacelle. The initial and boundary conditions for this idealized case are derived from a horizontally averaged LES run of a neutral ABL with a geostrophic wind aligned in the zonal direction (:math:`[U_g,V_g]=[10.0,0.0]` m/s) with and a latitude of :math:`40.0^{\circ}` N. The required datasets to run this tutorial are provided at this `Zenodo record `_. The GAD model is activated by the selector (:code:`GADSelector = 1`) in the parameters file. This case uses the parameters file **tutorials/examples/Example09_GAD.in**. The lines below correspond to additions to the FastEddy parameters file necessary for turbine-inclusive LES runs. These correspond to the turbine specification file (:code:`turbineSpecsFile`) and a parameter to choose whether or not to write GAD forces to output files (:code:`GADoutputForces`). diff --git a/docs/Tutorials/cases_extensions/WRF_coupling_case0_FE_urban.rst b/docs/Tutorials/cases_extensions/WRF_coupling_case0_FE_urban.rst index 5934388..ca72690 100644 --- a/docs/Tutorials/cases_extensions/WRF_coupling_case0_FE_urban.rst +++ b/docs/Tutorials/cases_extensions/WRF_coupling_case0_FE_urban.rst @@ -2,7 +2,7 @@ Real-world downscaled FastEddy simulation with buildings ======================================================== -This tutorial involves setting up a real-world downscaled simulation that includes resolved buildings and closely follows the same procedure outlined in section 4.1. Additional steps for including buildings are described below and all required input datasets to run this tutorial are provided in this Zenodo record [TO BE UPDATED]. +This tutorial involves setting up a real-world downscaled simulation that includes resolved buildings and closely follows the same procedure outlined in section 4.1. Additional steps for including buildings are described below and all required input datasets to run this tutorial are provided in this `Zenodo record `_. In the *GeoSpec* preprocessing step, and additional 2d field describing building heights above ground level is required in the georeference input NetCDF file. @@ -27,7 +27,7 @@ The urban model capability has been implemented into FastEddy as an extension mo make WITH_URBAN=1 -The model used to represent buildings follows the immersed body force approach described in *Muñoz-Esparza et al., 2020*, and the tutorial case corresponds to the passage of a cold front (*Muñoz-Esparza et al. (2021, 2025)*. The figure below shows instantaneous wind speed and vertical velocity fields corresponding to 30min hindcast valid at 1500 UTC on November 11th 2011 (pre-frontal conditions). These horizontal contours are from the model's third vertical level, located at approximately 23 m above ground level. +The model used to represent buildings follows the immersed body force approach described in *Muñoz-Esparza et al., 2020*, and the tutorial case corresponds to the passage of a cold front (*Muñoz-Esparza et al. (2021, 2025)*. The figure below shows instantaneous wind speed and vertical velocity fields corresponding to 30min hindcast valid at 1500 UTC on November 11th 2019 (pre-frontal conditions). These horizontal contours are from the model's third vertical level, located at approximately 23 m above ground level. .. image:: ../images/URBAN_tutorial_nz2_2panel.png :width: 900 diff --git a/docs/Tutorials/cases_real.rst b/docs/Tutorials/cases_real.rst index 2c2499e..c83f7d4 100644 --- a/docs/Tutorials/cases_real.rst +++ b/docs/Tutorials/cases_real.rst @@ -4,7 +4,7 @@ Real Cases Real cases are performed by dynamically downscaling from a mesoscale model such as WRF that can provide initial and boundary conditions for a one-way nested FastEddy simulation. These mesoscale-LES coupled simulations require the following preprocessing steps: -* Step 1: **GeoSpec**. Georeference specification step. Expects a NetCDF-formatted file of location-specific, georeferenceed coordinate frame (lat/lon), projected Cartesian coordinate frame (x,y), elevation and land cover to establish a new NetCDF file of reference geolocated domain static characteristics specification including mapping of land cover category to roughness length. +* Step 1: **GeoSpec**. Georeference specification step. Expects a NetCDF-formatted file of location-specific, georeferenced coordinate frame (lat/lon), projected Cartesian coordinate frame (x,y), elevation and land cover to establish a new NetCDF file of reference geolocated domain static characteristics specification including mapping of land cover category to roughness length. * Step 2: **SimGrid**. Simulation grid definition step. Defines a FastEddy gridded domain at a specificed grid spacing, location and extent using the file resulting from ther previous GeoSpec step and a FastEddy input parameters file (with targeted domain configuration parameters) as inputs. * Step 3: **GenICBCs**. Generate initial conditions/boundary (ICBCs) conditions step. Creates ICBCs for a targeted FastEddy domain (defined in the SimGrid step) from a set of mesoscale model results. diff --git a/docs/Tutorials/cases_real/WRF_coupling_case0.rst b/docs/Tutorials/cases_real/WRF_coupling_case0.rst index f90ab99..2dd93c2 100644 --- a/docs/Tutorials/cases_real/WRF_coupling_case0.rst +++ b/docs/Tutorials/cases_real/WRF_coupling_case0.rst @@ -18,7 +18,7 @@ The first preprocessing step is **GeoSpec.py**. The purpose of this step is to c int LandCover(y, x) ; float cellsize ; -Two required fields from an external GIS source are the terrain topography (:code:`elevation`, in m above seal level) and the categorical land cover (:code:`LandCover`). Note that high-resolution fields are desirable as inputs. Terrain can usually be obtained from lidar data at a few meters resolution, while land cover datasets are typically coarser. For U.S. locations we recommend using the National Land Cover Database (NLCD) dataset that comes at a high resolution of 30 m. The input NetCDF file should also include the corresponding latitude and longitude 2d fields (:code:`lat` and :code:`lon`) provided as double precision due to the high-resolution typically used in these FastEddy simulations. All fields must be projected consistently and discretized in the projected coordinate frame at the same resolution (:code:`cellsize`, in m). +Two required fields from an external GIS source are the terrain topography (:code:`elevation`, in m above seal level) and the categorical land cover (:code:`LandCover`). Note that high-resolution fields are desirable as inputs. Terrain can usually be obtained from lidar data at a few meters resolution, while land cover datasets are typically coarser. For U.S. locations we recommend using the National Land Cover Database (NLCD) dataset that comes at a high resolution of 30 m. The input NetCDF file should also include the corresponding latitude and longitude 2d fields (:code:`lat` and :code:`lon`) provided as double precision due to the high-resolution typically used in these FastEddy simulations. All fields must be projected consistently and discretized in the projected coordinate frame at the same resolution (:code:`cellsize`, in m). Input parameters to **GeoSpec.py** are specified in the **geospec.json** file. These include the path and file name of the input GIS data (*gis_root* and *gis_file*, respectively), along with other parameters including the output path of the standard format, reference NetCDF output file of this step (*FE_dataset_path*). In order to convert the land cover class into a roughness length value, a look-up table must be provided (*nlcd_name*). In this tutorial, a lookup table is provided based on the 16-class NLCD dataset (:code:`LandCoverMetadata_NLCD16.csv`). Finally, the JSON file entry *water_cats* needs to list all of the land cover categories that correspond to water bodies, so an appropriate roughness length parameterization can be used by FastEddy. Once all the required input files are ready, **GeoSpec.py** can be executed: @@ -49,9 +49,9 @@ If the JSON file option *save_plot_opt* is set to 1, then a plot will be produce :alt: Alternative text .. note:: - + * Any user-provided georeference input NetCDF file should be oriented south-to-north and west-to-east. Georeferenced arrays created in a GIS tool may need to be flipped to orient them as south-north within the georeference input NetCDF file required here. + * The input GIS data should be projected consistently with the WRF mesoscale data be used to provide initial and boundary conditions to FastEddy. * All three preprocessing steps make use of functions defined in *couplingUtils.py*. This file either needs to be present in the same directory as the preprocessing Python scripts or alternatively the location of *couplingUtils.py* must be included in your PYTHONPATH (e.g. using *sys.path.append*). - * The input GIS data should be projected consistently with the WRF mesoscale data that will be used to provide initial and boundary conditions. * Optionally (:code:`gis_opt = 1`), the user can point to a WRF restart file, inheriting the WRF domain georeference specification as an alternative to providing the standard GIS-derived input file to **GeoSpec.py**. A WRF output file can also be used, but it needs to include the variable *ZNT* (roughness length) not present by default in WRF output files. SimGrid diff --git a/docs/Tutorials/images/CONCENTRATION-XY-dispersion_CBL.png b/docs/Tutorials/images/CONCENTRATION-XY-dispersion_CBL.png index feb87a6..2fe3f62 100644 Binary files a/docs/Tutorials/images/CONCENTRATION-XY-dispersion_CBL.png and b/docs/Tutorials/images/CONCENTRATION-XY-dispersion_CBL.png differ diff --git a/docs/Tutorials/images/CONCENTRATION-XY-dispersion_SBL.png b/docs/Tutorials/images/CONCENTRATION-XY-dispersion_SBL.png index 0def5fd..77b5ccb 100644 Binary files a/docs/Tutorials/images/CONCENTRATION-XY-dispersion_SBL.png and b/docs/Tutorials/images/CONCENTRATION-XY-dispersion_SBL.png differ diff --git a/docs/Tutorials/images/CONCENTRATION-YZ-dispersion_CBL.png b/docs/Tutorials/images/CONCENTRATION-YZ-dispersion_CBL.png index 15c583d..73069ca 100644 Binary files a/docs/Tutorials/images/CONCENTRATION-YZ-dispersion_CBL.png and b/docs/Tutorials/images/CONCENTRATION-YZ-dispersion_CBL.png differ diff --git a/docs/Tutorials/images/CONCENTRATION-YZ-dispersion_SBL.png b/docs/Tutorials/images/CONCENTRATION-YZ-dispersion_SBL.png index 3a355c1..08c4dfe 100644 Binary files a/docs/Tutorials/images/CONCENTRATION-YZ-dispersion_SBL.png and b/docs/Tutorials/images/CONCENTRATION-YZ-dispersion_SBL.png differ diff --git a/docs/Tutorials/images/GAD_tutorial.png b/docs/Tutorials/images/GAD_tutorial.png index beea58b..a5507c4 100644 Binary files a/docs/Tutorials/images/GAD_tutorial.png and b/docs/Tutorials/images/GAD_tutorial.png differ diff --git a/docs/Tutorials/images/MEAN-PROF-convective.png b/docs/Tutorials/images/MEAN-PROF-convective.png index db67269..9cad2b2 100644 Binary files a/docs/Tutorials/images/MEAN-PROF-convective.png and b/docs/Tutorials/images/MEAN-PROF-convective.png differ diff --git a/docs/Tutorials/images/MEAN-PROF-neutral.png b/docs/Tutorials/images/MEAN-PROF-neutral.png index 9938db2..d7e636f 100644 Binary files a/docs/Tutorials/images/MEAN-PROF-neutral.png and b/docs/Tutorials/images/MEAN-PROF-neutral.png differ diff --git a/docs/Tutorials/images/MEAN-PROF-offshore.png b/docs/Tutorials/images/MEAN-PROF-offshore.png index 244100e..665a5c5 100644 Binary files a/docs/Tutorials/images/MEAN-PROF-offshore.png and b/docs/Tutorials/images/MEAN-PROF-offshore.png differ diff --git a/docs/Tutorials/images/MEAN-PROF-stable.png b/docs/Tutorials/images/MEAN-PROF-stable.png index fe730bc..099352d 100644 Binary files a/docs/Tutorials/images/MEAN-PROF-stable.png and b/docs/Tutorials/images/MEAN-PROF-stable.png differ diff --git a/docs/Tutorials/images/PDF-offshore.png b/docs/Tutorials/images/PDF-offshore.png index 07fa274..a8fc7fc 100644 Binary files a/docs/Tutorials/images/PDF-offshore.png and b/docs/Tutorials/images/PDF-offshore.png differ diff --git a/docs/Tutorials/images/RealCase_figure_zplot1_25m.png b/docs/Tutorials/images/RealCase_figure_zplot1_25m.png index b9788a5..03438f9 100644 Binary files a/docs/Tutorials/images/RealCase_figure_zplot1_25m.png and b/docs/Tutorials/images/RealCase_figure_zplot1_25m.png differ diff --git a/docs/Tutorials/images/TURB-PROF-canopy.png b/docs/Tutorials/images/TURB-PROF-canopy.png index 607c7fa..785c0ad 100644 Binary files a/docs/Tutorials/images/TURB-PROF-canopy.png and b/docs/Tutorials/images/TURB-PROF-canopy.png differ diff --git a/docs/Tutorials/images/TURB-PROF-convective.png b/docs/Tutorials/images/TURB-PROF-convective.png index 1902696..69c2246 100644 Binary files a/docs/Tutorials/images/TURB-PROF-convective.png and b/docs/Tutorials/images/TURB-PROF-convective.png differ diff --git a/docs/Tutorials/images/TURB-PROF-neutral.png b/docs/Tutorials/images/TURB-PROF-neutral.png index af70965..b3b641f 100644 Binary files a/docs/Tutorials/images/TURB-PROF-neutral.png and b/docs/Tutorials/images/TURB-PROF-neutral.png differ diff --git a/docs/Tutorials/images/TURB-PROF-offshore.png b/docs/Tutorials/images/TURB-PROF-offshore.png index f02c3cd..f7f1160 100644 Binary files a/docs/Tutorials/images/TURB-PROF-offshore.png and b/docs/Tutorials/images/TURB-PROF-offshore.png differ diff --git a/docs/Tutorials/images/TURB-PROF-stable.png b/docs/Tutorials/images/TURB-PROF-stable.png index 518496c..ace9618 100644 Binary files a/docs/Tutorials/images/TURB-PROF-stable.png and b/docs/Tutorials/images/TURB-PROF-stable.png differ diff --git a/docs/Tutorials/images/TimeEvolution_cldthres0.01.png b/docs/Tutorials/images/TimeEvolution_cldthres0.01.png index 287d744..274a1dd 100644 Binary files a/docs/Tutorials/images/TimeEvolution_cldthres0.01.png and b/docs/Tutorials/images/TimeEvolution_cldthres0.01.png differ diff --git a/docs/Tutorials/images/URBAN_tutorial_nz2_2panel.png b/docs/Tutorials/images/URBAN_tutorial_nz2_2panel.png index f216b3a..70478f2 100644 Binary files a/docs/Tutorials/images/URBAN_tutorial_nz2_2panel.png and b/docs/Tutorials/images/URBAN_tutorial_nz2_2panel.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XY-canopy.png b/docs/Tutorials/images/UVWTHETA-XY-canopy.png index 767dee4..0836c2a 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XY-canopy.png and b/docs/Tutorials/images/UVWTHETA-XY-canopy.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XY-convective.png b/docs/Tutorials/images/UVWTHETA-XY-convective.png index 5423150..c7202f8 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XY-convective.png and b/docs/Tutorials/images/UVWTHETA-XY-convective.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XY-dispersion_CBL.png b/docs/Tutorials/images/UVWTHETA-XY-dispersion_CBL.png index 0dbe1db..7907647 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XY-dispersion_CBL.png and b/docs/Tutorials/images/UVWTHETA-XY-dispersion_CBL.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XY-dispersion_SBL.png b/docs/Tutorials/images/UVWTHETA-XY-dispersion_SBL.png index e279798..02df691 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XY-dispersion_SBL.png and b/docs/Tutorials/images/UVWTHETA-XY-dispersion_SBL.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XY-neutral.png b/docs/Tutorials/images/UVWTHETA-XY-neutral.png index f85b8d7..bff90c5 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XY-neutral.png and b/docs/Tutorials/images/UVWTHETA-XY-neutral.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XY-offshore.png b/docs/Tutorials/images/UVWTHETA-XY-offshore.png index 1f26cbe..a166cbf 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XY-offshore.png and b/docs/Tutorials/images/UVWTHETA-XY-offshore.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XY-stable.png b/docs/Tutorials/images/UVWTHETA-XY-stable.png index a2b0c48..d7acfcd 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XY-stable.png and b/docs/Tutorials/images/UVWTHETA-XY-stable.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XZ-canopy.png b/docs/Tutorials/images/UVWTHETA-XZ-canopy.png index be6178d..fbef4a5 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XZ-canopy.png and b/docs/Tutorials/images/UVWTHETA-XZ-canopy.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XZ-convective.png b/docs/Tutorials/images/UVWTHETA-XZ-convective.png index 77bfbb3..a2286cf 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XZ-convective.png and b/docs/Tutorials/images/UVWTHETA-XZ-convective.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XZ-neutral.png b/docs/Tutorials/images/UVWTHETA-XZ-neutral.png index 451cc61..112bf5d 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XZ-neutral.png and b/docs/Tutorials/images/UVWTHETA-XZ-neutral.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XZ-offshore.png b/docs/Tutorials/images/UVWTHETA-XZ-offshore.png index c4f9e5a..8a01190 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XZ-offshore.png and b/docs/Tutorials/images/UVWTHETA-XZ-offshore.png differ diff --git a/docs/Tutorials/images/UVWTHETA-XZ-stable.png b/docs/Tutorials/images/UVWTHETA-XZ-stable.png index 959efe4..4a0abb6 100644 Binary files a/docs/Tutorials/images/UVWTHETA-XZ-stable.png and b/docs/Tutorials/images/UVWTHETA-XZ-stable.png differ diff --git a/docs/Tutorials/images/VerticalProfiles.png b/docs/Tutorials/images/VerticalProfiles.png index 1ea077a..9ffdac4 100644 Binary files a/docs/Tutorials/images/VerticalProfiles.png and b/docs/Tutorials/images/VerticalProfiles.png differ diff --git a/docs/Tutorials/images/VerticalProfilesTurb.png b/docs/Tutorials/images/VerticalProfilesTurb.png index 6cec565..766576f 100644 Binary files a/docs/Tutorials/images/VerticalProfilesTurb.png and b/docs/Tutorials/images/VerticalProfilesTurb.png differ diff --git a/docs/conf.py b/docs/conf.py index f27f5e9..bac2323 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -21,12 +21,12 @@ project = 'FastEddy' author = 'UCAR/NCAR' -author_list = 'Sauer, J., D. Muñoz-Esparza' -version = '3.0' +author_list = 'Muñoz-Esparza, D., J. Sauer' +version = '4.0' verinfo = version release = f'{version}' release_year = '2025' -release_date = f'{release_year}-04-15' +release_date = f'{release_year}-10-23' copyright = f'{release_year}, {author}' # -- General configuration --------------------------------------------------- diff --git a/docs/downloads.rst b/docs/downloads.rst index c866bf4..0f98130 100644 --- a/docs/downloads.rst +++ b/docs/downloads.rst @@ -10,6 +10,10 @@ Downloads - Release Date - Tar File - Release Notes + * - 4.0.0 + - October 23, 2025 + - `v4.0.0.tar.gz `_ + - `v4.0.0 Release Notes `_ * - 3.0.0 - April 15, 2025 - `v3.0.0.tar.gz `_ diff --git a/docs/release_notes.rst b/docs/release_notes.rst index 52a583f..abec5df 100644 --- a/docs/release_notes.rst +++ b/docs/release_notes.rst @@ -2,13 +2,33 @@ Release Notes ************* +FastEddy-model Version 4.0 Release Notes (20251023) +=================================================== + +.. dropdown:: Repository, build, and test + + * Two new tutorials for coupled mesoscale-LES real-world case including urban structure impacts and an idealized demonstration of wind farm flow under a wind shift + * New comprehensive model parameter reference guide + * Documentation updates to organization and content clarity + * IO module feature extensions providing output field attributes (units and description) in both netCDF and raw binary forms + * Modular framework and Makefile-based build process for model extensions (GAD and URBAN) + +.. dropdown:: Bugfixes + + * Fix to the Coriolis force term to properly pass down parameters to the GPU + * Introduction of limiters for instantaneous heat and moisture exchange coefficients to avoid unrealistically large values in surface-layer fluxes + +.. dropdown:: Enhancements + + * Urban model using an immersed body force method (IBFM) (urbanSelector=1) + * Wind turbine model using a generalized actuator disk (GAD) method (GADSelector=1) FastEddy-model Version 3.0 Release Notes (20250415) =================================================== .. dropdown:: Repository, build, and test - * 1 new tutorial for coupled mesoscale-LES real-world case + * One new tutorial for coupled mesoscale-LES real-world case * Additional makefile for building for AMD GPUs with hip and corresponding documentation [Contributed by Dr. Joe Schoonover from Fluid Numerics] diff --git a/scripts/batch_jobs/environment.yml b/scripts/batch_jobs/environment.yml new file mode 100644 index 0000000..a829404 --- /dev/null +++ b/scripts/batch_jobs/environment.yml @@ -0,0 +1,134 @@ +name: mpi4py-casper-oneapi-2024.2.1-openmpi-5.0.6 +channels: + - conda-forge + - r +dependencies: + - _libgcc_mutex=0.1=conda_forge + - _openmp_mutex=4.5=2_gnu + - aws-c-auth=0.9.0=h0a147a0_3 + - aws-c-cal=0.9.0=hada3f3f_0 + - aws-c-common=0.12.2=hb9d3cd8_0 + - aws-c-compression=0.3.1=hc2d532b_4 + - aws-c-event-stream=0.5.4=hc5e5e9e_7 + - aws-c-http=0.9.7=h6884c39_1 + - aws-c-io=0.18.1=h1a9f769_2 + - aws-c-mqtt=0.12.3=h27aa219_3 + - aws-c-s3=0.7.15=hea6d4b9_2 + - aws-c-sdkutils=0.2.3=hc2d532b_4 + - aws-checksums=0.2.7=hc2d532b_0 + - aws-crt-cpp=0.32.4=h9a0fb62_1 + - aws-sdk-cpp=1.11.510=h5b777a2_6 + - azure-core-cpp=1.14.0=h5cfcd09_0 + - azure-identity-cpp=1.10.0=h113e628_0 + - azure-storage-blobs-cpp=12.13.0=h3cf044e_1 + - azure-storage-common-cpp=12.8.0=h736e048_1 + - azure-storage-files-datalake-cpp=12.12.0=ha633028_1 + - bzip2=1.0.8=h4bc722e_7 + - c-ares=1.34.5=hb9d3cd8_0 + - ca-certificates=2025.4.26=hbd8a1cb_0 + - gflags=2.2.2=h5888daf_1005 + - glog=0.7.1=hbabe93e_0 + - humanfriendly=10.0=pyh707e725_8 + - keyutils=1.6.1=h166bdaf_0 + - krb5=1.21.3=h659f571_0 + - ld_impl_linux-64=2.43=h712a8e2_4 + - libabseil=20250127.1=cxx17_hbbce691_0 + - libarrow=19.0.1=h27f8bab_8_cpu + - libarrow-acero=19.0.1=hcb10f89_8_cpu + - libarrow-dataset=19.0.1=hcb10f89_8_cpu + - libarrow-substrait=19.0.1=h1bed206_8_cpu + - libblas=3.9.0=31_h59b9bed_openblas + - libbrotlicommon=1.1.0=hb9d3cd8_2 + - libbrotlidec=1.1.0=hb9d3cd8_2 + - libbrotlienc=1.1.0=hb9d3cd8_2 + - libcblas=3.9.0=31_he106b2a_openblas + - libcrc32c=1.1.2=h9c3ff4c_0 + - libcurl=8.13.0=h332b0f4_0 + - libedit=3.1.20250104=pl5321h7949ede_0 + - libev=4.33=hd590300_2 + - libevent=2.1.12=hf998b51_1 + - libexpat=2.7.0=h5888daf_0 + - libffi=3.4.6=h2dba641_1 + - libgcc=14.2.0=h767d61c_2 + - libgcc-ng=14.2.0=h69a702a_2 + - libgfortran=14.2.0=h69a702a_2 + - libgfortran5=14.2.0=hf1ad2bd_2 + - libgomp=14.2.0=h767d61c_2 + - libgoogle-cloud=2.36.0=hc4361e1_1 + - libgoogle-cloud-storage=2.36.0=h0121fbd_1 + - libgrpc=1.71.0=h8e591d7_1 + - libiconv=1.18=h4ce23a2_1 + - liblapack=3.9.0=31_h7ac8fdf_openblas + - liblzma=5.8.1=hb9d3cd8_0 + - libnghttp2=1.64.0=h161d5f1_0 + - libnsl=2.0.1=hd590300_0 + - libopenblas=0.3.29=pthreads_h94d23a6_0 + - libopentelemetry-cpp=1.20.0=hd1b1c89_0 + - libopentelemetry-cpp-headers=1.20.0=ha770c72_0 + - libparquet=19.0.1=h081d1f1_8_cpu + - libprotobuf=5.29.3=h501fc15_1 + - libre2-11=2024.07.02=hba17884_3 + - libsqlite=3.49.1=hee588c1_2 + - libssh2=1.11.1=hcf80075_0 + - libstdcxx=14.2.0=h8f9b012_2 + - libstdcxx-ng=14.2.0=h4852527_2 + - libthrift=0.21.0=h0e7cc3e_0 + - libutf8proc=2.10.0=h4c51ac1_0 + - libuuid=2.38.1=h0b41bf4_0 + - libxcrypt=4.4.36=hd590300_1 + - libxml2=2.13.7=h81593ed_1 + - libzlib=1.3.1=hb9d3cd8_2 + - lz4-c=1.10.0=h5888daf_1 + - make=4.4.1=hb9d3cd8_2 + - memory_profiler=0.61.0=pyhd8ed1ab_1 + - ncurses=6.5=h2d0b736_3 + - nlohmann_json=3.12.0=h3f2d84a_0 + - numpy=2.2.5=py312h72c5963_0 + - openssl=3.5.0=h7b32b05_0 + - orc=2.1.1=h17f744e_1 + - packaging=25.0=pyh29332c3_1 + - pandas=2.2.3=py312hf9745cd_3 + - pip=25.1=pyh8b19718_0 + - prometheus-cpp=1.3.0=ha5d0236_0 + - psutil=7.0.0=py312h66e93f0_0 + - pyarrow=19.0.1=py312h7900ff3_0 + - pyarrow-core=19.0.1=py312h01725c0_0_cpu + - python=3.12.10=h9e4cc4f_0_cpython + - python-dateutil=2.9.0.post0=pyhff2d567_1 + - python-tzdata=2025.2=pyhd8ed1ab_0 + - python_abi=3.12=7_cp312 + - pytz=2025.2=pyhd8ed1ab_0 + - re2=2024.07.02=h9925aae_3 + - readline=8.2=h8c095d6_2 + - s2n=1.5.17=hba75a32_0 + - setuptools=79.0.1=pyhff2d567_0 + - six=1.17.0=pyhd8ed1ab_0 + - snappy=1.2.1=h8bd8927_1 + - tk=8.6.13=noxft_h4845f30_101 + - tzdata=2025b=h78e105d_0 + - wheel=0.45.1=pyhd8ed1ab_1 + - xarray=2025.3.1=pyhd8ed1ab_0 + - yaml=0.2.5=h7f98852_2 + - zlib=1.3.1=hb9d3cd8_2 + - zstd=1.5.7=hb8e6e7a_2 + - pip: + - certifi==2025.4.26 + - cftime==1.6.4.post1 + - click==8.1.8 + - cloudpickle==3.1.1 + - contourpy==1.3.2 + - cycler==0.12.1 + - dask==2025.4.1 + - fonttools==4.57.0 + - fsspec==2025.3.2 + - kiwisolver==1.4.8 + - locket==1.0.0 + - matplotlib==3.10.1 + - mpi4py==4.0.3 + - netcdf4==1.7.2 + - partd==1.4.2 + - pillow==11.2.1 + - pyparsing==3.2.3 + - pyyaml==6.0.2 + - scipy==1.15.2 + - toolz==1.0.0 diff --git a/scripts/batch_jobs/fasteddy_convert_pbs_script_casper.sh b/scripts/batch_jobs/fasteddy_convert_pbs_script_casper.sh index 5408567..b506b53 100755 --- a/scripts/batch_jobs/fasteddy_convert_pbs_script_casper.sh +++ b/scripts/batch_jobs/fasteddy_convert_pbs_script_casper.sh @@ -1,7 +1,7 @@ #!/bin/bash #PBS -A #PBS -N FE_convert -#PBS -l select=2:ncpus=2:mpiprocs=2:mem=40GB +#PBS -l select=2:ncpus=2:mpiprocs=2:mem=200GB #PBS -l walltime=24:00:00 #PBS -q casper #PBS -j oe @@ -12,7 +12,10 @@ export SRCDIR=${BASEDIR}/scripts/python_utilities/post-processing/ hostname module load conda -conda activate npl-2025a +# Be to have created the following conda environment (on Casper) from +# the environment.yml file in this */scripts/batch_jobs/ directory +# with---> conda env create -f environment.yml +conda activate mpi4py-casper-oneapi-2024.2.1-openmpi-5.0.6 which python -mpiexec -n 4 --ppn 2 python -u ${SRCDIR}/FEbinaryToNetCDF.py -f ${SRCDIR}/convert.json -a ${SRCDIR}/field_attributes.json +mpiexec python -u ${SRCDIR}/FEbinaryToNetCDF.py -f ${SRCDIR}/convert.json -a ${SRCDIR}/field_attributes.json diff --git a/tutorials/examples/Example08_REALCASE_FortCollins.in b/tutorials/examples/Example08_REALCASE_FortCollins.in index f37a641..315780b 100644 --- a/tutorials/examples/Example08_REALCASE_FortCollins.in +++ b/tutorials/examples/Example08_REALCASE_FortCollins.in @@ -50,9 +50,9 @@ b_hyb = 0.0 # hybrid advection scheme parameter: 0.0= lower-order upwind, 1.0=hi ##------------: MOISTURE --- moistureSelector = 1 # moisture selector: 0=off, 1=on moistureNvars = 2 # number of moisture species -moistureAdvSelectorQv = 2 # water vapor advection scheme selector +moistureAdvSelectorQv = 3 # water vapor advection scheme selector moistureAdvSelectorQv_b = 0.0 # hybrid advection scheme parameter for water vapor -moistureAdvSelectorQi = 2 # moisture advection scheme selector for non-qv fields (non-oscillatory schemes) +moistureAdvSelectorQi = 1 # moisture advection scheme selector for non-qv fields (non-oscillatory schemes) moistureSGSturb = 1 # selector to apply sub-grid scale diffusion to moisture fields moistureCond = 3 # selector to apply condensation to mositure fields moistureCondTscale = 1.0 # relaxation time in seconds diff --git a/tutorials/examples/Example10_REALCASE_Dallas_urban.in b/tutorials/examples/Example10_REALCASE_Dallas_urban.in index b3991ce..5afe98a 100644 --- a/tutorials/examples/Example10_REALCASE_Dallas_urban.in +++ b/tutorials/examples/Example10_REALCASE_Dallas_urban.in @@ -50,9 +50,9 @@ b_hyb = 0.0 # hybrid advection scheme parameter: 0.0= lower-order upwind, 1.0=hi ##------------: MOISTURE --- moistureSelector = 1 # moisture selector: 0=off, 1=on moistureNvars = 2 # number of moisture species -moistureAdvSelectorQv = 2 # water vapor advection scheme selector +moistureAdvSelectorQv = 3 # water vapor advection scheme selector moistureAdvSelectorQv_b = 0.0 # hybrid advection scheme parameter for water vapor -moistureAdvSelectorQi = 2 # moisture advection scheme selector for non-qv fields (non-oscillatory schemes) +moistureAdvSelectorQi = 1 # moisture advection scheme selector for non-qv fields (non-oscillatory schemes) moistureSGSturb = 1 # selector to apply sub-grid scale diffusion to moisture fields moistureCond = 3 # selector to apply condensation to mositure fields moistureCondTscale = 1.0 # relaxation time in seconds diff --git a/tutorials/notebooks/FE_Postprocessing_Example04_BOMEX.ipynb b/tutorials/notebooks/FE_Postprocessing_Example04_BOMEX.ipynb index b60e6b0..a5afa63 100644 --- a/tutorials/notebooks/FE_Postprocessing_Example04_BOMEX.ipynb +++ b/tutorials/notebooks/FE_Postprocessing_Example04_BOMEX.ipynb @@ -13,6 +13,7 @@ "import xarray as xr\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", + "from netCDF4 import Dataset\n", "from matplotlib.gridspec import GridSpec\n", "import matplotlib.ticker as mtick\n", "import pandas as pd"