Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 14 additions & 33 deletions NextGen_Forcings_Engine_BMI/NextGen_Forcings_Engine/bmi_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,17 @@
from mpi4py import MPI

from NextGen_Forcings_Engine_BMI import esmf_creation, forcing_extraction
from NextGen_Forcings_Engine_BMI.NextGen_Forcings_Engine.core.config import (
ConfigOptions,
)
from NextGen_Forcings_Engine_BMI.NextGen_Forcings_Engine.core.geoMod import GEOGRID
from NextGen_Forcings_Engine_BMI.NextGen_Forcings_Engine.core.parallel import MpiConfig

from .bmi_grid import Grid, GridType
from .core import (
config,
err_handler,
forcingInputMod,
geoMod,
ioMod,
parallel,
suppPrecipMod,
)
from .model import NWMv3ForcingEngineModel
Expand Down Expand Up @@ -207,7 +209,7 @@ def initialize(self, config_file: str, output_path: str | None = None) -> None:

# If _job_meta was not set by initialize_with_params(), create a default one
if self._job_meta is None:
self._job_meta = config.ConfigOptions(self.cfg_bmi)
self._job_meta = ConfigOptions(self.cfg_bmi)

# Parse the configuration options
try:
Expand All @@ -231,7 +233,7 @@ def initialize(self, config_file: str, output_path: str | None = None) -> None:
self._job_meta.nwmConfig = self.cfg_bmi["NWM_CONFIG"]

# Initialize MPI communication
self._mpi_meta = parallel.MpiConfig()
self._mpi_meta = MpiConfig()
try:
comm = MPI.Comm.f2py(self._comm) if self._comm is not None else None
self._mpi_meta.initialize_comm(self._job_meta, comm=comm)
Expand All @@ -252,24 +254,14 @@ def initialize(self, config_file: str, output_path: str | None = None) -> None:
# information about the modeling domain, local processor
# grid boundaries, and ESMF grid objects/fields to be used
# in regridding.
self._wrf_hydro_geo_meta = geoMod.GeoMetaWrfHydro()

if self._job_meta.grid_type == "gridded":
self._wrf_hydro_geo_meta.initialize_destination_geo_gridded(
self._job_meta, self._mpi_meta
)
elif self._job_meta.grid_type == "unstructured":
self._wrf_hydro_geo_meta.initialize_destination_geo_unstructured(
self._job_meta, self._mpi_meta
)
elif self._job_meta.grid_type == "hydrofabric":
self._wrf_hydro_geo_meta.initialize_destination_geo_hydrofabric(
self._job_meta, self._mpi_meta
)
else:
self._job_meta.errMsg = "You must specify a proper grid_type (gridded, unstructured, hydrofabric) in the config."
if self._job_meta.grid_type not in GEOGRID:
self._job_meta.errMsg = f"Invalid grid type specified: {self._job_meta.grid_type}. Valid options are: {list(GEOGRID.keys())}"
err_handler.err_out_screen_para(self._job_meta.errMsg, self._mpi_meta)

self._wrf_hydro_geo_meta = GEOGRID.get(self._job_meta.grid_type)(
self._job_meta, self._mpi_meta
)

# Assign grid type to BMI class for grid information
self._grid_type = self._job_meta.grid_type.lower()

Expand Down Expand Up @@ -759,15 +751,6 @@ def initialize(self, config_file: str, output_path: str | None = None) -> None:
for long_name in self._var_name_units_map.keys()
}

if self._job_meta.spatial_meta is not None:
try:
self._wrf_hydro_geo_meta.initialize_geospatial_metadata(
self._job_meta, self._mpi_meta
)
except Exception as e:
err_handler.err_out_screen_para(self._job_meta.errMsg, self._mpi_meta)
err_handler.check_program_status(self._job_meta, self._mpi_meta)

# Check to make sure we have enough dimensionality to run regridding. ESMF requires both grids
# to have a size of at least 2.
if (
Expand Down Expand Up @@ -897,9 +880,7 @@ def initialize_with_params(
:raises ValueError: If an invalid grid type is specified, an exception is raised.
"""
# Set the job metadata parameters (b_date, geogrid) using config_options
self._job_meta = config.ConfigOptions(
self.cfg_bmi, b_date=b_date, geogrid_arg=geogrid
)
self._job_meta = ConfigOptions(self.cfg_bmi, b_date=b_date, geogrid_arg=geogrid)

# Now that _job_meta is set, call initialize() to set up the core model
self.initialize(config_file, output_path=output_path)
Expand Down
88 changes: 88 additions & 0 deletions NextGen_Forcings_Engine_BMI/NextGen_Forcings_Engine/core/consts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
CONSTS = {
"geoMod": {
"GeoMeta": [
# "nx_global",
# "ny_global",
# "nx_global_elem",
# "ny_global_elem",
# "dx_meters",
# "dy_meters",
# "latitude_grid",
# "longitude_grid",
# "element_ids",
# "element_ids_global",
# "latitude_grid_elem",
# "longitude_grid_elem",
# "lat_bounds",
# "lon_bounds",
# "mesh_inds",
# "mesh_inds_elem",
# "height",
# "height_elem",
# "sina_grid",
# "cosa_grid",
"nodeCoords",
"centerCoords",
"inds",
# "slope",
# "slp_azi",
# "slope_elem",
# "slp_azi_elem",
# "esmf_grid",
"esmf_lat",
"esmf_lon",
],
"handle_exception": {
"esmf_nc": "Unable to open spatial metadata file: :::arg:::",
},
"UnstructuredGeoMeta": [
"x_lower_bound",
"x_upper_bound",
"y_lower_bound",
"y_upper_bound",
"dx_meters",
"dy_meters",
"element_ids",
"element_ids_global",
"sina_grid",
"cosa_grid",
"esmf_lat",
"esmf_lon",
],
"HydrofabricGeoMeta": [
"nx_local_elem",
"ny_local_elem",
"x_lower_bound",
"x_upper_bound",
"y_lower_bound",
"y_upper_bound",
"nx_global_elem",
"ny_global_elem",
"dx_meters",
"dy_meters",
"mesh_inds_elem",
"height_elem",
"sina_grid",
"cosa_grid",
"slope_elem",
"slp_azi_elem",
"esmf_lat",
"esmf_lon",
],
"GriddedGeoMeta": [
"nx_local_elem",
"ny_local_elem",
"nx_global_elem",
"ny_global_elem",
"element_ids",
"element_ids_global",
"lat_bounds",
"lon_bounds",
"mesh_inds",
"mesh_inds_elem",
"height_elem",
"slope_elem",
"slp_azi_elem",
],
},
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
ConfigOptions,
)
from NextGen_Forcings_Engine_BMI.NextGen_Forcings_Engine.core.geoMod import (
GeoMetaWrfHydro,
GeoMeta,
)
from NextGen_Forcings_Engine_BMI.NextGen_Forcings_Engine.core.parallel import MpiConfig
from nextgen_forcings_ewts import MODULE_NAME
Expand Down Expand Up @@ -963,7 +963,7 @@ def regrid_map(self):
def regrid_inputs(
self,
config_options: ConfigOptions,
wrf_hyro_geo_meta: GeoMetaWrfHydro,
wrf_hyro_geo_meta: GeoMeta,
mpi_config: MpiConfig,
):
"""Regrid input forcings to the final output grids for this timestep.
Expand Down Expand Up @@ -1012,7 +1012,7 @@ def temporal_interpolate_inputs(

def init_dict(
config_options: ConfigOptions,
geo_meta_wrf_hydro: GeoMetaWrfHydro,
geo_meta_wrf_hydro: GeoMeta,
mpi_config: MpiConfig,
) -> dict:
"""Initialize the input forcing dictionary.
Expand Down
Loading