diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml new file mode 100644 index 00000000..9ae989ef --- /dev/null +++ b/.github/workflows/workflow.yml @@ -0,0 +1,129 @@ +name: Build Tests + +on: + pull_request: + types: [opened, synchronize, reopened] + # Do not run if the only files changed cannot affect the build + paths-ignore: + - "**.md" + - "**.pro" + - "**.sh" + - "**.perl" + - ".github/CODEOWNERS" + - ".circleci/config.yml" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +jobs: + build_ldas_ifort: + name: Build GEOSldas with ifort + if: "!contains(github.event.pull_request.labels.*.name, '0 diff trivial')" + runs-on: ubuntu-24.04 + container: + image: gmao/ubuntu24-geos-env:v7.32.0-intelmpi_2021.13-ifort_2021.13 + + env: + OMPI_ALLOW_RUN_AS_ROOT: 1 + OMPI_ALLOW_RUN_AS_ROOT_CONFIRM: 1 + OMPI_MCA_btl_vader_single_copy_mechanism: none + + steps: + # https://github.com/orgs/community/discussions/25678#discussioncomment-5242449 + - name: Delete huge unnecessary tools folder + run: rm -rf /opt/hostedtoolcache + + - name: Checkout LDAS + uses: actions/checkout@v4 + with: + fetch-depth: 1 + filter: blob:none + repository: GEOS-ESM/GEOSldas + + - name: Set all directories as git safe + run: | + git config --global --add safe.directory '*' + + - name: Versions etc. + run: | + ifort --version + mpirun --version + echo $BASEDIR + + - name: Mepo clone external repos + run: | + mepo clone --partial blobless + mepo status + + - name: Update other branches + if: + "!contains('refs/heads/main,refs/heads/develop', github.ref)" + run: | + mepo checkout-if-exists ${GITHUB_HEAD_REF} + mepo status + + - name: CMake + run: | + cmake -B build -S . --install-prefix=${pwd}/install -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_BUILD_TYPE=Debug -DMPIEXEC_PREFLAGS='--oversubscribe' -DUSE_F2PY=OFF + + - name: Build + run: | + cmake --build build -j 4 + cmake --install build + + + build_ldas_gfortran: + name: Build GEOSldas with gfortran + if: "!contains(github.event.pull_request.labels.*.name, '0 diff trivial')" + runs-on: ubuntu-24.04 + container: + image: gmao/ubuntu24-geos-env-mkl:v7.32.0-openmpi_5.0.5-gcc_14.2.0 + + env: + OMPI_ALLOW_RUN_AS_ROOT: 1 + OMPI_ALLOW_RUN_AS_ROOT_CONFIRM: 1 + OMPI_MCA_btl_vader_single_copy_mechanism: none + + steps: + # https://github.com/orgs/community/discussions/25678#discussioncomment-5242449 + - name: Delete huge unnecessary tools folder + run: rm -rf /opt/hostedtoolcache + + - name: Checkout LDAS + uses: actions/checkout@v4 + with: + fetch-depth: 1 + filter: blob:none + repository: GEOS-ESM/GEOSldas + + - name: Set all directories as git safe + run: | + git config --global --add safe.directory '*' + + - name: Versions etc. + run: | + gfortran --version + mpirun --version + echo $BASEDIR + + - name: Mepo clone external repos + run: | + mepo clone --partial blobless + mepo status + + - name: Update other branches + if: + "!contains('refs/heads/main,refs/heads/develop', github.ref)" + run: | + mepo checkout-if-exists ${GITHUB_HEAD_REF} + mepo status + + - name: CMake + run: | + cmake -B build -S . --install-prefix=${pwd}/install -DCMAKE_Fortran_COMPILER=gfortran -DCMAKE_BUILD_TYPE=Debug -DMPIEXEC_PREFLAGS='--oversubscribe' -DUSE_F2PY=OFF + + - name: Build + run: | + cmake --build build -j 4 + cmake --install build diff --git a/CHANGELOG.md b/CHANGELOG.md index d07a99f4..949a160c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,25 +21,50 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ----------------------------- +## [v2.0.0] - 2025-04-15 + +- 0-diff vs. v1.1.0. + +### Added + +- New update_type for joint 3d soil moisture and 1d snow analysis (Tb+sfmc+sfds+SCF obs) ([PR #68](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/68)). +- Updated subroutine read_obs_sm_ASCAT_EUMET() to work with both original and revised file name templates ([PR #69](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/69)). +- Added CYGNSS soil moisture reader ([PR #76](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/76)). +- Added M21C surface met forcing ([PR #77](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/77)). +- Added Github Actions workflow for testing and building GEOSldas_GridComp ([PR #86](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/86)). + +### Changed + +- Revised variable names (SHORT_NAME) and descriptions (LONG_NAME) to match M21C file specs ([PR #72](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/72)). +- Updated subroutines read_obs_sm_ASCAT_EUMET(), read_obs_SMAP_halforbit_Tb(), read_obs_SMOS() and read_obs_MODIS_SCF() with hardcoded time ranges for when observations are available and should be read ([PR #73](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/73)). +- Renamed tilecoord%pfaf to %pfaf_index; added matlab tile file reader ([PR #78](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/78)). +- Improved setup of coupled land/atm DAS (incl. changed nomenclature of met forcing files: "Nx+-" --> "bkg.lfo_*") ([PR #81](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/81)). + +### Removed + +- Removed support for SLES12 operating system at NCCS ([PR #83](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/83)). + +----------------------------- + ## [v1.1.0] - 2024-11-05 - 0-diff vs. v1.0.2 except for data assimilation in cube-sphere tile space ([PR #41](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/41)). ### Changed -- More optimal distribution of tiles on processors for cubed-sphere tile space. -- Updates to scripting to allow for Intel MPI. +- More optimal distribution of tiles on processors for cubed-sphere tile space ([PR #41](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/41)). +- Updates to scripting to allow for Intel MPI ([PR #57](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/57)). ### Fixed -- Do not increment CO2_YEAR when it is a no-data-value. For Catchment simulations, exclude CatchCN-specific resource variables from LDAS.rc. -- Bug fix and improved efficiency in matlab script for generation of mwRTM_param. -- Changed EXPDIR to absolute path for POSTPROC_HIST>0 option to work. -- Support HISTORY output of ASNOW alone from ENSAVG Gridcomp. +- Do not increment CO2_YEAR when it is a no-data-value; for Catchment simulations, exclude CatchCN-specific resource variables from LDAS.rc ([PR #51](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/51)). +- Bug fix and improved efficiency in matlab script for generation of mwRTM_param ([PR #46](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/46)). +- Changed EXPDIR to absolute path for POSTPROC_HIST>0 option to work ([PR #42](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/42)). +- Support HISTORY output of ASNOW alone from ENSAVG Gridcomp ([PR #49](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/49)). ### Removed -- Remove restart options F and G. +- Remove restart options F and G ([PR #40](https://github.com/GEOS-ESM/GEOSldas_GridComp/pull/40)). ----------------------------- diff --git a/GEOSens_GridComp/GEOS_EnsGridComp.F90 b/GEOSens_GridComp/GEOS_EnsGridComp.F90 index e38d8cb2..7dd65533 100644 --- a/GEOSens_GridComp/GEOS_EnsGridComp.F90 +++ b/GEOSens_GridComp/GEOS_EnsGridComp.F90 @@ -4,7 +4,8 @@ module GEOS_EnsGridCompMod ! !USES - !! This grid comp behaves like a coupler. The set service, initialization are compliant with MAPL grid comp concept. + !! This grid comp behaves like a coupler; SetServices() and Initialize() are compliant with MAPL's GridComp concept. + use ESMF use MAPL_Mod use catch_constants, only: DZGT => CATCH_DZGT @@ -31,22 +32,22 @@ module GEOS_EnsGridCompMod integer, parameter :: NUM_SUBTILES=4 real :: enavg_nodata_threshold - type(cat_progn_type),dimension(:,:), allocatable :: catch_progn - type(cat_param_type),dimension(: ), allocatable :: catch_param - - + type(cat_progn_type), dimension(:,:), allocatable :: catch_progn + type(cat_param_type), dimension(: ), allocatable :: catch_param ! 1d only, assumes no parameter perturbations! + + contains - + !BOP - - ! !IROTUINE: SetServices -- Set ESMF services for this component - + + ! !ROUTINE: SetServices -- Set ESMF services for this component + ! !INTERFACE: - + subroutine SetServices(gc, rc) - + ! !ARGUMENTS: - + type(ESMF_GridComp), intent(inout) :: gc ! gridded component integer, optional :: rc ! return code @@ -73,7 +74,7 @@ subroutine SetServices(gc, rc) ) VERIFY_(status) - ! phase one: collect forcing ensemble + ! phase 1: collect forcing ensemble call MAPL_GridCompSetEntryPoint( & gc, & ESMF_METHOD_RUN, & @@ -82,7 +83,7 @@ subroutine SetServices(gc, rc) ) VERIFY_(status) - ! phase two : collect ensemble out from land + ! phase 2: collect ensemble out from land call MAPL_GridCompSetEntryPoint( & gc, & ESMF_METHOD_RUN, & @@ -91,11 +92,11 @@ subroutine SetServices(gc, rc) ) VERIFY_(status) - !phase 3 : get cat_param + ! phase 3: get catch_param call MAPL_GridCompSetEntryPoint( & gc, & ESMF_METHOD_RUN, & - GET_CATCH_PARAM , & + GET_CATCH_PARAM , & rc=status & ) VERIFY_(status) @@ -152,7 +153,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'interception_reservoir_capac',& + LONG_NAME = 'vegetation_interception_water_storage',& UNITS = 'kg m-2' ,& SHORT_NAME = 'CAPAC' ,& ! FRIENDLYTO = trim(COMP_NAME) ,& @@ -459,7 +460,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'runoff_flux' ,& + LONG_NAME = 'runoff_total_flux' ,& UNITS = 'kg m-2 s-1' ,& SHORT_NAME = 'RUNOFF' ,& DIMS = MAPL_DimsTileOnly ,& @@ -468,7 +469,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'interception_loss_energy_flux',& + LONG_NAME = 'interception_loss_latent_heat_flux',& UNITS = 'W m-2' ,& SHORT_NAME = 'EVPINT' ,& DIMS = MAPL_DimsTileOnly ,& @@ -477,7 +478,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'baresoil_evap_energy_flux' ,& + LONG_NAME = 'baresoil_evaporation_latent_heat_flux' ,& UNITS = 'W m-2' ,& SHORT_NAME = 'EVPSOI' ,& DIMS = MAPL_DimsTileOnly ,& @@ -486,7 +487,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'transpiration_energy_flux' ,& + LONG_NAME = 'transpiration_latent_heat_flux' ,& UNITS = 'W m-2' ,& SHORT_NAME = 'EVPVEG' ,& DIMS = MAPL_DimsTileOnly ,& @@ -495,7 +496,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'snow_ice_evaporation_energy_flux',& + LONG_NAME = 'snowpack_evaporation_latent_heat_flux_on_land',& UNITS = 'W m-2' ,& SHORT_NAME = 'EVPICE' ,& DIMS = MAPL_DimsTileOnly ,& @@ -514,7 +515,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'totoal soil moisture' ,& + LONG_NAME = 'total_soil_moisture' ,& UNITS = 'kg m-2' ,& SHORT_NAME = 'WATSOI' ,& DIMS = MAPL_DimsTileOnly ,& @@ -532,7 +533,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'snowpack_evaporation_energy_flux',& + LONG_NAME = 'snowpack_evaporation_latent_heat_flux',& UNITS = 'W m-2' ,& SHORT_NAME = 'EVPSNO' ,& DIMS = MAPL_DimsTileOnly ,& @@ -540,7 +541,7 @@ subroutine SetServices(gc, rc) RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'baseflow_flux' ,& + LONG_NAME = 'baseflow_flux_land' ,& UNITS = 'kg m-2 s-1' ,& SHORT_NAME = 'BASEFLOW' ,& DIMS = MAPL_DimsTileOnly ,& @@ -567,7 +568,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'surface_outgoing_longwave_flux',& + LONG_NAME = 'surface_emitted_longwave_flux',& UNITS = 'W m-2' ,& SHORT_NAME = 'HLWUP' ,& DIMS = MAPL_DimsTileOnly ,& @@ -595,7 +596,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'total_latent_energy_flux' ,& + LONG_NAME = 'total_latent_heat_flux_consistent_with_evaporation_from_turbulence' ,& UNITS = 'W m-2' ,& SHORT_NAME = 'HLATN' ,& DIMS = MAPL_DimsTileOnly ,& @@ -604,7 +605,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'rainwater_infiltration_flux',& + LONG_NAME = 'Soil_water_infiltration_rate',& UNITS = 'kg m-2 s-1' ,& SHORT_NAME = 'QINFIL' ,& DIMS = MAPL_DimsTileOnly ,& @@ -649,7 +650,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'ave_catchment_temp_incl_snw',& + LONG_NAME = 'surface_temperature_of_land_incl_snow',& UNITS = 'K' ,& SHORT_NAME = 'TPSURF' ,& DIMS = MAPL_DimsTileOnly ,& @@ -658,7 +659,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'ave_catchment_temp_incl_snw_ensstd',& + LONG_NAME = 'surface_temperature_of_land_incl_snow_ensstd',& UNITS = 'K' ,& SHORT_NAME = 'TPSURF_ENSSTD' ,& DIMS = MAPL_DimsTileOnly ,& @@ -667,7 +668,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'temperature_top_snow_layer',& + LONG_NAME = 'surface_temperature_of_snow_on_land',& UNITS = 'K' ,& SHORT_NAME = 'TPSNOW' ,& DIMS = MAPL_DimsTileOnly ,& @@ -676,7 +677,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'temperature_unsaturated_zone',& + LONG_NAME = 'surface_temperature_of_unsaturated_zone',& UNITS = 'K' ,& SHORT_NAME = 'TPUNST' ,& DIMS = MAPL_DimsTileOnly ,& @@ -685,7 +686,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'temperature_saturated_zone',& + LONG_NAME = 'surface_temperature_of_saturated_zone',& UNITS = 'K' ,& SHORT_NAME = 'TPSAT' ,& DIMS = MAPL_DimsTileOnly ,& @@ -694,7 +695,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'temperature_wilted_zone' ,& + LONG_NAME = 'surface_temperature_of_wilting_zone' ,& UNITS = 'K' ,& SHORT_NAME = 'TPWLT' ,& DIMS = MAPL_DimsTileOnly ,& @@ -703,7 +704,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'fractional_area_of_land_snowcover',& + LONG_NAME = 'fractional_area_of_snow_on_land',& UNITS = '1' ,& SHORT_NAME = 'ASNOW' ,& DIMS = MAPL_DimsTileOnly ,& @@ -766,7 +767,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'snow_depth' ,& + LONG_NAME = 'snow_depth_within_snow_covered_area_fraction_on_land' ,& UNITS = 'm' ,& SHORT_NAME = 'SNOWDP' ,& DIMS = MAPL_DimsTileOnly ,& @@ -775,7 +776,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'surface_soil_wetness' ,& + LONG_NAME = 'soil_wetness_surface' ,& UNITS = '1' ,& SHORT_NAME = 'WET1' ,& DIMS = MAPL_DimsTileOnly ,& @@ -784,7 +785,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'root_zone_soil_wetness' ,& + LONG_NAME = 'soil_wetness_rootzone' ,& UNITS = '1' ,& SHORT_NAME = 'WET2' ,& DIMS = MAPL_DimsTileOnly ,& @@ -793,7 +794,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'ave_prof_soil__moisture' ,& + LONG_NAME = 'soil_wetness_profile' ,& UNITS = '1' ,& SHORT_NAME = 'WET3' ,& DIMS = MAPL_DimsTileOnly ,& @@ -802,7 +803,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'water_surface_layer' ,& + LONG_NAME = 'soil_moisture_surface' ,& UNITS = 'm3 m-3' ,& SHORT_NAME = 'WCSF' ,& DIMS = MAPL_DimsTileOnly ,& @@ -811,7 +812,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'water_surface_layer_ensstd' ,& + LONG_NAME = 'soil_moisture_surface_ensstd' ,& UNITS = 'm3 m-3' ,& SHORT_NAME = 'WCSF_ENSSTD' ,& DIMS = MAPL_DimsTileOnly ,& @@ -820,7 +821,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'water_root_zone' ,& + LONG_NAME = 'soil_moisture_rootzone' ,& UNITS = 'm3 m-3' ,& SHORT_NAME = 'WCRZ' ,& DIMS = MAPL_DimsTileOnly ,& @@ -829,7 +830,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'water_root_zone_ensstd' ,& + LONG_NAME = 'soil_moisture_rootzone_ensstd' ,& UNITS = 'm3 m-3' ,& SHORT_NAME = 'WCRZ_ENSSTD' ,& DIMS = MAPL_DimsTileOnly ,& @@ -839,7 +840,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'water_ave_prof' ,& + LONG_NAME = 'soil_moisture_profile' ,& UNITS = 'm3 m-3' ,& SHORT_NAME = 'WCPR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -848,7 +849,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'water_ave_prof_ensstd' ,& + LONG_NAME = 'soil_moisture_profile_ensstd' ,& UNITS = 'm3 m-3' ,& SHORT_NAME = 'WCPR_ENSSTD' ,& DIMS = MAPL_DimsTileOnly ,& @@ -857,63 +858,63 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'soil_temperatures_layer_1' ,& + LONG_NAME = 'soil_temperature_layer_1' ,& UNITS = 'K' ,& - SHORT_NAME = 'TSOIL1TILE' ,& + SHORT_NAME = 'TP1' ,& DIMS = MAPL_DimsTileOnly ,& VLOCATION = MAPL_VLocationNone ,& RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'soil_temperatures_layer_1_ensstd' ,& + LONG_NAME = 'soil_temperature_layer_1_ensstd' ,& UNITS = 'K' ,& - SHORT_NAME = 'TSOIL1TILE_ENSSTD' ,& + SHORT_NAME = 'TP1_ENSSTD' ,& DIMS = MAPL_DimsTileOnly ,& VLOCATION = MAPL_VLocationNone ,& RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'soil_temperatures_layer_2' ,& + LONG_NAME = 'soil_temperature_layer_2' ,& UNITS = 'K' ,& - SHORT_NAME = 'TSOIL2TILE' ,& + SHORT_NAME = 'TP2' ,& DIMS = MAPL_DimsTileOnly ,& VLOCATION = MAPL_VLocationNone ,& RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'soil_temperatures_layer_3' ,& + LONG_NAME = 'soil_temperature_layer_3' ,& UNITS = 'K' ,& - SHORT_NAME = 'TSOIL3TILE' ,& + SHORT_NAME = 'TP3' ,& DIMS = MAPL_DimsTileOnly ,& VLOCATION = MAPL_VLocationNone ,& RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'soil_temperatures_layer_4' ,& + LONG_NAME = 'soil_temperature_layer_4' ,& UNITS = 'K' ,& - SHORT_NAME = 'TSOIL4TILE' ,& + SHORT_NAME = 'TP4' ,& DIMS = MAPL_DimsTileOnly ,& VLOCATION = MAPL_VLocationNone ,& RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'soil_temperatures_layer_5' ,& + LONG_NAME = 'soil_temperature_layer_5' ,& UNITS = 'K' ,& - SHORT_NAME = 'TSOIL5TILE' ,& + SHORT_NAME = 'TP5' ,& DIMS = MAPL_DimsTileOnly ,& VLOCATION = MAPL_VLocationNone ,& RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'soil_temperatures_layer_6' ,& + LONG_NAME = 'soil_temperature_layer_6' ,& UNITS = 'K' ,& - SHORT_NAME = 'TSOIL6TILE' ,& + SHORT_NAME = 'TP6' ,& DIMS = MAPL_DimsTileOnly ,& VLOCATION = MAPL_VLocationNone ,& RC=STATUS ) @@ -929,7 +930,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'surface_albedo_visible_beam',& + LONG_NAME = 'surface_reflectivity_visible_beam',& UNITS = '1' ,& SHORT_NAME = 'ALBVR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -938,7 +939,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'surface_albedo_visible_diffuse',& + LONG_NAME = 'surface_reflectivity_visible_diffuse',& UNITS = '1' ,& SHORT_NAME = 'ALBVF' ,& DIMS = MAPL_DimsTileOnly ,& @@ -947,7 +948,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'surface_albedo_near_infrared_beam',& + LONG_NAME = 'surface_reflectivity_near_infrared_beam',& UNITS = '1' ,& SHORT_NAME = 'ALBNR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -956,7 +957,7 @@ subroutine SetServices(gc, rc) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & - LONG_NAME = 'surface_albedo_near_infrared_diffuse',& + LONG_NAME = 'surface_reflectivity_near_infrared_diffuse',& UNITS = '1' ,& SHORT_NAME = 'ALBNF' ,& DIMS = MAPL_DimsTileOnly ,& @@ -1224,21 +1225,19 @@ subroutine SetServices(gc, rc) VLOCATION = MAPL_VLocationNone, & RC=STATUS ) VERIFY_(STATUS) - - - call MAPL_AddExportSpec(GC, & - SHORT_NAME = 'ACCUM', & - LONG_NAME = 'net_ice_accumulation_rate', & - UNITS = 'kg m-2 s-1', & - DIMS = MAPL_DimsTileOnly, & - VLOCATION = MAPL_VLocationNone, & - RC=STATUS ) - VERIFY_(STATUS) - - + + call MAPL_AddExportSpec(GC, & + SHORT_NAME = 'ACCUM', & + LONG_NAME = 'net_ice_accumulation_rate', & + UNITS = 'kg m-2 s-1', & + DIMS = MAPL_DimsTileOnly, & + VLOCATION = MAPL_VLocationNone, & + RC=STATUS ) + VERIFY_(STATUS) + call MAPL_AddExportSpec(GC, & SHORT_NAME = 'EVLAND', & - LONG_NAME = 'Evaporation_land', & + LONG_NAME = 'total_evapotranspiration_land', & UNITS = 'kg m-2 s-1', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1265,7 +1264,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'DRPARLAND', & - LONG_NAME = 'surface_downwelling_par_beam_flux', & + LONG_NAME = 'surface_downwelling_PAR_beam_flux', & UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1274,7 +1273,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'DFPARLAND', & - LONG_NAME = 'surface_downwelling_par_diffuse_flux', & + LONG_NAME = 'surface_downwelling_PAR_diffuse_flux', & UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1292,8 +1291,8 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & - SHORT_NAME = 'SWNETSNOW', & - LONG_NAME = 'Net_shortwave_snow', & + SHORT_NAME = 'SWNETSNOW', & + LONG_NAME = 'Net_shortwave_flux_snow', & UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1303,7 +1302,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'LWUPSNOW', & - LONG_NAME = 'Net_longwave_snow', & + LONG_NAME = 'surface_emitted_longwave_flux_snow', & UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1312,7 +1311,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'LWDNSNOW', & - LONG_NAME = 'Net_longwave_snow', & + LONG_NAME = 'surface_absorbed_longwave_flux_snow', & UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1377,7 +1376,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'SWLAND', & - LONG_NAME = 'Net_shortwave_land', & + LONG_NAME = 'Net_shortwave_flux_land', & UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1386,7 +1385,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'SWDOWNLAND', & - LONG_NAME = 'Incident_shortwave_land', & + LONG_NAME = 'Incident_shortwave_flux_land', & UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1396,7 +1395,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'LWLAND', & - LONG_NAME = 'Net_longwave_land', & + LONG_NAME = 'Net_longwave_flux_land', & UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1406,7 +1405,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'GHLAND', & - LONG_NAME = 'Ground_heating_land', & + LONG_NAME = 'Ground_heating_flux_land', & UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1415,7 +1414,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'GHTSKIN', & - LONG_NAME = 'Ground_heating_skin_temp', & + LONG_NAME = 'Ground_heating_flux_for_skin_temp_land', & UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1434,7 +1433,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'TWLAND', & - LONG_NAME = 'Avail_water_storage_land', & + LONG_NAME = 'total_water_storage_land', & UNITS = 'kg m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1480,7 +1479,16 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'SPLAND', & - LONG_NAME = 'rate_of_spurious_land_energy_source',& + LONG_NAME = 'Spurious_sensible_heat_flux_land',& + UNITS = 'W m-2', & + DIMS = MAPL_DimsTileOnly, & + VLOCATION = MAPL_VLocationNone, & + RC=STATUS ) + VERIFY_(STATUS) + + call MAPL_AddExportSpec(GC, & + SHORT_NAME = 'SPLH', & + LONG_NAME = 'Spurious_latent_heat_flux_land',& UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1489,7 +1497,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'SPWATR', & - LONG_NAME = 'rate_of_spurious_land_water_source',& + LONG_NAME = 'Spurious_evapotranspiration_flux_land',& UNITS = 'kg m-2 s-1', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1498,7 +1506,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'SPSNOW', & - LONG_NAME = 'rate_of_spurious_snow_energy',& + LONG_NAME = 'Spurious_snow_energy_flux_land',& UNITS = 'W m-2', & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VLocationNone, & @@ -1838,7 +1846,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec( & gc, & SHORT_NAME = "DRPAR", & - LONG_NAME = "surface_downwelling_par_beam_flux", & + LONG_NAME = "surface_downwelling_PAR_beam_flux", & UNITS = "W m-2", & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VlocationNone, & @@ -1849,7 +1857,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec( & gc, & SHORT_NAME = "DFPAR", & - LONG_NAME = "surface_downwelling_par_diffuse_flux", & + LONG_NAME = "surface_downwelling_PAR_diffuse_flux", & UNITS = "W m-2", & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VlocationNone, & @@ -1904,7 +1912,7 @@ subroutine SetServices(gc, rc) call MAPL_AddExportSpec( & gc, & SHORT_NAME = "LWDNSRF", & - LONG_NAME = "perturbed_surface_downwelling_longwave_flux", & + LONG_NAME = "perturbed_surface_absorbed_longwave_flux", & UNITS = "W m-2", & DIMS = MAPL_DimsTileOnly, & VLOCATION = MAPL_VlocationNone, & @@ -1941,10 +1949,11 @@ subroutine SetServices(gc, rc) end subroutine SetServices - + ! ------------------------------------------------------------------------------------------------------------ + ! !BOP - - ! !IROTUINE: Initialize -- initialize method for LDAS GC + ! + ! !ROUTINE: Initialize -- initialize method for LDAS Ens GC ! !INTERFACE: @@ -2011,10 +2020,11 @@ subroutine Initialize(gc, import, export, clock, rc) end subroutine Initialize - + ! ------------------------------------------------------------------------------------------------------------ + ! !BOP - - ! !IROTUINE: collecting and averaging + ! + ! !ROUTINE: collect and average surface met forcing ensemble subroutine Collect_force_ens(gc, import, export, clock, rc) @@ -2088,7 +2098,6 @@ subroutine Collect_force_ens(gc, import, export, clock, rc) call MAPL_TimerOn(MAPL, "TOTAL") call MAPL_TimerOn(MAPL, "Collect_force") - call MAPL_GetPointer(import, TApert, 'TApert', rc=status) VERIFY_(status) call MAPL_GetPointer(import, QApert, 'QApert', rc=status) @@ -2233,6 +2242,10 @@ subroutine Collect_force_ens(gc, import, export, clock, rc) end subroutine Collect_force_ens + ! ------------------------------------------------------------------------------------------------------------ + ! + ! !ROUTINE: collect and average land ensemble + subroutine Collect_land_ens(gc, import, export, clock, rc) ! !ARGUMENTS: @@ -2419,6 +2432,7 @@ subroutine Collect_land_ens(gc, import, export, clock, rc) real, dimension(:),pointer :: DWLAND,DWLAND_enavg real, dimension(:),pointer :: DHLAND,DHLAND_enavg real, dimension(:),pointer :: SPLAND,SPLAND_enavg + real, dimension(:),pointer :: SPLH, SPLH_enavg real, dimension(:),pointer :: SPWATR,SPWATR_enavg real, dimension(:),pointer :: SPSNOW,SPSNOW_enavg real, dimension(:),pointer :: PEATCLSM_WATERLEVEL,PEATCLSM_WATERLEVEL_enavg @@ -2782,6 +2796,8 @@ subroutine Collect_land_ens(gc, import, export, clock, rc) VERIFY_(status) call MAPL_GetPointer(import, SPLAND, 'SPLAND' ,rc=status) VERIFY_(status) + call MAPL_GetPointer(import, SPLH, 'SPLH' ,rc=status) + VERIFY_(status) call MAPL_GetPointer(import, SPWATR, 'SPWATR' ,rc=status) VERIFY_(status) call MAPL_GetPointer(import, SPSNOW, 'SPSNOW' ,rc=status) @@ -2950,19 +2966,19 @@ subroutine Collect_land_ens(gc, import, export, clock, rc) VERIFY_(status) call MAPL_GetPointer(export, WCPR_enstd, 'WCPR_ENSSTD' ,rc=status) VERIFY_(status) - call MAPL_GetPointer(export, TP1_enavg, 'TSOIL1TILE' ,rc=status) + call MAPL_GetPointer(export, TP1_enavg, 'TP1' ,rc=status) VERIFY_(status) - call MAPL_GetPointer(export, TP1_enstd, 'TSOIL1TILE_ENSSTD' ,rc=status) + call MAPL_GetPointer(export, TP1_enstd, 'TP1_ENSSTD' ,rc=status) VERIFY_(status) - call MAPL_GetPointer(export, TP2_enavg, 'TSOIL2TILE' ,rc=status) + call MAPL_GetPointer(export, TP2_enavg, 'TP2' ,rc=status) VERIFY_(status) - call MAPL_GetPointer(export, TP3_enavg, 'TSOIL3TILE' ,rc=status) + call MAPL_GetPointer(export, TP3_enavg, 'TP3' ,rc=status) VERIFY_(status) - call MAPL_GetPointer(export, TP4_enavg, 'TSOIL4TILE' ,rc=status) + call MAPL_GetPointer(export, TP4_enavg, 'TP4' ,rc=status) VERIFY_(status) - call MAPL_GetPointer(export, TP5_enavg, 'TSOIL5TILE' ,rc=status) + call MAPL_GetPointer(export, TP5_enavg, 'TP5' ,rc=status) VERIFY_(status) - call MAPL_GetPointer(export, TP6_enavg, 'TSOIL6TILE' ,rc=status) + call MAPL_GetPointer(export, TP6_enavg, 'TP6' ,rc=status) VERIFY_(status) call MAPL_GetPointer(export, EMIS_enavg, 'EMIS' ,rc=status) VERIFY_(status) @@ -3084,6 +3100,8 @@ subroutine Collect_land_ens(gc, import, export, clock, rc) VERIFY_(status) call MAPL_GetPointer(export, SPLAND_enavg, 'SPLAND' ,rc=status) VERIFY_(status) + call MAPL_GetPointer(export, SPLH_enavg, 'SPLH' ,rc=status) + VERIFY_(status) call MAPL_GetPointer(export, SPWATR_enavg, 'SPWATR' ,rc=status) VERIFY_(status) call MAPL_GetPointer(export, SPSNOW_enavg, 'SPSNOW' ,rc=status) @@ -3253,6 +3271,7 @@ subroutine Collect_land_ens(gc, import, export, clock, rc) if(associated(DWLAND_enavg)) DWLAND_enavg = 0.0 if(associated(DHLAND_enavg)) DHLAND_enavg = 0.0 if(associated(SPLAND_enavg)) SPLAND_enavg = 0.0 + if(associated(SPLH_enavg)) SPLH_enavg = 0.0 if(associated(SPWATR_enavg)) SPWATR_enavg = 0.0 if(associated(SPSNOW_enavg)) SPSNOW_enavg = 0.0 if(associated(PEATCLSM_WATERLEVEL_enavg)) PEATCLSM_WATERLEVEL_enavg = 0.0 @@ -3546,6 +3565,8 @@ subroutine Collect_land_ens(gc, import, export, clock, rc) DHLAND_enavg = DHLAND_enavg + DHLAND if(associated(SPLAND_enavg) .and. associated(SPLAND)) & SPLAND_enavg = SPLAND_enavg + SPLAND + if(associated(SPLH_enavg) .and. associated(SPLH)) & + SPLH_enavg = SPLH_enavg + SPLH if(associated(SPWATR_enavg) .and. associated(SPWATR)) & SPWATR_enavg = SPWATR_enavg + SPWATR if(associated(SPSNOW_enavg) .and. associated(SPSNOW)) & @@ -3786,6 +3807,7 @@ subroutine Collect_land_ens(gc, import, export, clock, rc) if(associated(DWLAND_enavg)) DWLAND_enavg = DWLAND_enavg/NUM_ENSEMBLE if(associated(DHLAND_enavg)) DHLAND_enavg = DHLAND_enavg/NUM_ENSEMBLE if(associated(SPLAND_enavg)) SPLAND_enavg = SPLAND_enavg/NUM_ENSEMBLE + if(associated(SPLH_enavg)) SPLH_enavg = SPLH_enavg /NUM_ENSEMBLE if(associated(SPWATR_enavg)) SPWATR_enavg = SPWATR_enavg/NUM_ENSEMBLE if(associated(SPSNOW_enavg)) SPSNOW_enavg = SPSNOW_enavg/NUM_ENSEMBLE if(associated(PEATCLSM_WATERLEVEL_enavg)) PEATCLSM_WATERLEVEL_enavg = PEATCLSM_WATERLEVEL_enavg/NUM_ENSEMBLE @@ -3850,7 +3872,10 @@ subroutine Collect_land_ens(gc, import, export, clock, rc) RETURN_(ESMF_SUCCESS) end subroutine Collect_land_ens - + + ! ------------------------------------------------------------------------------------------------------------ + ! + ! !ROUTINE: collect Catchment model parameters subroutine GET_CATCH_PARAM( GC, IMPORT, EXPORT, CLOCK, RC ) @@ -3875,38 +3900,38 @@ subroutine GET_CATCH_PARAM( GC, IMPORT, EXPORT, CLOCK, RC ) logical :: firsttime = .true. real, pointer :: poros(:) =>null() - real, pointer :: cond(:) =>null() - real, pointer :: psis(:) =>null() - real, pointer :: bee(:) =>null() + real, pointer :: cond(:) =>null() + real, pointer :: psis(:) =>null() + real, pointer :: bee(:) =>null() real, pointer :: wpwet(:) =>null() - real, pointer :: gnu(:) =>null() - real, pointer :: vgwmax(:) =>null() - real, pointer :: bf1(:) =>null() - real, pointer :: bf2(:) =>null() - real, pointer :: bf3(:) =>null() + real, pointer :: gnu(:) =>null() + real, pointer :: vgwmax(:)=>null() + real, pointer :: bf1(:) =>null() + real, pointer :: bf2(:) =>null() + real, pointer :: bf3(:) =>null() real, pointer :: cdcr1(:) =>null() real, pointer :: cdcr2(:) =>null() - real, pointer :: ars1(:) =>null() - real, pointer :: ars2(:) =>null() - real, pointer :: ars3(:) =>null() - real, pointer :: ara1(:) =>null() - real, pointer :: ara2(:) =>null() - real, pointer :: ara3(:) =>null() - real, pointer :: ara4(:) =>null() - real, pointer :: arw1(:) =>null() - real, pointer :: arw2(:) =>null() - real, pointer :: arw3(:) =>null() - real, pointer :: arw4(:) =>null() - real, pointer :: tsa1(:) =>null() - real, pointer :: tsa2(:) =>null() - real, pointer :: tsb1(:) =>null() - real, pointer :: tsb2(:) =>null() - real, pointer :: atau(:) =>null() - real, pointer :: btau(:) =>null() - real, pointer :: ity(:) =>null() - real, pointer :: z2ch(:) =>null() - - real :: SURFLAY, x + real, pointer :: ars1(:) =>null() + real, pointer :: ars2(:) =>null() + real, pointer :: ars3(:) =>null() + real, pointer :: ara1(:) =>null() + real, pointer :: ara2(:) =>null() + real, pointer :: ara3(:) =>null() + real, pointer :: ara4(:) =>null() + real, pointer :: arw1(:) =>null() + real, pointer :: arw2(:) =>null() + real, pointer :: arw3(:) =>null() + real, pointer :: arw4(:) =>null() + real, pointer :: tsa1(:) =>null() + real, pointer :: tsa2(:) =>null() + real, pointer :: tsb1(:) =>null() + real, pointer :: tsb2(:) =>null() + real, pointer :: atau(:) =>null() + real, pointer :: btau(:) =>null() + real, pointer :: ity(:) =>null() + real, pointer :: z2ch(:) =>null() + + real :: SURFLAY, x integer :: i if (firsttime) then @@ -3983,46 +4008,48 @@ subroutine GET_CATCH_PARAM( GC, IMPORT, EXPORT, CLOCK, RC ) catch_param(:)%dzgt(4) = dzgt(4) catch_param(:)%dzgt(5) = dzgt(5) catch_param(:)%dzgt(6) = dzgt(6) - catch_param(:)%poros = poros - catch_param(:)%cond = cond - catch_param(:)%psis = psis - catch_param(:)%bee = bee - catch_param(:)%wpwet = wpwet - catch_param(:)%gnu = gnu - catch_param(:)%vgwmax= vgwmax - catch_param(:)%bf1 = bf1 - catch_param(:)%bf2 = bf2 - catch_param(:)%bf3 = bf3 - catch_param(:)%cdcr1 = cdcr1 - catch_param(:)%cdcr2 = cdcr2 - catch_param(:)%ars1 = ars1 - catch_param(:)%ars2 = ars2 - catch_param(:)%ars3 = ars3 - catch_param(:)%ara1 = ara1 - catch_param(:)%ara2 = ara2 - catch_param(:)%ara3 = ara3 - catch_param(:)%ara4 = ara4 - catch_param(:)%arw1 = arw1 - catch_param(:)%arw2 = arw2 - catch_param(:)%arw3 = arw3 - catch_param(:)%arw4 = arw4 - catch_param(:)%tsa1 = tsa1 - catch_param(:)%tsa2 = tsa2 - catch_param(:)%tsb1 = tsb1 - catch_param(:)%tsb2 = tsb2 - catch_param(:)%atau = atau - catch_param(:)%btau = btau + catch_param(:)%poros = poros + catch_param(:)%cond = cond + catch_param(:)%psis = psis + catch_param(:)%bee = bee + catch_param(:)%wpwet = wpwet + catch_param(:)%gnu = gnu + catch_param(:)%vgwmax = vgwmax + catch_param(:)%bf1 = bf1 + catch_param(:)%bf2 = bf2 + catch_param(:)%bf3 = bf3 + catch_param(:)%cdcr1 = cdcr1 + catch_param(:)%cdcr2 = cdcr2 + catch_param(:)%ars1 = ars1 + catch_param(:)%ars2 = ars2 + catch_param(:)%ars3 = ars3 + catch_param(:)%ara1 = ara1 + catch_param(:)%ara2 = ara2 + catch_param(:)%ara3 = ara3 + catch_param(:)%ara4 = ara4 + catch_param(:)%arw1 = arw1 + catch_param(:)%arw2 = arw2 + catch_param(:)%arw3 = arw3 + catch_param(:)%arw4 = arw4 + catch_param(:)%tsa1 = tsa1 + catch_param(:)%tsa2 = tsa2 + catch_param(:)%tsb1 = tsb1 + catch_param(:)%tsb2 = tsb2 + catch_param(:)%atau = atau + catch_param(:)%btau = btau catch_param(:)%vegcls = nint(ity) catch_param(:)%veghght = z2ch call MAPL_GetResource(MAPL, SURFLAY, Label="SURFLAY:", DEFAULT=50.0, rc=status) - catch_param(:)%dzsf = SURFLAY - catch_param(:)%dzpr = (cdcr2/(1.-wpwet)) / poros - catch_param(:)%dzrz = vgwmax/poros + catch_param(:)%dzsf = SURFLAY + catch_param(:)%dzpr = (cdcr2/(1.-wpwet)) / poros + catch_param(:)%dzrz = vgwmax/poros + + ! assign NaN to other fields - !assign NaN to other fields x = ieee_value(x,ieee_quiet_nan) + catch_param(:)%soilcls30 = transfer(x,i) catch_param(:)%soilcls100 = transfer(x,i) catch_param(:)%gravel30 = x @@ -4035,10 +4062,14 @@ subroutine GET_CATCH_PARAM( GC, IMPORT, EXPORT, CLOCK, RC ) catch_param(:)%wpwet30 = x catch_param(:)%poros30 = x catch_param(:)%dpth = x + endif + RETURN_(ESMF_SUCCESS) -end subroutine GET_CATCH_PARAM + end subroutine GET_CATCH_PARAM + + ! ------------------------------------------------------------------------------------------------------------ subroutine Finalize(gc, import, export, clock, rc) @@ -4078,3 +4109,5 @@ subroutine Finalize(gc, import, export, clock, rc) end subroutine Finalize end module GEOS_EnsGridCompMod + +! ============================= EOF ====================================================================== diff --git a/GEOSlandassim_GridComp/GEOS_LandAssimGridComp.F90 b/GEOSlandassim_GridComp/GEOS_LandAssimGridComp.F90 index f24124fd..c7904fca 100644 --- a/GEOSlandassim_GridComp/GEOS_LandAssimGridComp.F90 +++ b/GEOSlandassim_GridComp/GEOS_LandAssimGridComp.F90 @@ -540,7 +540,7 @@ subroutine SetServices ( GC, RC ) ! Exports for Catchment prognostics increments call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_temperature_saturated_zone' ,& + LONG_NAME = 'increment_surface_temperature_of_saturated_zone' ,& UNITS = 'K' ,& SHORT_NAME = 'TCFSAT_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -549,7 +549,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_temperature_transition_zone' ,& + LONG_NAME = 'increment_surface_temperature_of_unsaturated_zone' ,& UNITS = 'K' ,& SHORT_NAME = 'TCFTRN_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -558,7 +558,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_temperature_wilting_zone' ,& + LONG_NAME = 'increment_surface_temperature_of_wilting_zone' ,& UNITS = 'K' ,& SHORT_NAME = 'TCFWLT_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -567,7 +567,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_specific_humidity_saturated_zone' ,& + LONG_NAME = 'increment_surface_specific_humidity_of_saturated_zone' ,& UNITS = 'kg kg-1' ,& SHORT_NAME = 'QCFSAT_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -576,7 +576,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_specific_humidity_transition_zone' ,& + LONG_NAME = 'increment_surface_specific_humidity_of_unsaturated_zone' ,& UNITS = 'kg kg-1' ,& SHORT_NAME = 'QCFTRN_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -585,7 +585,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_specific_humidity_wilting_zone' ,& + LONG_NAME = 'increment_surface_specific_humidity_of_wilting_zone' ,& UNITS = 'kg kg-1' ,& SHORT_NAME = 'QCFWLT_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -594,7 +594,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_interception_reservoir_capac' ,& + LONG_NAME = 'increment_vegetation_interception_water_storage' ,& UNITS = 'kg m-2' ,& SHORT_NAME = 'CAPAC_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -847,18 +847,18 @@ subroutine SetServices ( GC, RC ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'soil_temperatures_layer_1_analysis' ,& + LONG_NAME = 'soil_temperature_layer_1_analysis' ,& UNITS = 'K' ,& - SHORT_NAME = 'TSOIL1_ANA' ,& + SHORT_NAME = 'TP1_ANA' ,& DIMS = MAPL_DimsTileOnly ,& VLOCATION = MAPL_VLocationNone ,& RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'soil_temperatures_layer_1_analysis_ensstd' ,& + LONG_NAME = 'soil_temperature_layer_1_analysis_ensstd' ,& UNITS = 'K' ,& - SHORT_NAME = 'TSOIL1_ANA_ENSSTD' ,& + SHORT_NAME = 'TP1_ANA_ENSSTD' ,& DIMS = MAPL_DimsTileOnly ,& VLOCATION = MAPL_VLocationNone ,& RC=STATUS ) @@ -1531,13 +1531,13 @@ subroutine RUN ( GC, IMPORT, EXPORT, CLOCK, RC ) real, dimension(:),pointer :: RZMC_ana=>null() ! rootzone soil moisture real, dimension(:),pointer :: PRMC_ana=>null() ! profile soil moisture real, dimension(:),pointer :: TPSURF_ana=>null() ! tpsurf - real, dimension(:),pointer :: TSOIL1_ana=>null() ! tsoil1 + real, dimension(:),pointer :: TP1_ana=>null() ! tsoil1 real, dimension(:),pointer :: SFMC_ana_ensstd=>null() ! surface soil moisture real, dimension(:),pointer :: RZMC_ana_ensstd=>null() ! rootzone soil moisture real, dimension(:),pointer :: PRMC_ana_ensstd=>null() ! profile soil moisture real, dimension(:),pointer :: TPSURF_ana_ensstd=>null() ! tpsurf - real, dimension(:),pointer :: TSOIL1_ana_ensstd=>null() ! tsoil1 + real, dimension(:),pointer :: TP1_ana_ensstd=>null() ! tsoil1 !! export for microwave radiative transfer model (mwRTM) @@ -1699,7 +1699,7 @@ subroutine RUN ( GC, IMPORT, EXPORT, CLOCK, RC ) call MAPL_GetPointer(export, TPSURF_ana, 'TPSURF_ANA' ,rc=status) VERIFY_(status) - call MAPL_GetPointer(export, TSOIL1_ana, 'TSOIL1_ANA' ,rc=status) + call MAPL_GetPointer(export, TP1_ana, 'TP1_ANA' ,rc=status) VERIFY_(status) call MAPL_GetPointer(export, SFMC_ana, 'WCSF_ANA' ,rc=status) VERIFY_(status) @@ -1709,7 +1709,7 @@ subroutine RUN ( GC, IMPORT, EXPORT, CLOCK, RC ) VERIFY_(status) call MAPL_GetPointer(export, TPSURF_ana_ensstd, 'TPSURF_ANA_ENSSTD' ,rc=status) VERIFY_(status) - call MAPL_GetPointer(export, TSOIL1_ana_ensstd, 'TSOIL1_ANA_ENSSTD' ,rc=status) + call MAPL_GetPointer(export, TP1_ana_ensstd, 'TP1_ANA_ENSSTD' ,rc=status) VERIFY_(status) call MAPL_GetPointer(export, SFMC_ana_ensstd, 'WCSF_ANA_ENSSTD' ,rc=status) VERIFY_(status) @@ -2046,13 +2046,13 @@ subroutine RUN ( GC, IMPORT, EXPORT, CLOCK, RC ) if(associated(RZMC_ana)) RZMC_ana(:) = cat_diagS_ensavg(:)%rzmc if(associated(PRMC_ana)) PRMC_ana(:) = cat_diagS_ensavg(:)%prmc if(associated(TPSURF_ana)) TPSURF_ana(:) = cat_diagS_ensavg(:)%tsurf - if(associated(TSOIL1_ana)) TSOIL1_ana(:) = cat_diagS_ensavg(:)%tp(1) + MAPL_TICE ! convert to K + if(associated(TP1_ana)) TP1_ana(:) = cat_diagS_ensavg(:)%tp(1) + MAPL_TICE ! convert to K if(associated(SFMC_ana_ensstd)) SFMC_ana_ensstd(:) = max( cat_diagS_ensstd(:)%sfmc , 0. ) if(associated(RZMC_ana_ensstd)) RZMC_ana_ensstd(:) = max( cat_diagS_ensstd(:)%rzmc , 0. ) if(associated(PRMC_ana_ensstd)) PRMC_ana_ensstd(:) = max( cat_diagS_ensstd(:)%prmc , 0. ) if(associated(TPSURF_ana_ensstd)) TPSURF_ana_ensstd(:) = max( cat_diagS_ensstd(:)%tsurf , 0. ) - if(associated(TSOIL1_ana_ensstd)) TSOIL1_ana_ensstd(:) = max( cat_diagS_ensstd(:)%tp(1) , 0. ) + if(associated(TP1_ana_ensstd)) TP1_ana_ensstd(:) = max( cat_diagS_ensstd(:)%tp(1) , 0. ) if(associated(MWRTM_VEGOPACITY)) MWRTM_VEGOPACITY(:) = mwRTM_param(:)%VEGOPACITY diff --git a/GEOSlandassim_GridComp/GEOSexportcatchincr_GridComp/GEOS_ExportCatchIncrGridComp.F90 b/GEOSlandassim_GridComp/GEOSexportcatchincr_GridComp/GEOS_ExportCatchIncrGridComp.F90 index 8ea79574..cbbec5f9 100644 --- a/GEOSlandassim_GridComp/GEOSexportcatchincr_GridComp/GEOS_ExportCatchIncrGridComp.F90 +++ b/GEOSlandassim_GridComp/GEOSexportcatchincr_GridComp/GEOS_ExportCatchIncrGridComp.F90 @@ -88,7 +88,7 @@ subroutine SetServices ( GC, RC ) ! Exports for Catchment prognostics increments call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_temperature_saturated_zone' ,& + LONG_NAME = 'increment_surface_temperature_saturated_zone' ,& UNITS = 'K' ,& SHORT_NAME = 'TCFSAT_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -97,7 +97,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_temperature_transition_zone' ,& + LONG_NAME = 'increment_surface_temperature_of_unsaturated_zone' ,& UNITS = 'K' ,& SHORT_NAME = 'TCFTRN_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -106,7 +106,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_temperature_wilting_zone' ,& + LONG_NAME = 'increment_surface_temperature_of_wilting_zone' ,& UNITS = 'K' ,& SHORT_NAME = 'TCFWLT_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -115,7 +115,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_specific_humidity_saturated_zone' ,& + LONG_NAME = 'increment_surface_specific_humidity_of_saturated_zone' ,& UNITS = 'kg kg-1' ,& SHORT_NAME = 'QCFSAT_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -124,7 +124,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_specific_humidity_transition_zone' ,& + LONG_NAME = 'increment_surface_specific_humidity_of_unsaturated_zone' ,& UNITS = 'kg kg-1' ,& SHORT_NAME = 'QCFTRN_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -133,7 +133,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_canopy_specific_humidity_wilting_zone' ,& + LONG_NAME = 'increment_surface_specific_humidity_of_wilting_zone' ,& UNITS = 'kg kg-1' ,& SHORT_NAME = 'QCFWLT_INCR' ,& DIMS = MAPL_DimsTileOnly ,& @@ -142,7 +142,7 @@ subroutine SetServices ( GC, RC ) _VERIFY(STATUS) call MAPL_AddExportSpec(GC ,& - LONG_NAME = 'increment_interception_reservoir_capac' ,& + LONG_NAME = 'increment_vegetation_interception_water_storage' ,& UNITS = 'kg m-2' ,& SHORT_NAME = 'CAPAC_INCR' ,& DIMS = MAPL_DimsTileOnly ,& diff --git a/GEOSlandassim_GridComp/clsm_ensupd_enkf_update.F90 b/GEOSlandassim_GridComp/clsm_ensupd_enkf_update.F90 index ea0be949..eedd28c8 100644 --- a/GEOSlandassim_GridComp/clsm_ensupd_enkf_update.F90 +++ b/GEOSlandassim_GridComp/clsm_ensupd_enkf_update.F90 @@ -1339,6 +1339,8 @@ subroutine apply_enkf_increments( N_catd, N_ens, update_type, & cat_progn_has_changed = .false. + ! ------------------------------------------------------------------ + case (4,7) select_update_type ! Tskin/ght1 update if (logit) write (logunit,*) & @@ -1361,6 +1363,8 @@ subroutine apply_enkf_increments( N_catd, N_ens, update_type, & cat_progn_has_changed = .true. + ! ------------------------------------------------------------------ + case (5) select_update_type ! Tskin/ght1 update if (logit) write (logunit,*) & @@ -1368,6 +1372,8 @@ subroutine apply_enkf_increments( N_catd, N_ens, update_type, & cat_progn_has_changed = .false. + ! ------------------------------------------------------------------ + case (6,8,9,10,13) select_update_type ! soil moisture and temperature update ! some of the increments fields below may be zero by design @@ -1395,20 +1401,23 @@ subroutine apply_enkf_increments( N_catd, N_ens, update_type, & cat_progn(n,n_e)%tc4 + cat_progn_incr(n,n_e)%tc4 cat_progn(n,n_e)%ght(1) = & - cat_progn(n,n_e)%ght(1) + cat_progn_incr(n,n_e)%ght(1) - + cat_progn(n,n_e)%ght(1) + cat_progn_incr(n,n_e)%ght(1) end do end do cat_progn_has_changed = .true. - check_snow = .false. ! turn off for now to maintain 0-diff w/ SMAP Tb DA test case + if (update_type==10) check_snow = .false. ! turn off for now to maintain 0-diff w/ SMAP Tb DA test case + + ! ------------------------------------------------------------------ - case(11) select_update_type ! empirical MODIS SCF update + case(11) select_update_type ! snow update - do n=1,N_catd ! for each tile + if (logit) write (logunit,*) 'apply_enkf_increments(): applying snow increments' + + do n=1,N_catd ! for each tile - do n_e=1,N_ens ! for each ensemble member + do n_e=1,N_ens ! for each ensemble member do ii=1,N_snow ! for each snow layer @@ -1427,6 +1436,57 @@ subroutine apply_enkf_increments( N_catd, N_ens, update_type, & cat_progn_has_changed = .true. + ! ------------------------------------------------------------------ + + case (12) select_update_type ! soil moisture, temperature, and snow update + + ! some of the increments fields below may be zero by design + ! (e.g., tc[X]=ght(1)=0 in update_type=13 when only sfmc or sfds obs are assimilated; + ! or catdef=0 in update_type 10 or 13 when tile has mineral soil) + + if (logit) write (logunit,*) & + 'apply_enkf_increments(): applying soil moisture, Tskin/ght1 and snow increments' + + do n=1,N_catd + do n_e=1,N_ens + + cat_progn(n,n_e)%srfexc = & + cat_progn(n,n_e)%srfexc + cat_progn_incr(n,n_e)%srfexc + cat_progn(n,n_e)%rzexc = & + cat_progn(n,n_e)%rzexc + cat_progn_incr(n,n_e)%rzexc + cat_progn(n,n_e)%catdef = & + cat_progn(n,n_e)%catdef + cat_progn_incr(n,n_e)%catdef + + cat_progn(n,n_e)%tc1 = & + cat_progn(n,n_e)%tc1 + cat_progn_incr(n,n_e)%tc1 + cat_progn(n,n_e)%tc2 = & + cat_progn(n,n_e)%tc2 + cat_progn_incr(n,n_e)%tc2 + cat_progn(n,n_e)%tc4 = & + cat_progn(n,n_e)%tc4 + cat_progn_incr(n,n_e)%tc4 + + cat_progn(n,n_e)%ght(1) = & + cat_progn(n,n_e)%ght(1) + cat_progn_incr(n,n_e)%ght(1) + + do ii=1,N_snow ! for each snow layer + + cat_progn(n,n_e)%wesn(ii) = & + cat_progn(n,n_e)%wesn(ii) + cat_progn_incr(n,n_e)%wesn(ii) + + cat_progn(n,n_e)%sndz(ii) = & + cat_progn(n,n_e)%sndz(ii) + cat_progn_incr(n,n_e)%sndz(ii) + + cat_progn(n,n_e)%htsn(ii) = & + cat_progn(n,n_e)%htsn(ii) + cat_progn_incr(n,n_e)%htsn(ii) + + end do + + end do + end do + + cat_progn_has_changed = .true. + + ! ------------------------------------------------------------------ + case default call ldas_abort(LDAS_GENERIC_ERROR, Iam, 'unknown update_type') diff --git a/GEOSlandassim_GridComp/clsm_ensupd_glob_param.F90 b/GEOSlandassim_GridComp/clsm_ensupd_glob_param.F90 index 678a0978..aebfb3e1 100644 --- a/GEOSlandassim_GridComp/clsm_ensupd_glob_param.F90 +++ b/GEOSlandassim_GridComp/clsm_ensupd_glob_param.F90 @@ -48,7 +48,7 @@ module clsm_ensupd_glob_param ! total number of all obs species defined in "ensupd" namelist file ! (regardless of whether "assim" flag is true or false) - integer, parameter :: N_obs_species_nml = 53 + integer, parameter :: N_obs_species_nml = 55 ! ---------------------------------------------------------------------- ! diff --git a/GEOSlandassim_GridComp/clsm_ensupd_read_obs.F90 b/GEOSlandassim_GridComp/clsm_ensupd_read_obs.F90 index e87b3df4..22ab792d 100644 --- a/GEOSlandassim_GridComp/clsm_ensupd_read_obs.F90 +++ b/GEOSlandassim_GridComp/clsm_ensupd_read_obs.F90 @@ -1629,6 +1629,7 @@ subroutine read_obs_sm_ASCAT_EUMET( & type(date_time_type) :: date_time_tmp type(date_time_type) :: date_time_low, date_time_low_fname type(date_time_type) :: date_time_up + type(date_time_type) :: date_time_obs_beg, date_time_obs_end integer :: ii, ind, N_tmp, N_files, kk, N_obs, N_fnames, N_fnames_tmp, obs_dir_hier @@ -1667,7 +1668,7 @@ subroutine read_obs_sm_ASCAT_EUMET( & ! -------------------- - character(100), dimension(2*N_fnames_max) :: fname_list ! max 2 days of files + character(200), dimension(2*N_fnames_max) :: fname_list ! max 2 days of files real, dimension(:), allocatable :: tmp1_obs, tmp1_lat, tmp1_lon real*8, dimension(:), allocatable :: tmp1_jtime @@ -1688,11 +1689,34 @@ subroutine read_obs_sm_ASCAT_EUMET( & nullify( tmp_obs, tmp_lat, tmp_lon, tmp_tile_num, tmp_jtime ) ! --------------- - + ! initialize found_obs = .false. + ! determine operating time range of sensor + + if (trim(this_obs_param%descr) == 'ASCAT_META_SM') then + date_time_obs_beg = date_time_type(2007, 6, 1, 1,31, 0,-9999,-9999) + date_time_obs_end = date_time_type(2021,11,15, 9, 0, 0,-9999,-9999) + elseif (trim(this_obs_param%descr) == 'ASCAT_METB_SM') then + date_time_obs_beg = date_time_type(2013, 4,24, 8, 0, 0,-9999,-9999) + date_time_obs_end = date_time_type(2100, 1, 1, 0, 0, 0,-9999,-9999) + elseif (trim(this_obs_param%descr) == 'ASCAT_METC_SM') then + date_time_obs_beg = date_time_type(2019,11,25,12, 0, 0,-9999,-9999) + date_time_obs_end = date_time_type(2100, 1, 1, 0, 0, 0,-9999,-9999) + else + err_msg = 'Unknown obs_param%descr: ' // trim(this_obs_param%descr) + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + + ! return if date_time falls outside operating time range + + if ( datetime_lt_refdatetime(date_time, date_time_obs_beg) .or. & + datetime_lt_refdatetime(date_time_obs_end, date_time) ) return + + ! --------------- + ! find files that are within half-open interval ! (date_time-dtstep_assim/2,date_time+dtstep_assim/2] @@ -1741,24 +1765,59 @@ subroutine read_obs_sm_ASCAT_EUMET( & N_tmp = 0 do kk = 1,N_fnames - + tmpfname = fname_list(kk) - + ! Are we in the required assimilation window? ! + ! NOTE: EUMETSAT changed the file name template sometime in 2023 or 2024. + ! There was no change to the file contents. + ! Files from the original download (through data day ~1 Jun 2023) have + ! the original file name template ("M0[X]-ASCA..."), more recently downloaded + ! files have the revised template ("W_XX-EUMETSAT..."). + ! This reader accommodates both templates: + ! ! e.g. Y2019/M07/M01-ASCA-ASCSMO02-NA-5.0-20190702075700.000000000Z-20190702084627-1350204.bfr + ! Y2024/M02/W_XX-EUMETSAT-Darmstadt,SOUNDING+SATELLITE,METOPC+ASCAT_C_EUMR_20240229095700_27567_eps_o_250_ssm_l2.bin ! - ! 12345678901234567890123456789012345678901234567890123456789012345678901234567890 - ! 1 2 3 4 5 6 7 - - str_date_time = tmpfname(36:49) - + ! 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 + ! 1 2 3 4 5 6 7 8 9 10 11 12 + + ! check if tmpfname contains "ASCA-ASCSMO02" or "W_XX-EUMETSAT", error if neither + + if (index(tmpfname, "ASCA-ASCSMO02") /= 0) then + str_date_time = tmpfname(36:49) + else if (index(tmpfname, "W_XX-EUMETSAT") /= 0) then + str_date_time = tmpfname(74:87) + else + err_msg = 'Unknown ASCAT observation file name format' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + + ! check if str_date_time only contains numeric characters + + do ii = 1, len(trim(str_date_time)) + if (ichar(str_date_time(ii:ii)) < ichar('0') .or. ichar(str_date_time(ii:ii)) > ichar('9')) then + err_msg = 'Date-time string parsed from ASCAT sm obs file name contains non-numeric characters' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + end do + read(str_date_time( 1: 4), *) date_time_tmp%year read(str_date_time( 5: 6), *) date_time_tmp%month read(str_date_time( 7: 8), *) date_time_tmp%day read(str_date_time( 9:10), *) date_time_tmp%hour read(str_date_time(11:12), *) date_time_tmp%min read(str_date_time(13:14), *) date_time_tmp%sec + + ! check if year, month, and day are valid + + if ( date_time_tmp%year < 2007 .or. date_time_tmp%year > 2100 .or. & + date_time_tmp%month < 1 .or. date_time_tmp%month > 12 .or. & + date_time_tmp%day < 1 .or. date_time_tmp%day > 31 ) then + err_msg = 'Could not parse valid date-time string from ASCAT obs file name' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if if ( datetime_lt_refdatetime( date_time_low_fname, date_time_tmp ) .and. & datetime_le_refdatetime( date_time_tmp, date_time_up ) ) then @@ -2086,7 +2145,512 @@ subroutine read_obs_sm_ASCAT_EUMET( & if (associated(tmp_jtime)) deallocate(tmp_jtime) end subroutine read_obs_sm_ASCAT_EUMET + + ! **************************************************************************** + + subroutine read_obs_sm_CYGNSS( & + date_time, dtstep_assim, N_catd, tile_coord, & + tile_grid_d, N_tile_in_cell_ij, tile_num_in_cell_ij, & + this_obs_param, & + found_obs, CYGNSS_sm, CYGNSS_sm_std, CYGNSS_lon, CYGNSS_lat, CYGNSS_time ) + + !--------------------------------------------------------------------- + ! + ! Routine to read CYGNSS soil moisture obs from netCDF file and apply mask. + ! https://podaac.jpl.nasa.gov/dataset/CYGNSS_L3_SOIL_MOISTURE_V3.2 + ! CYGNSS soil moisture obs are in volumetric units (m3 m-3) on the + ! 36-km EASEv2 global cylindrical grid. + ! Obs are in files containing daily (obs_param_nml(.)%descr = CYGNSS_SM_daily) + ! and subdaily SM estimates (obs_param_nml(.)%descr = CYGNSS_SM_6hr). + ! Daily values are for 0-24z and assimilated at 12z. + ! Subdaily values are for 6 hr time intervals, 0-6z, 6-12z, 12-18z, and 18-24z + ! and assimilated at 3z, 9z, 15z, 21z. + ! Assimilation window must not be longer than 6 hours. + ! Subroutine read_ens_upd_inputs() ensures that only daily *or* subdaily + ! obs are assimilated. + ! + ! A. Fox, reichle, Jan 2025 + ! + ! -------------------------------------------------------------------- + + use netcdf + implicit none + + ! inputs: + + type(date_time_type), intent(in) :: date_time + + integer, intent(in) :: dtstep_assim, N_catd + + type(tile_coord_type), dimension(:), pointer :: tile_coord ! input + + type(grid_def_type), intent(in) :: tile_grid_d + + integer, dimension(tile_grid_d%N_lon,tile_grid_d%N_lat), intent(in) :: & + N_tile_in_cell_ij + + integer, dimension(:,:,:), pointer :: tile_num_in_cell_ij ! input + + type(obs_param_type), intent(in) :: this_obs_param + + ! outputs: + + logical, intent(out) :: found_obs + + real, intent(out), dimension(N_catd) :: CYGNSS_sm ! sm obs [cm3 cm-3] + real, intent(out), dimension(N_catd) :: CYGNSS_sm_std ! sm obs err std [cm3 cm-3] + real, intent(out), dimension(N_catd) :: CYGNSS_lon, CYGNSS_lat + real*8, intent(out), dimension(N_catd) :: CYGNSS_time ! J2000 seconds + + ! ------------------------------------------------------------------- + ! local variables: + + + integer, parameter :: max_obs = 50000 ! max number of daily obs read by subroutine (assim window <= 24 hr) + character(4), parameter :: J2000_epoch_id = 'TT12' ! see date_time_util.F90 + character(len=*), parameter :: Iam = 'read_obs_sm_CYGNSS' + real, parameter :: tolerance = 1.0e-6 ! tolerance for floating point comparisons + + type(date_time_type) :: date_time_obs_beg, date_time_obs_end + type(date_time_type) :: date_time_up, date_time_low + + character(400) :: err_msg + character(300) :: tmpfname, tmpname, tmpmaskname + character( 2) :: MM, DD, HH, MI + character( 4) :: YYYY + + integer :: i, idx, N_obs, j, ind, ii, dt_obs, obs_hour + integer :: ierr, ncid + integer :: lon_dimid, lat_dimid, time_dimid, timeslices_dimid, startstop_dimid, lon_dimid_m, lat_dimid_m + integer :: sm_d_varid, sm_subd_varid, sigma_d_varid, sigma_subd_varid, timeintervals_varid, lat_varid, lon_varid + integer :: N_lon, N_lat, N_time, N_timeslices, N_startstop, N_lon_m, N_lat_m + integer :: longitudes_m_varid, latitudes_m_varid, small_SM_range_varid, poor_SMAP_varid, high_ubrmsd_varid + integer :: few_obs_varid, low_signal_varid, good_flag_value + + integer :: start(3), count(3) + integer, allocatable :: small_SM_range_flag(:,:), poor_SMAP_flag(:,:), high_ubrmsd_flag(:,:), few_obs_flag(:,:), low_signal_flag(:,:) + + logical :: file_exists + + real, dimension(:), pointer :: tmp_lon(:), tmp_lat(:), tmp_obs(:), tmp_err(:), tmp_jtime(:) + integer, dimension(:), pointer :: tmp_tile_num + + integer, dimension(N_catd) :: N_obs_in_tile + + real, allocatable :: timeintervals(:,:), latitudes(:,:), longitudes(:,:), tmp_sm(:,:), tmp_sigma(:,:) + real, allocatable :: time(:), timeslices(:,:) + real, allocatable :: latitudes_m(:,:), longitudes_m(:,:) + + real :: date_time_low_hour, date_time_up_hour + real :: tmp1_lon(max_obs), tmp1_lat(max_obs), tmp1_obs(max_obs), tmp1_err(max_obs), tmp1_jtime(max_obs) + + ! ------------------------------------------------------------------- + + ! initialize + + nullify( tmp_lon, tmp_lat, tmp_obs, tmp_err, tmp_jtime, tmp_tile_num ) + + found_obs = .false. + + ! determine operating time range of sensor + + if (trim(this_obs_param%descr) == 'CYGNSS_SM_6hr' .or. trim(this_obs_param%descr) == 'CYGNSS_SM_daily') then + date_time_obs_beg = date_time_type(2018, 8, 1, 0, 0, 0,-9999,-9999) + date_time_obs_end = date_time_type(2100, 1, 1, 0, 0, 0,-9999,-9999) + else + err_msg = 'Unknown obs_param%descr: ' // trim(this_obs_param%descr) + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + + ! return if date_time falls outside operating time range + + if ( datetime_lt_refdatetime(date_time, date_time_obs_beg) .or. & + datetime_lt_refdatetime(date_time_obs_end, date_time) ) return + + ! make sure assimilation window is no longer than 6 hours + + if (dtstep_assim>6*60*60) then + err_msg = 'dtstep_assim too long for CYGNSS soil moisture obs' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + + ! determine if reading daily or subdaily obs + + if (trim(this_obs_param%descr) == 'CYGNSS_SM_daily') then + dt_obs = 24 ! obs frequency in hours + elseif (trim(this_obs_param%descr) == 'CYGNSS_SM_6hr') then + dt_obs = 6 + else + err_msg = 'Unknown obs_param%descr: ' // trim(this_obs_param%descr) + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + + ! find the time bounds of the assimilation window + ! (date_time-dtstep_assim/2,date_time+dtstep_assim/2] + + date_time_low = date_time + call augment_date_time( -(dtstep_assim/2), date_time_low) + date_time_up = date_time + call augment_date_time( (dtstep_assim/2), date_time_up) + + ! get fractional time-of-day (hours) + + date_time_low_hour = date_time_low%hour + date_time_low%min/60.0 + date_time_low%sec/3600.0 + date_time_up_hour = date_time_up%hour + date_time_up%min/60.0 + date_time_up%sec/3600.0 + + ! deal with assimilation window that spans 0z + + if (date_time_low_hour > date_time_up_hour) then + date_time_low_hour = date_time_low_hour - 24.0 + end if + + obs_hour = -9999 + + if (dt_obs == 6) then ! subdaily obs + if (date_time_low_hour < 3.0 .and. date_time_up_hour >= 3.0) then + obs_hour = 3 + elseif (date_time_low_hour < 9.0 .and. date_time_up_hour >= 9.0) then + obs_hour = 9 + elseif (date_time_low_hour < 15.0 .and. date_time_up_hour >= 15.0) then + obs_hour = 15 + elseif (date_time_low_hour < 21.0 .and. date_time_up_hour >= 21.0) then + obs_hour = 21 + end if + else ! daily obs + if (date_time_low_hour < 12.0 .and. date_time_up_hour >= 12.0) then + obs_hour = 12 + end if + end if + + ! return if assimilation window does not encompass any obs + + if (obs_hour < 0) return + + ! determine filename for CYGNSS obs file + + write (YYYY,'(i4.4)') date_time%year + write (MM, '(i2.2)') date_time%month + write (DD, '(i2.2)') date_time%day + write (HH, '(i2.2)') date_time%hour + write (MI, '(i2.2)') date_time%min + + ! construct the file name using hardwired name and date_time + + tmpname = 'cyg.ddmi.s'// YYYY // MM // DD //'-030000-e'// YYYY // MM // DD //'-210000.l3.grid-soil-moisture-36km.a32.d33.nc' + + tmpfname = trim(this_obs_param%path) // '/Y' // YYYY // '/M' // MM // '/' // trim(tmpname) + + if (logit) write (logunit, '(400A)') 'Reading CYGNSS soil moisture data from file: ', trim(tmpfname) + + ! check if file exists + + inquire(file=tmpfname, exist=file_exists) + + if (.not. file_exists) then + err_msg = 'CYGNSS SM obs file not found!' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + + ! open the NetCDF observation file + ierr = nf90_open(trim(tmpfname), nf90_nowrite, ncid) + + ! get variable dimension IDs + ierr = nf90_inq_dimid(ncid, 'lon', lon_dimid) + ierr = nf90_inq_dimid(ncid, 'lat', lat_dimid) + ierr = nf90_inq_dimid(ncid, 'time', time_dimid) + ierr = nf90_inq_dimid(ncid, 'timeslices', timeslices_dimid) + ierr = nf90_inq_dimid(ncid, 'startstop', startstop_dimid) + + ! dimensions sizes + ierr = nf90_inquire_dimension(ncid, lon_dimid, len=N_lon) + ierr = nf90_inquire_dimension(ncid, lat_dimid, len=N_lat) + ierr = nf90_inquire_dimension(ncid, time_dimid, len=N_time) + ierr = nf90_inquire_dimension(ncid, timeslices_dimid, len=N_timeslices) + ierr = nf90_inquire_dimension(ncid, startstop_dimid, len=N_startstop) + + ! get variable IDs + ierr = nf90_inq_varid(ncid, 'SM_daily', sm_d_varid) + ierr = nf90_inq_varid(ncid, 'SM_subdaily', sm_subd_varid) + ierr = nf90_inq_varid(ncid, 'SIGMA_daily', sigma_d_varid) + ierr = nf90_inq_varid(ncid, 'SIGMA_subdaily', sigma_subd_varid) + ierr = nf90_inq_varid(ncid, 'timeintervals', timeintervals_varid) + ierr = nf90_inq_varid(ncid, 'latitude', lat_varid) + ierr = nf90_inq_varid(ncid, 'longitude', lon_varid) + + ! allocate memory for universal variables + allocate(timeintervals(N_startstop, N_timeslices )) + allocate(latitudes( N_lon, N_lat )) + allocate(longitudes( N_lon, N_lat )) + allocate(tmp_sm( N_lon, N_lat )) + allocate(tmp_sigma( N_lon, N_lat )) + + ! define the count array for the NetCDF read operations + count = (/ N_lon, N_lat, 1 /) + + ! read the variables + ierr = nf90_get_var(ncid, timeintervals_varid, timeintervals) + ierr = nf90_get_var(ncid, lat_varid, latitudes) + ierr = nf90_get_var(ncid, lon_varid, longitudes) + + idx = -1 + + ! read either subdaily or daily soil moisture and sigma variables + + if (dt_obs == 6) then + do i = 1, N_timeslices + if ((obs_hour == 3 .and. (abs(timeintervals(1,i) - 0.0 ) < tolerance)) .or. & + (obs_hour == 9 .and. (abs(timeintervals(1,i) - 0.25) < tolerance)) .or. & + (obs_hour == 15 .and. (abs(timeintervals(1,i) - 0.5 ) < tolerance)) .or. & + (obs_hour == 21 .and. (abs(timeintervals(1,i) - 0.75) < tolerance)) ) then + idx = i + exit + end if + end do + + if (idx == -1) then + write(err_msg, '(A,I2)') 'Error: No matching time interval found for obs_hour = ', obs_hour + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + endif + + start = (/ 1, 1, idx /) + ierr = nf90_get_var(ncid, sm_subd_varid, tmp_sm, start=start, count=count) + ierr = nf90_get_var(ncid, sigma_subd_varid, tmp_sigma, start=start, count=count) + + else ! daily obs + + start = (/ 1, 1, 1 /) + ierr = nf90_get_var(ncid, sm_d_varid, tmp_sm, start=start, count=count) + ierr = nf90_get_var(ncid, sigma_d_varid, tmp_sigma, start=start, count=count) + + endif + + ! close the obs file + ierr = nf90_close(ncid) + + ! get name for CYGNSS mask file + + tmpmaskname = trim(this_obs_param%maskpath) // '/' // trim(this_obs_param%maskname) // '.nc' + + inquire(file=tmpfname, exist=file_exists) + + if (.not. file_exists) then + err_msg = 'CYGNSS mask file not found!' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + + ! open the CYGNSS mask file + + ierr = nf90_open(trim(tmpmaskname), nf90_nowrite, ncid) + + ! get variable dimension IDs + ierr = nf90_inq_dimid(ncid, 'lon', lon_dimid) + ierr = nf90_inq_dimid(ncid, 'lat', lat_dimid) + + ! dimensions sizes + ierr = nf90_inquire_dimension(ncid, lon_dimid, len=N_lon_m) + ierr = nf90_inquire_dimension(ncid, lat_dimid, len=N_lat_m) + + ! get variable IDs + ierr = nf90_inq_varid(ncid, 'longitude', longitudes_m_varid) + ierr = nf90_inq_varid(ncid, 'latitude', latitudes_m_varid) + ierr = nf90_inq_varid(ncid, 'flag_small_SM_range', small_SM_range_varid) + ierr = nf90_inq_varid(ncid, 'flag_poor_SMAP', poor_SMAP_varid) + ierr = nf90_inq_varid(ncid, 'flag_high_ubrmsd', high_ubrmsd_varid) + ierr = nf90_inq_varid(ncid, 'flag_few_obs', few_obs_varid) + ierr = nf90_inq_varid(ncid, 'flag_low_signal', low_signal_varid) + + ! allocate memory for the variables + allocate(latitudes_m( N_lon_m, N_lat_m)) + allocate(longitudes_m( N_lon_m, N_lat_m)) + allocate(small_SM_range_flag(N_lon_m, N_lat_m)) + allocate(poor_SMAP_flag( N_lon_m, N_lat_m)) + allocate(high_ubrmsd_flag( N_lon_m, N_lat_m)) + allocate(few_obs_flag( N_lon_m, N_lat_m)) + allocate(low_signal_flag( N_lon_m, N_lat_m)) + + ! read the variables + ierr = nf90_get_var(ncid, latitudes_m_varid, latitudes_m) + ierr = nf90_get_var(ncid, longitudes_m_varid, longitudes_m) + ierr = nf90_get_var(ncid, small_SM_range_varid, small_SM_range_flag) + ierr = nf90_get_var(ncid, poor_SMAP_varid, poor_SMAP_flag) + ierr = nf90_get_var(ncid, high_ubrmsd_varid, high_ubrmsd_flag) + ierr = nf90_get_var(ncid, few_obs_varid, few_obs_flag) + ierr = nf90_get_var(ncid, low_signal_varid, low_signal_flag) + + ! close the mask file + ierr = nf90_close(ncid) + + ! check the obs data and mask data are the same resolution + if (N_lon /= N_lon_m .or. N_lat /= N_lat_m) then + err_msg = 'The mask file ' // trim(this_obs_param%maskname) // ' does not match the obs resolution' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + + good_flag_value = 255 ! should really be 0 but is 255 because of unsigned v. signed byte issues + + ! fill tmp arrays + N_obs = 0 + + do i = 1, N_lon + do j = 1, N_lat + if (tmp_sm(i,j) .ne. this_obs_param%nodata .and. & + small_SM_range_flag(i,j) == good_flag_value .and. & + poor_SMAP_flag(i,j) == good_flag_value .and. & + high_ubrmsd_flag(i,j) == good_flag_value .and. & + few_obs_flag(i,j) == good_flag_value .and. & + low_signal_flag(i,j) == good_flag_value ) then + + ! valid observation + N_obs = N_obs + 1 + if (N_obs > max_obs) then + err_msg = 'Attempting to read too many obs - how long is your assimilation window?' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + tmp1_lon( N_obs) = longitudes(i,j) + tmp1_lat( N_obs) = latitudes( i,j) + tmp1_obs( N_obs) = tmp_sm( i,j) + tmp1_err( N_obs) = tmp_sigma( i,j) + tmp1_jtime(N_obs) = datetime_to_J2000seconds( date_time, J2000_epoch_id ) + end if + end do + end do + + if (logit) then + + write (logunit,*) 'read_obs_sm_CYGNSS: read ', N_obs, ' at date_time = ', date_time, ' from: ', tmpfname + write (logunit,*) '----------' + write (logunit,*) 'max(obs)=',maxval(tmp1_obs(1:N_obs)), ', min(obs)=',minval(tmp1_obs(1:N_obs)), & + ', avg(obs)=',sum(tmp1_obs(1:N_obs))/N_obs + + end if + + allocate(tmp_lon( N_obs)) + allocate(tmp_lat( N_obs)) + allocate(tmp_obs( N_obs)) + allocate(tmp_err( N_obs)) + allocate(tmp_jtime(N_obs)) + + tmp_lon = tmp1_lon( 1:N_obs) + tmp_lat = tmp1_lat( 1:N_obs) + tmp_obs = tmp1_obs( 1:N_obs) + tmp_err = tmp1_err( 1:N_obs) + tmp_jtime = tmp1_jtime(1:N_obs) + ! ---------------------------------------------------------------- + ! + ! for each observation + ! a) determine grid cell that contains lat/lon + ! b) determine tile within grid cell that contains lat/lon + + if (N_obs>0) then + + allocate(tmp_tile_num(N_obs)) + + call get_tile_num_for_obs(N_catd, tile_coord, & + tile_grid_d, N_tile_in_cell_ij, tile_num_in_cell_ij, & + N_obs, tmp_lat, tmp_lon, & + this_obs_param, & + tmp_tile_num ) + + ! ---------------------------------------------------------------- + ! + ! compute super-obs for each tile from all obs w/in that tile + ! (also eliminate observations that are not in domain) + + CYGNSS_sm = 0. + CYGNSS_lon = 0. + CYGNSS_lat = 0. + CYGNSS_time = 0.0D0 + + N_obs_in_tile = 0 + + do ii=1,N_obs + + ind = tmp_tile_num(ii) ! 1<=tmp_tile_num<=N_catd (unless nodata) + + if (ind>0) then ! this step eliminates obs outside domain + + CYGNSS_sm( ind) = CYGNSS_sm( ind) + tmp_obs( ii) + CYGNSS_lon( ind) = CYGNSS_lon( ind) + tmp_lon( ii) + CYGNSS_lat( ind) = CYGNSS_lat( ind) + tmp_lat( ii) + CYGNSS_time(ind) = tmp_jtime(ii) ! time is the same for all observations + + N_obs_in_tile(ind) = N_obs_in_tile(ind) + 1 + + end if + + end do + + ! normalize and set obs error std-dev + + do ii=1,N_catd + + ! set observation error standard deviation + + CYGNSS_sm_std(ii) = this_obs_param%errstd ! volumetric units (m3 m-3) + + ! normalize + + if (N_obs_in_tile(ii)>1) then + + CYGNSS_sm( ii) = CYGNSS_sm( ii)/real(N_obs_in_tile(ii)) + CYGNSS_lon( ii) = CYGNSS_lon( ii)/real(N_obs_in_tile(ii)) + CYGNSS_lat( ii) = CYGNSS_lat( ii)/real(N_obs_in_tile(ii)) + + elseif (N_obs_in_tile(ii)==0) then + + CYGNSS_sm( ii) = this_obs_param%nodata + CYGNSS_lon( ii) = this_obs_param%nodata + CYGNSS_lat( ii) = this_obs_param%nodata + CYGNSS_time( ii) = real(this_obs_param%nodata,kind(0.0D0)) + CYGNSS_sm_std(ii) = this_obs_param%nodata + + else + + ! nothing to do if N_obs_in_tile(ii)==1 (and assuming N_obs_in_tile is never negative) + + end if + + end do + + ! clean up + + if (associated(tmp_tile_num)) deallocate(tmp_tile_num) + + if (any(N_obs_in_tile>0)) then + + found_obs = .true. + + else + + found_obs = .false. + + end if + + end if + + ! clean up + + deallocate(timeintervals) + deallocate(latitudes) + deallocate(longitudes) + deallocate(tmp_sm) + deallocate(tmp_sigma) + deallocate(latitudes_m) + deallocate(longitudes_m) + deallocate(small_SM_range_flag) + deallocate(poor_SMAP_flag) + deallocate(high_ubrmsd_flag) + deallocate(few_obs_flag) + deallocate(low_signal_flag) + + if (associated(tmp_obs)) deallocate(tmp_obs) + if (associated(tmp_lon)) deallocate(tmp_lon) + if (associated(tmp_lat)) deallocate(tmp_lat) + if (associated(tmp_jtime)) deallocate(tmp_jtime) + + end subroutine read_obs_sm_CYGNSS + ! *************************************************************************** subroutine read_sm_ASCAT_bin( & @@ -2272,7 +2836,6 @@ subroutine read_sm_ASCAT_bin( & end subroutine read_sm_ASCAT_bin - ! ***************************************************************** subroutine read_obs_LaRC_Tskin( & @@ -4430,6 +4993,7 @@ subroutine read_obs_SMOS( date_time, N_catd, this_obs_param, & real :: tmpreal, Tb_std_max type(date_time_type) :: date_time_low, date_time_upp + type(date_time_type) :: date_time_obs_beg character( 2) :: MM, DD, HH, MI, orbit_tag character( 4) :: YYYY @@ -4462,6 +5026,17 @@ subroutine read_obs_SMOS( date_time, N_catd, this_obs_param, & found_obs = .false. + ! determine operating time range of sensor + + date_time_obs_beg = date_time_type(2010, 5,24, 0, 0, 0,-9999,-9999) + + ! return if date_time falls outside operating time range + + if (datetime_lt_refdatetime(date_time, date_time_obs_beg)) return + + ! ------------------------------ + + ! read soil moisture or brightness temperature files? if (index(this_obs_param%descr,'_SM') /= 0) then @@ -5189,6 +5764,7 @@ subroutine read_obs_MODIS_SCF( & type(date_time_type) :: date_time_beg, date_time_end type(date_time_type) :: date_time_beg_MODIS, date_time_end_MODIS + type(date_time_type) :: date_time_obs_beg real :: lon_beg, lon_end real :: lon_beg_MODIS, lon_end_MODIS @@ -5210,7 +5786,28 @@ subroutine read_obs_MODIS_SCF( & character(len=*), parameter :: Iam = 'read_obs_MODIS_SCF' character(len=400) :: err_msg - + + ! ------------------------------------------------------------------------------------ + ! + ! initialize + + found_obs = .false. + + ! determine operating time range of sensor + + if (trim(this_obs_param%descr) == 'MOD10C1') then + date_time_obs_beg = date_time_type(2000, 2,24, 1,31, 0,-9999,-9999) ! Terra + elseif (trim(this_obs_param%descr) == 'MYD10C1') then + date_time_obs_beg = date_time_type(2002, 7, 4, 8, 0, 0,-9999,-9999) ! Aqua + else + err_msg = 'Unknown obs_param%descr: ' // trim(this_obs_param%descr) + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + end if + + ! return if date_time falls outside operating time range + + if (datetime_lt_refdatetime(date_time, date_time_obs_beg)) return + ! ---------------------------------------------------------------------------------- ! ! restrict assimilation time step to max allowed @@ -5222,12 +5819,6 @@ subroutine read_obs_MODIS_SCF( & end if - - ! initialize - - found_obs = .false. - - ! identify MODIS product and overpass hour MODIS_product_ID = this_obs_param%name(1:7) @@ -6132,7 +6723,7 @@ subroutine read_obs_SMAP_FT( date_time, N_catd, this_obs_param, & character(100) :: dset_name_lon, dset_name_lat character(100) :: dset_name_time, dset_name_ft, dset_name_ft_qual_flag - character(100), dimension(2*N_halforbits_max) :: fname_list ! max 2 days of files + character(200), dimension(2*N_halforbits_max) :: fname_list ! max 2 days of files integer, dimension(7) :: dset_size integer, dimension(N_fnames_max) :: N_obs_kept @@ -6814,6 +7405,7 @@ subroutine read_obs_SMAP_halforbit_Tb( date_time, N_catd, this_obs_param, & type(date_time_type) :: date_time_low, date_time_upp type(date_time_type) :: date_time_low_fname, date_time_tmp + type(date_time_type) :: date_time_obs_beg integer :: ii, jj, kk, nn, mm integer :: N_fnames, N_fnames_tmp, N_obs_tmp @@ -6839,7 +7431,7 @@ subroutine read_obs_SMAP_halforbit_Tb( date_time, N_catd, this_obs_param, & character(100) :: dset_name_time_1, dset_name_tb_1, dset_name_tb_qual_flag_1 character(100) :: dset_name_time_2, dset_name_tb_2, dset_name_tb_qual_flag_2 - character(100), dimension(2*N_halforbits_max) :: fname_list ! max 2 days of files + character(200), dimension(2*N_halforbits_max) :: fname_list ! max 2 days of files integer, dimension(7) :: dset_size integer, dimension(N_fnames_max) :: N_obs_kept @@ -6865,6 +7457,20 @@ subroutine read_obs_SMAP_halforbit_Tb( date_time, N_catd, this_obs_param, & ! ------------------------------------------------------------------- + ! initialize + + found_obs = .false. + + ! determine operating time range of sensor + + date_time_obs_beg = date_time_type(2015, 3,31, 0, 0, 0,-9999,-9999) + + ! return if date_time falls outside operating time range + + if (datetime_lt_refdatetime(date_time, date_time_obs_beg)) return + + ! ---------------- + ! check inputs ! the subroutine makes sense only if dtstep_assim <= 3 hours @@ -6878,9 +7484,6 @@ subroutine read_obs_SMAP_halforbit_Tb( date_time, N_catd, this_obs_param, & call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) end if - ! initialize - - found_obs = .false. ! read Tbs from L1C_TB, L1C_TB_E, or L2_SM_AP files? @@ -8167,7 +8770,7 @@ subroutine read_obs_fnames( date_time, this_obs_param, & integer, intent(out) :: N_fnames - character(100), dimension(N_max), intent(out) :: fname_list + character(200), dimension(N_max), intent(out) :: fname_list integer, optional, intent(in) :: obs_dir_hier @@ -8176,7 +8779,7 @@ subroutine read_obs_fnames( date_time, this_obs_param, & character(300) :: fname character(200) :: fpath_tmp character( 80) :: fname_tmp - character( 80) :: tmpstr80 + character(200) :: tmpstr200 character( 14) :: YYYYMMDDdir character( 10) :: YYYYMMdir @@ -8225,7 +8828,7 @@ subroutine read_obs_fnames( date_time, this_obs_param, & do while (istat==0) - read(10,*,iostat=istat) tmpstr80 + read(10, '(A)',iostat=istat) tmpstr200 if (istat==0) then @@ -8238,7 +8841,7 @@ subroutine read_obs_fnames( date_time, this_obs_param, & ! preface file names with "Yyyyy/Mmm/Ddd" (default) - fname_list(ii) = YYYYMMDDdir // trim(tmpstr80) + fname_list(ii) = YYYYMMDDdir // trim(tmpstr200) if (present(obs_dir_hier)) then @@ -8246,7 +8849,7 @@ subroutine read_obs_fnames( date_time, this_obs_param, & ! preface file names with "Yyyyy/Mmm" - fname_list(ii) = YYYYMMdir // trim(tmpstr80) + fname_list(ii) = YYYYMMdir // trim(tmpstr200) else @@ -8495,46 +9098,67 @@ subroutine read_obs( & case ('ASCAT_SM_A', 'ASCAT_SM_D' ) - - call read_obs_sm_ASCAT( & - work_path, exp_id, & - date_time, dtstep_assim, N_catd, tile_coord, & - tile_grid_d, N_tile_in_cell_ij, tile_num_in_cell_ij, & - this_obs_param, & - found_obs, tmp_obs, tmp_std_obs ) - - ! scale observations to model climatology - - if (this_obs_param%scale .and. found_obs) then - - scaled_obs = .true. - - call scale_obs_sfmc_cdf( N_catd, tile_coord, this_obs_param, & - tmp_obs, tmp_std_obs ) - - end if - + + call read_obs_sm_ASCAT( & + work_path, exp_id, & + date_time, dtstep_assim, N_catd, tile_coord, & + tile_grid_d, N_tile_in_cell_ij, tile_num_in_cell_ij, & + this_obs_param, & + found_obs, tmp_obs, tmp_std_obs ) + + ! scale observations to model climatology + + if (this_obs_param%scale .and. found_obs) then + + scaled_obs = .true. + + call scale_obs_sfmc_cdf( N_catd, tile_coord, this_obs_param, & + tmp_obs, tmp_std_obs ) + + end if + case ('ASCAT_META_SM','ASCAT_METB_SM','ASCAT_METC_SM' ) - - call read_obs_sm_ASCAT_EUMET( & - date_time, dtstep_assim, N_catd, tile_coord, & - tile_grid_d, N_tile_in_cell_ij, tile_num_in_cell_ij, & - this_obs_param, & - found_obs, tmp_obs, tmp_std_obs, tmp_lon, tmp_lat, & - tmp_time) - - ! scale observations to model climatology - - if (this_obs_param%scale .and. found_obs) then - - scaled_obs = .true. - - call scale_obs_sfmc_zscore( N_catd, tile_coord, & - date_time, this_obs_param, tmp_lon, tmp_lat, tmp_time, & - tmp_obs, tmp_std_obs ) - - end if - + + call read_obs_sm_ASCAT_EUMET( & + date_time, dtstep_assim, N_catd, tile_coord, & + tile_grid_d, N_tile_in_cell_ij, tile_num_in_cell_ij, & + this_obs_param, & + found_obs, tmp_obs, tmp_std_obs, tmp_lon, tmp_lat, & + tmp_time) + + ! scale observations to model climatology + + if (this_obs_param%scale .and. found_obs) then + + scaled_obs = .true. + + call scale_obs_sfmc_zscore( N_catd, tile_coord, & + date_time, this_obs_param, tmp_lon, tmp_lat, tmp_time, & + tmp_obs, tmp_std_obs ) + + end if + + case ('CYGNSS_SM_6hr','CYGNSS_SM_daily') + + call read_obs_sm_CYGNSS( & + date_time, dtstep_assim, N_catd, tile_coord, & + tile_grid_d, N_tile_in_cell_ij, tile_num_in_cell_ij, & + this_obs_param, & + found_obs, tmp_obs, tmp_std_obs, tmp_lon, tmp_lat, & + tmp_time) + + ! scale observations to model climatology + + if (this_obs_param%scale .and. found_obs) then + + scaled_obs = .true. + + call scale_obs_sfmc_zscore( N_catd, tile_coord, & + date_time, this_obs_param, tmp_lon, tmp_lat, tmp_time, & + tmp_obs, tmp_std_obs ) + + end if + case ('isccp_tskin_gswp2_v1') call read_obs_isccp_tskin_gswp2_v1( & diff --git a/GEOSlandassim_GridComp/clsm_ensupd_upd_routines.F90 b/GEOSlandassim_GridComp/clsm_ensupd_upd_routines.F90 index f05c5425..d078df46 100644 --- a/GEOSlandassim_GridComp/clsm_ensupd_upd_routines.F90 +++ b/GEOSlandassim_GridComp/clsm_ensupd_upd_routines.F90 @@ -135,6 +135,7 @@ module clsm_ensupd_upd_routines use LDAS_ExceptionsMod, ONLY: & ldas_abort, & + ldas_warn, & LDAS_GENERIC_ERROR use enkf_general, ONLY: & @@ -616,7 +617,30 @@ subroutine read_ens_upd_inputs( & end if + ! make sure only sub-daily or daily CYGNSS sm obs are assimilated + k=0 + + do i=1,N_obs_param + + if (obs_param(i)%assim) then + + select case (trim(obs_param(i)%descr)) + + case('CYGNSS_SM_daily','CYGNSS_SM_6hr'); k=k+1 + + end select + + end if + + end do + + if (k>1) then + + err_msg = 'cannot assimilate CYGNSS_SM_daily *and* CYGNSS_SM_6hr' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + + end if ! ------------------------------------------------------------- ! @@ -3478,7 +3502,8 @@ subroutine cat_enkf_increments( & integer :: n, n_e, kk, ii, jj - integer :: N_state_max, N_state, N_selected_obs, N_select_varnames, N_select_species, N_select_species_Tb + integer :: N_state_max, N_state, N_selected_obs, N_select_varnames + integer :: N_select_species, N_select_species_smTb, N_select_species_Tb, N_select_species_asnow real :: halo_minlon, halo_maxlon, halo_minlat, halo_maxlat real :: tmp_minlon, tmp_maxlon, tmp_minlat, tmp_maxlat @@ -3495,7 +3520,8 @@ subroutine cat_enkf_increments( & real, allocatable, dimension(:) :: State_lon, State_lat - integer, dimension(N_obs_param) :: select_species, select_species_Tb ! alloc max possible length + integer, dimension(N_obs_param) :: select_species ! alloc max possible length + integer, dimension(N_obs_param) :: select_species_smTb, select_species_Tb, select_species_asnow ! alloc max possible length character(40), dimension(N_obs_param) :: select_varnames ! alloc max possible length @@ -3505,6 +3531,7 @@ subroutine cat_enkf_increments( & integer, dimension(:,:,:), pointer :: tile_num_in_cell_ij => null() character(len=*), parameter :: Iam = 'cat_enkf_increments' + character(len=400) :: err_msg real, dimension( N_catd) :: r_x, tmp_dlon real :: r_y, tmp_dlat @@ -3524,6 +3551,7 @@ subroutine cat_enkf_increments( & real, dimension( N_catd) :: SWE_ensavg real, dimension( N_catd) :: tp1_ensavg real, dimension( N_catd) :: asnow_ensavg + real, dimension( N_catd) :: swe_incr_ensavg type(obs_param_type) :: this_obs_param @@ -3537,7 +3565,9 @@ subroutine cat_enkf_increments( & real, dimension(N_snow) :: tpsn, fice_snow_vec ! for snow model relayer real, dimension(N_snow,N_constit) :: rconstit - logical :: found_Tb_obs + logical :: found_Tb_obs + + ! ----------------------------------------------------------------------- @@ -3558,11 +3588,19 @@ subroutine cat_enkf_increments( & ! more initializations - N_select_varnames = 0 - N_select_species = 0 + N_select_varnames = 0 + + N_select_species = 0 + N_select_species_smTb = 0 + N_select_species_Tb = 0 + N_select_species_asnow = 0 - select_varnames = '' - select_species = -8888 ! intentionally differs from init in get_select_species() + select_varnames = '' + + select_species = -8888 ! intentionally differs from init in get_select_species() + select_species_smTb = -8888 + select_species_Tb = -8888 + select_species_asnow = -8888 ! ---------------------------------------------------------------------- ! @@ -3737,6 +3775,8 @@ subroutine cat_enkf_increments( & end do + ! ---------------------------------------------------------------------------------------------------------------------- + case (2) select_update_type ! 3d soil moisture analysis; sfmc+sfds obs ! update each tile separately using all observations within @@ -3826,7 +3866,7 @@ subroutine cat_enkf_increments( & end do - ! ---------------------------------- + ! ---------------------------------------------------------------------------------------------------------------------- case (3) select_update_type ! 1d Tskin analysis; tskin obs @@ -3897,7 +3937,7 @@ subroutine cat_enkf_increments( & end do - ! ---------------------------------- + ! ---------------------------------------------------------------------------------------------------------------------- case (4,5) select_update_type ! 1d Tskin/ght(1) analysis; tskin obs @@ -3971,7 +4011,7 @@ subroutine cat_enkf_increments( & end do - ! ---------------------------------- + ! ---------------------------------------------------------------------------------------------------------------------- case (6) select_update_type ! 1d soil moisture/Tskin/ght(1) analysis; Tb obs @@ -4050,7 +4090,7 @@ subroutine cat_enkf_increments( & end do - ! ---------------------------------- + ! ---------------------------------------------------------------------------------------------------------------------- case (7) select_update_type ! 3d Tskin/ght(1) analysis; tskin obs @@ -4141,7 +4181,7 @@ subroutine cat_enkf_increments( & end do - ! ---------------------------------- + ! ---------------------------------------------------------------------------------------------------------------------- case (8,10) select_update_type ! 3d soil moisture/Tskin/ght(1) analysis; Tb obs @@ -4299,7 +4339,7 @@ subroutine cat_enkf_increments( & end do - ! ---------------------------------- + ! ---------------------------------------------------------------------------------------------------------------------- case (9) select_update_type ! 1d Tskin/ght(1) analysis; FT obs @@ -4480,7 +4520,7 @@ subroutine cat_enkf_increments( & end do - ! ---------------------------------- + ! ---------------------------------------------------------------------------------------------------------------------- case (11) select_update_type ! 1d snow analysis (Toure et al. 2018 empirical gain); snow cover fraction obs @@ -4671,8 +4711,434 @@ subroutine cat_enkf_increments( & end do ! kk=1,N_catd - ! ---------------------------------- + ! ---------------------------------------------------------------------------------------------------------------------- + + case (12) select_update_type ! 3d soil moisture/Tskin/ght(1) analysis; Tb+sfmc+sfds obs + ! & 1d snow analysis (Toure et al. 2018 empirical gain); snow cover fraction obs + + ! update_type 12 is a combination of update_type 11 and update_type 13: + ! + ! Loop through tiles, first apply 1d snow update, then apply 3d soil moisture update. + ! + ! 1d snow analysis: + ! Update each tile separately using all observations associated with the tile. + ! Loop through ensemble members and compute analysis separately for each ensemble member. + ! + ! 3d soil moisture/Tskin/ght(1) analysis: + ! Update each tile separately using all observations within customized halo around the tile. + ! State vector of each tile depends on assimilated obs and soil type. + ! + ! obs | soil | N_state | state vector + ! ---------------------------------------------------------------------- + ! sfcm/sfds only | mineral | 2 | srfexc, rzexc + ! sfcm/sfds only | peat | 3 | srfexc, rzexc, catdef, + ! sfcm/sfds & Tb | mineral | 6 | srfexc, rzexc, tc[x], ght(1) + ! sfcm/sfds & Tb | peat | 7 | srfexc, rzexc, catdef, tc[x], ght(1) + ! + ! amfox+rreichle, Dec 2024 + ! + ! ------------------------------------------------------------------------------------------------------- + + if (logit) write (logunit, *) 'get increments: update_type = ', update_type + + ! determine species of assimilated obs associated with snow analysis + + call get_select_species(1, 'asnow', N_obs_param, obs_param, N_select_species_asnow, select_species_asnow ) + + if (N_select_species_asnow>0) then + + if (logit) write (logunit, *) '- get 1d snow increments (Toure et al. 2018 empirical gain); snow cover fraction obs' + + ! ensure that max SWE increment parameter is less than WEMIN; larger increments make no sense because + ! at SWE=WEMIN, the tile is fully snow covered (asnow=1) + + if (SCF_ANA_MAXINCRSWE>WEMIN) call ldas_abort(LDAS_GENERIC_ERROR, Iam, 'must use SCF_ANA_MAXINCRSWE<=WEMIN') + + allocate(select_tilenum(1)) + + swe_incr = 0. ! total SWE increment; initialize to NO CHANGE + swe_incr_ensavg = 0. ! total SWE ensemble average increment; initialize to NO CHANGE + + + end if + + ! determine species of assimilated obs associated with soil moisture (+Tskin/ght(1)) analysis: + + N_select_varnames = 3 + + select_varnames(1) = 'Tb' + select_varnames(2) = 'sfmc' + select_varnames(3) = 'sfds' + + call get_select_species( & + N_select_varnames, select_varnames(1:N_select_varnames), & + N_obs_param, obs_param, N_select_species_smTb, select_species_smTb ) + + ! determine which species are Tb, if any + + call get_select_species(1, 'Tb', N_obs_param, obs_param, N_select_species_Tb, select_species_Tb ) + + if ((N_select_species_smTb>0) .and. logit) & + write (logunit, *) '- get 3d soil moisture/Tskin/ght(1) increments; Tb+sfmc+sfds obs' + + ! check consistency of update_type and obs_param%assim config + + if ( N_select_species_asnow==0 .and. N_select_species_smTb==0 ) then + + err_msg = & + 'update_type not consistent with obs_param%assim==.false. for all asnow/Tb/sfmc/sfds species ' & + // '(may be intentional for "innovations" run, i.e., with obs_param%innov==.true.)' + call ldas_warn(LDAS_GENERIC_ERROR, Iam, err_msg) + + + end if + + ! allocate State_* + + N_state_max = 7 + + allocate( State_incr(N_state_max,N_ens)) + allocate( State_lon( N_state_max )) + allocate( State_lat( N_state_max )) + + ! ---------------------------------------------------- + ! + ! loop through tiles and compute increments + + do kk=1,N_catd + + if (N_select_species_asnow>0) then ! assimilate snow observations + + ! find snow observations for tile kk + + select_tilenum(1) = l2f(kk) + + call get_ind_obs( & + N_obs, Observations, & + 1, select_tilenum, & + N_select_species_asnow, & + select_species_asnow(1:N_select_species_asnow), & + N_selected_obs, ind_obs ) + + if (N_selected_obs > 0) then + + ! average in case there are multiple "asnow" obs (e.g., from MODIS and VIIRS) + + tmp_obs = sum(Observations(ind_obs(1:N_selected_obs))%obs) + + if (N_selected_obs > 1) tmp_obs = tmp_obs/real(N_selected_obs) + + do n_e=1,N_ens ! compute analysis separately for each ensemble member + + ! 1. Diagnose model forecast snow cover area fraction and total SWE + + asnow_fcst = asnow(kk,n_e) + swe_fcst = sum(cat_progn(kk,n_e)%wesn(1:N_snow)) + + ! 2. Calculate SWE increment based on modified eq 1 of Toure et al (2018) + + if (asnow_fcst .lt. tmp_obs * SCF_ANA_ALPHA) then + + ! ADD SNOW: Forecast SCF is less than observed SCF (after "bias" adjustment with alpha) + + swe_incr(kk,n_e) = SCF_ANA_MAXINCRSWE * (tmp_obs - asnow_fcst/SCF_ANA_ALPHA) + + elseif (tmp_obs .lt. SCF_ANA_BETA) then + + ! REMOVE SNOW: Simulated SCF is greater than observed SCF (after "bias" adjustment) + ! and observed SCF is less than beta threshold + + swe_incr(kk,n_e) = (-1.) * SCF_ANA_MAXINCRSWE * asnow_fcst * (1. - tmp_obs/SCF_ANA_BETA) + + else + + cycle ! NO CHANGE, skip rest of increment calcs and go straight to next ens member + + endif ! (Toure et al. 2018 Equation 1) + + ! 3. Derive SWE, snow heat content, and snow depth increments for each layer from total SWE increment + + swe_ana = max(swe_fcst + swe_incr(kk,n_e), 0.0) ! total SWE after analysis + + call StieglitzSnow_calc_asnow( swe_ana, asnow_ana ) ! asnow after analysis + + if (swe_fcst>=StieglitzSnow_MINSWE) then + swe_ratio = swe_ana / swe_fcst + else + swe_ratio = MAPL_UNDEF ! swe_ratio unreliable; set to MAPL_UNDEF to expose inadvertent use + end if + + ! loop through snow layers and compute SWE, snow heat content, and snow depth analysis for each layer + + do isnow=1,N_snow + + if (asnow_ana == 0.0) then + + ! no snow in analysis, remove all snow + + tmp_wesn(kk,n_e,isnow) = 0.0 + tmp_htsn(kk,n_e,isnow) = 0.0 + tmp_sndz(kk,n_e,isnow) = 0.0 + + elseif (swe_fcst < StieglitzSnow_MINSWE) then + + ! too little snow in forecast, use generic properties for added snow + + tmp_wesn(kk,n_e,isnow) = swe_ana / N_snow ! distribute SWE evenly across layers + + ! assign heat content for snow at 0 deg C and without liquid water content (100% frozen) + ! (based on StieglitzSnow: htsn = (CPW*tsnow - fice*MAPL_ALHF)*swe ) + + tmp_htsn(kk,n_e,isnow) = (0.0 - MAPL_ALHF)*tmp_wesn(kk,n_e,isnow) + + ! assign snow depth consistent with density of freshly fallen snow (must have SCF_ANA_MAXINCRSWE<=WEMIN) + + tmp_sndz(kk,n_e,isnow) = (WEMIN / RHOFS) / N_snow + + else + + ! snow in forecast and analysis, derive properties of analysis snow from properties of forecast snow + + ! update SWE: + + tmp_wesn(kk,n_e,isnow) = cat_progn(kk,n_e)%wesn(isnow) * swe_ratio + + ! update snow heat content (keep snow temperature constant): + + call StieglitzSnow_calc_tpsnow( cat_progn(kk,n_e)%htsn(isnow), cat_progn(kk,n_e)%wesn(isnow), & + snow_temp, fice_snow, log_dum, log_dum2, .false. ) + + tmp_htsn(kk,n_e,isnow) = (StieglitzSnow_CPW*snow_temp - fice_snow*MAPL_ALHF)*tmp_wesn(kk,n_e,isnow) + + ! update snow depth: + + if (asnow_ana < 1. .and. asnow_fcst < 1.) then + + ! keep snow depth constant when less than full snow cover in fcst and ana + + tmp_sndz(kk,n_e,isnow) = cat_progn(kk,n_e)%sndz(isnow) + + else + + ! compute analysis snow depth by keeping snow density constant + ! + ! in this case, it is possible that either asnow_fcst<1 or asnow_ana<1; + ! when computing density or depth, make sure that SWE value (which is per unit area) is + ! adjusted to reflect SWE value (per unit area) in the snow-covered fraction of the tile + + ! i) diagnose (layer-specific) forecast snow density + + snow_dens = ( cat_progn(kk,n_e)%wesn(isnow)/asnow_fcst ) / cat_progn(kk,n_e)%sndz(isnow) + + ! ii) diagnose analysis snow depth using forecast density + + tmp_sndz(kk,n_e,isnow) = ( tmp_wesn(kk,n_e,isnow)/asnow_ana ) / snow_dens + + end if + + end if + + end do ! isnow=1,N_snow (compute SWE, snow heat content, and snow depth analysis for each layer) + + ! 4. Relayer to balance the snow column (call with optional args for adjustment of htsnn) + + call StieglitzSnow_relayer( N_snow, N_constit, & + MAPL_LAND, CATCH_SNOW_DZPARAM, & + tmp_htsn(kk,n_e,1:N_snow), & + tmp_wesn(kk,n_e,1:N_snow), & + tmp_sndz(kk,n_e,1:N_snow), & + rconstit, tpsn, fice_snow_vec ) + + ! print the old and new swe, heat content and snow density + + !if (logit) write (logunit, *) & + ! 'fcst_wesn = ', cat_progn(kk, n_e)%wesn(1:N_snow), & + ! 'tmp_wesn = ', tmp_wesn( kk,n_e, 1:N_snow), & + ! 'fcst_htsn = ', cat_progn(kk, n_e)%htsn(1:N_snow), & + ! 'tmp_htsn = ', tmp_htsn( kk, n_e, 1:N_snow), & + ! 'fcst_sndz = ', cat_progn(kk, n_e)%sndz(1:N_snow), & + ! 'tmp_sndz = ', tmp_sndz( kk ,n_e, 1:N_snow), & + ! '--------------------------------------' + + ! 5. Diagnose increments + + cat_progn_incr(kk,n_e)%wesn(1:N_snow) = tmp_wesn(kk,n_e,1:N_snow) - cat_progn(kk,n_e)%wesn(1:N_snow) + cat_progn_incr(kk,n_e)%htsn(1:N_snow) = tmp_htsn(kk,n_e,1:N_snow) - cat_progn(kk,n_e)%htsn(1:N_snow) + cat_progn_incr(kk,n_e)%sndz(1:N_snow) = tmp_sndz(kk,n_e,1:N_snow) - cat_progn(kk,n_e)%sndz(1:N_snow) + + end do ! n_e=1,N_ens + + end if ! if (N_selected_obs > 0) + + end if ! if (N_select_species_asnow>0) [assimilate snow observations for tile kk] + + ! Calculate swe_incr_ensavg as the average of the ensemble members to add to check if tile is snow-free + + swe_incr_ensavg(kk) = sum((swe_incr(kk,:))) / real(N_ens) + + ! ------------------------------------------------------------------------------------------ + + if (N_select_species_smTb>0) then ! assimilate soil moisture observations + + N_state = 2 ! initialize (always have srfexc and rzexc in state vector) + + ! compute increments only for snow-free and non-frozen tiles + + if ( (SWE_ensavg(kk) < SWE_threshold) .and. & + (swe_incr_ensavg(kk) < SWE_threshold) .and. & + (tp1_ensavg(kk) > tp1_threshold) ) then + + ! find observations within halo around tile kk + + halo_minlon = tile_coord(kk)%com_lon - xcompact + halo_maxlon = tile_coord(kk)%com_lon + xcompact + halo_minlat = tile_coord(kk)%com_lat - ycompact + halo_maxlat = tile_coord(kk)%com_lat + ycompact + + ! simple approach to dateline issue (cut halo back to at most -180:180, -90:90) + ! - reichle, 28 May 2013 + + halo_minlon = max(halo_minlon,-180.) + halo_maxlon = min(halo_maxlon, 180.) + halo_minlat = max(halo_minlat, -90.) + halo_maxlat = min(halo_maxlat, 90.) + + call get_ind_obs_lat_lon_box( & + N_obs, Observations, & + halo_minlon, halo_maxlon, halo_minlat, halo_maxlat, & + N_select_species_smTb, select_species_smTb(1:N_select_species_smTb), & + N_selected_obs, ind_obs ) + + if (N_selected_obs>0) then + + ! Determine if Tb observations are present + + found_Tb_obs = .false. + + do ii = 1,N_select_species_Tb + do jj = 1,N_selected_obs + if (select_species_Tb(ii) == Observations(ind_obs(jj))%species) then + found_Tb_obs = .true. + exit + end if + end do + if (found_Tb_obs) exit + end do + + ! if Tb_obs are present, add tc[X] and ght(1) to state vector + + if (found_Tb_obs) N_state = N_state + 4 + + ! for peatland tile, add catdef to state vector + + if (cat_param(kk)%poros>=PEATCLSM_POROS_THRESHOLD) N_state = N_state + 1 + + ! assemble State_minus + ! (on input, cat_progn contains cat_progn_minus) + + if ( N_state==2 ) then + + State_incr(1,:) = cat_progn( kk,:)%srfexc/scale_srfexc + State_incr(2,:) = cat_progn( kk,:)%rzexc /scale_rzexc + + elseif ( N_state==3 ) then + + State_incr(1,:) = cat_progn( kk,:)%srfexc/scale_srfexc + State_incr(2,:) = cat_progn( kk,:)%rzexc /scale_rzexc + State_incr(3,:) = cat_progn( kk,:)%catdef/scale_catdef ! catdef in State + + elseif ( N_state==6 ) then + + State_incr(1,:) = cat_progn( kk,:)%srfexc/scale_srfexc + State_incr(2,:) = cat_progn( kk,:)%rzexc /scale_rzexc + + State_incr(3,:) = cat_progn( kk,:)%tc1 /scale_temp + State_incr(4,:) = cat_progn( kk,:)%tc2 /scale_temp + State_incr(5,:) = cat_progn( kk,:)%tc4 /scale_temp + State_incr(6,:) = cat_progn( kk,:)%ght(1)/scale_ght1 + + else + + State_incr(1,:) = cat_progn( kk,:)%srfexc/scale_srfexc + State_incr(2,:) = cat_progn( kk,:)%rzexc /scale_rzexc + State_incr(3,:) = cat_progn( kk,:)%catdef/scale_catdef ! catdef in State + + State_incr(4,:) = cat_progn( kk,:)%tc1 /scale_temp + State_incr(5,:) = cat_progn( kk,:)%tc2 /scale_temp + State_incr(6,:) = cat_progn( kk,:)%tc4 /scale_temp + State_incr(7,:) = cat_progn( kk,:)%ght(1)/scale_ght1 + + end if + + State_lon( :) = tile_coord(kk )%com_lon + State_lat( :) = tile_coord(kk )%com_lat + + allocate(Obs_cov(N_selected_obs,N_selected_obs)) + + call assemble_obs_cov( N_selected_obs, N_obs_param, obs_param, & + Observations(ind_obs(1:N_selected_obs)), Obs_cov ) + + call enkf_increments( & + N_state, N_selected_obs, N_ens, & + Observations(ind_obs(1:N_selected_obs)), & + Obs_pred(ind_obs(1:N_selected_obs),:), & + Obs_pert(ind_obs(1:N_selected_obs),:), & + Obs_cov, & + State_incr(1:N_state,:), & + State_lon( 1:N_state ), & + State_lat( 1:N_state ), & + xcompact, ycompact, & + fcsterr_inflation_fac ) + + deallocate(Obs_cov) + + ! assemble cat_progn increments + + if ( N_state==2 ) then + + cat_progn_incr(kk,:)%srfexc = State_incr(1,:)*scale_srfexc + cat_progn_incr(kk,:)%rzexc = State_incr(2,:)*scale_rzexc + + elseif ( N_state==3 ) then + + cat_progn_incr(kk,:)%srfexc = State_incr(1,:)*scale_srfexc + cat_progn_incr(kk,:)%rzexc = State_incr(2,:)*scale_rzexc + cat_progn_incr(kk,:)%catdef = State_incr(3,:)*scale_catdef ! catdef in State + + elseif ( N_state==6 ) then + + cat_progn_incr(kk,:)%srfexc = State_incr(1,:)*scale_srfexc + cat_progn_incr(kk,:)%rzexc = State_incr(2,:)*scale_rzexc + + cat_progn_incr(kk,:)%tc1 = State_incr(3,:)*scale_temp + cat_progn_incr(kk,:)%tc2 = State_incr(4,:)*scale_temp + cat_progn_incr(kk,:)%tc4 = State_incr(5,:)*scale_temp + cat_progn_incr(kk,:)%ght(1) = State_incr(6,:)*scale_ght1 + + else + + cat_progn_incr(kk,:)%srfexc = State_incr(1,:)*scale_srfexc + cat_progn_incr(kk,:)%rzexc = State_incr(2,:)*scale_rzexc + cat_progn_incr(kk,:)%catdef = State_incr(3,:)*scale_catdef ! catdef in State + + cat_progn_incr(kk,:)%tc1 = State_incr(4,:)*scale_temp + cat_progn_incr(kk,:)%tc2 = State_incr(5,:)*scale_temp + cat_progn_incr(kk,:)%tc4 = State_incr(6,:)*scale_temp + cat_progn_incr(kk,:)%ght(1) = State_incr(7,:)*scale_ght1 + + end if + + end if ! if (N_selected_obs > 0) + + end if ! thresholds + + end if ! if (N_select_species_smTb>0) [assimilate soil moisture observations for tile kk] + + end do ! kk=1,N_catd + + ! ---------------------------------------------------------------------------------------------------------------------- + case (13) select_update_type ! 3d soil moisture/Tskin/ght(1) analysis; Tb+sfmc+sfds obs ! update each tile separately using all observations within customized halo around each tile @@ -4688,35 +5154,15 @@ subroutine cat_enkf_increments( & ! ! amfox+rreichle, 26 Feb 2024 - if (logit) write (logunit,*) 'get 3d soil moisture/Tskin/ght(1) increments; Tb+sfmc obs' - - N_select_varnames = 0 + if (logit) write (logunit,*) 'get 3d soil moisture/Tskin/ght(1) increments; Tb+sfmc+sfds obs' - do ii = 1,N_obs_param - if (trim(obs_param(ii)%varname) == 'Tb') then - N_select_varnames = N_select_varnames + 1 - select_varnames(N_select_varnames) = 'Tb' - exit - end if - end do - - do ii = 1,N_obs_param - if (trim(obs_param(ii)%varname) == 'sfmc') then - N_select_varnames = N_select_varnames + 1 - select_varnames(N_select_varnames) = 'sfmc' - exit - end if - end do + ! Get all species associated with *assimilated* Tb, sfmc, and sfds observations - do ii = 1,N_obs_param - if (trim(obs_param(ii)%varname) == 'sfds') then - N_select_varnames = N_select_varnames + 1 - select_varnames(N_select_varnames) = 'sfds' - exit - end if - end do + N_select_varnames = 3 - ! Will get all species associated with Tb or sfds observations + select_varnames(1) = 'Tb' + select_varnames(2) = 'sfmc' + select_varnames(3) = 'sfds' call get_select_species( & N_select_varnames, select_varnames(1:N_select_varnames), & @@ -4885,9 +5331,9 @@ subroutine cat_enkf_increments( & end if ! thresholds - end do + end do ! kk=1,N_catd - ! ---------------------------------- + ! ---------------------------------------------------------------------------------------------------------------------- case default @@ -4919,9 +5365,18 @@ subroutine get_select_species( & N_select_varnames, select_varnames, N_obs_param, obs_param, & N_select_species, select_species ) - ! find out obs species ID numbers ("obs_param%species") that correspond - ! to a set of obs species variables names ("obs_param%varname") - ! - reichle, 16 Oct 2014 + ! find out obs species ID numbers ("obs_param%species") that correspond to a set of + ! obs variables names ("obs_param%varname") with obs_param(species)%assim==.true. + + ! original version -- reichle, 16 Oct 2014 + ! + ! added constraint obs_param%assim==.true. + ! --> excludes obs species that are categorically not assimilated (per obs_param); + ! before this change, this constraint was applied at a later stage of + ! selecting the assimilated obs; + ! with this change, N_select_species==0 can be used to check if + ! any obs with select_varnames are assimilated. + ! -reichle, 29 Nov 2024 implicit none @@ -4951,7 +5406,7 @@ subroutine get_select_species( & do ii=1,N_obs_param - if (any(trim(obs_param(ii)%varname)==select_varnames)) then + if ( any(trim(obs_param(ii)%varname)==select_varnames) .and. obs_param(ii)%assim ) then kk = kk+1 @@ -5012,9 +5467,7 @@ subroutine get_ind_obs( & ! locals integer :: i, k - - - + ! -------------------------------------------------------------- if (N_select_species==0 .and. N_select_tilenum==0) then @@ -5085,7 +5538,7 @@ end subroutine get_ind_obs ! ********************************************************************** - + subroutine get_ind_obs_assim( N_obs, assim_flag, N_obs_assim, ind_obs_assim ) ! loop through Observations%assim and construct an index vector that maps to @@ -5459,7 +5912,7 @@ subroutine check_compact_support( & Iam // '(): reset for 1d update_type: ycompact = ', ycompact if (logit) write (logunit,*) - case (2,7,8,10,13) ! "3d" updates, check consistency of xcompact, ycompact + case (2,7,8,10,12,13) ! "3d" updates, check consistency of xcompact, ycompact ! check xcompact/ycompact against corr scales of model error diff --git a/GEOSldas_App/GEOSldas_HIST.rc b/GEOSldas_App/GEOSldas_HIST.rc index adb52654..ce692ffb 100644 --- a/GEOSldas_App/GEOSldas_HIST.rc +++ b/GEOSldas_App/GEOSldas_HIST.rc @@ -23,9 +23,12 @@ COLLECTIONS: # 'catch_progn_incr' # 'inst3_1d_lndfcstana_Nt' # 'inst3_2d_lndfcstana_Nx' +# 'const_1d_lnd_Nt' +# 'const_2d_lnd_Nx' :: #CUBE GRID_LABELS: PC720x361-DC +#CUBE PC1440x721-DC #CUBE :: @@ -36,6 +39,13 @@ COLLECTIONS: #CUBE PC720x361-DC.DATELINE: DC #CUBE PC720x361-DC.LM: 1 +#CUBE PC1440x721-DC.GRID_TYPE: LatLon +#CUBE PC1440x721-DC.IM_WORLD: 1440 +#CUBE PC1440x721-DC.JM_WORLD: 721 +#CUBE PC1440x721-DC.POLE: PC +#CUBE PC1440x721-DC.DATELINE: DC +#CUBE PC1440x721-DC.LM: 1 + # Detailed definition of the collections listed above # # Bit shaving: Retain only scientifically meaningful precision and modify meaningless @@ -112,41 +122,42 @@ COLLECTIONS: tavg24_1d_lnd_Nt.mode: 'time-averaged', tavg24_1d_lnd_Nt.frequency: 240000, tavg24_1d_lnd_Nt.ref_time: 000000, - tavg24_1d_lnd_Nt.fields: 'WET3' , 'GridComp' , 'GWETPROF' , + tavg24_1d_lnd_Nt.fields: 'GRN' , 'VEGDYN' , + 'LAI' , 'VEGDYN' , + 'WET3' , 'GridComp' , 'GWETPROF' , 'WET2' , 'GridComp' , 'GWETROOT' , 'WET1' , 'GridComp' , 'GWETTOP' , 'WCPR' , 'GridComp' , 'PRMC' , 'WCRZ' , 'GridComp' , 'RZMC' , 'WCSF' , 'GridComp' , 'SFMC' , - 'TPSNOW' , 'GridComp' , - 'TPUNST' , 'GridComp' , 'TUNST' , - 'TPSAT' , 'GridComp' , 'TSAT' , - 'TPWLT' , 'GridComp' , 'TWLT' , - 'TPSURF' , 'GridComp' , 'TSURF' , - 'GRN' , 'VEGDYN' , - 'LAI' , 'VEGDYN' , - 'TP1' , 'GridComp' , - 'TP2' , 'GridComp' , - 'TP3' , 'GridComp' , - 'TP4' , 'GridComp' , - 'TP5' , 'GridComp' , - 'TP6' , 'GridComp' , - 'PRLAND' , 'GridComp' , 'PRECTOTLAND' , - 'SNOLAND' , 'GridComp' , 'PRECSNOLAND' , - 'TSLAND' , 'GridComp' , 'SNOMAS' , - 'SNOWDP' , 'GridComp' , 'SNODP' , - 'EVPSOI' , 'GridComp' , 'EVPSOIL' , - 'EVPVEG' , 'GridComp' , 'EVPTRNS' , - 'EVPINT' , 'GridComp' , 'EVPINTR' , - 'EVPICE' , 'GridComp' , 'EVPSBLN' , - 'RUNSURF' , 'GridComp' , 'RUNOFF' , - 'BASEFLOW' , 'GridComp' , + 'CAPAC' , 'GridComp' , 'INTRWATR' , + 'TPSNOW' , 'GridComp' , 'TPSNOWLAND' , + 'TPUNST' , 'GridComp' , 'TUNSTLAND' , + 'TPSAT' , 'GridComp' , 'TSATLAND' , + 'TPWLT' , 'GridComp' , 'TWLTLAND' , + 'TPSURF' , 'GridComp' , 'TSURFLAND' , + 'TP1' , 'GridComp' , 'TSOIL1' , # CATCH GC: TP1, ENSAVG GC: TSOIL1TILE + 'TP2' , 'GridComp' , 'TSOIL2' , # ... + 'TP3' , 'GridComp' , 'TSOIL3' , # ... + 'TP4' , 'GridComp' , 'TSOIL4' , # ... + 'TP5' , 'GridComp' , 'TSOIL5' , # ... + 'TP6' , 'GridComp' , 'TSOIL6' , # ... + 'PRLAND' , 'GridComp' , 'PRECTOTCORRLAND' , # assume "corrected" precip + 'SNOLAND' , 'GridComp' , 'PRECSNOCORRLAND' , # assume "corrected" precip + 'TSLAND' , 'GridComp' , 'SNOMASLAND' , + 'SNOWDP' , 'GridComp' , 'SNODPLAND' , + 'EVPSOI' , 'GridComp' , 'LHLANDSOIL' , + 'EVPVEG' , 'GridComp' , 'LHLANDTRNS' , + 'EVPINT' , 'GridComp' , 'LHLANDINTR' , + 'EVPICE' , 'GridComp' , 'LHLANDSBLN' , + 'RUNSURF' , 'GridComp' , 'RUNSURFLAND' , + 'BASEFLOW' , 'GridComp' , 'BASEFLOWLAND' , 'SMLAND' , 'GridComp' , - 'QINFIL' , 'GridComp' , - 'FRUST' , 'GridComp' , 'FRUNST' , - 'FRSAT' , 'GridComp' , - 'ASNOW' , 'GridComp' , 'FRSNO' , - 'FRWLT' , 'GridComp' , + 'QINFIL' , 'GridComp' , 'QINFILLAND' , + 'FRUST' , 'GridComp' , 'FRLANDUNST' , + 'FRSAT' , 'GridComp' , 'FRLANDSAT' , + 'ASNOW' , 'GridComp' , 'FRLANDSNO' , + 'FRWLT' , 'GridComp' , 'FRLANDWLT' , 'DFPARLAND' , 'GridComp' , 'PARDFLAND' , 'DRPARLAND' , 'GridComp' , 'PARDRLAND' , 'SHLAND' , 'GridComp' , @@ -157,11 +168,12 @@ COLLECTIONS: 'GHLAND' , 'GridComp' , 'TWLAND' , 'GridComp' , 'TELAND' , 'GridComp' , - 'DWLAND' , 'GridComp' , 'WCHANGE' , - 'DHLAND' , 'GridComp' , 'ECHANGE' , - 'SPLAND' , 'GridComp' , - 'SPWATR' , 'GridComp' , - 'SPSNOW' , 'GridComp' , + 'DWLAND' , 'GridComp' , 'WCHANGELAND' , + 'DHLAND' , 'GridComp' , 'ECHANGELAND' , + 'SPLAND' , 'GridComp' , 'SPSHLAND' , +# 'SPLH' , 'GridComp' , 'SPLHLAND' , # works for Catch only, not yet for CatchCN + 'SPWATR' , 'GridComp' , 'SPEVLAND' , + 'SPSNOW' , 'GridComp' , 'SPSNLAND' , 'PEATCLSM_WATERLEVEL', 'GridComp' , 'PEATCLSM_FSWCHANGE' , 'GridComp' , >>>HIST_AEROSOL<<< 'RMELTDU001' , 'GridComp' , @@ -203,52 +215,54 @@ COLLECTIONS: >>>HIST_IRRIG<<< 'IRRIGRATE' , 'GridComp' , :: - tavg24_2d_lnd_Nx.descr: '2d,Daily,Time-Averaged,Single-Level,Assimilation,Land Surface Diagnostics', - tavg24_2d_lnd_Nx.nbits: 12, - tavg24_2d_lnd_Nx.template: '%y4%m2%d2_%h2%n2z.nc4', - tavg24_2d_lnd_Nx.mode: 'time-averaged', - tavg24_2d_lnd_Nx.frequency: 240000, - tavg24_2d_lnd_Nx.ref_time: 000000, - tavg24_2d_lnd_Nx.format: 'CFIO', - tavg24_2d_lnd_Nx.regrid_exch: '../input/tile.data' - tavg24_2d_lnd_Nx.regrid_name: 'GRIDNAME' - tavg24_2d_lnd_Nx.grid_label: PC720x361-DC - tavg24_2d_lnd_Nx.deflate: 2, - tavg24_2d_lnd_Nx.fields: 'WET3' , 'GridComp' , 'GWETPROF' , + tavg24_2d_lnd_Nx.format: 'CFIO', + tavg24_2d_lnd_Nx.descr: '2d,Daily,Time-Averaged,Single-Level,Assimilation,Land Surface Diagnostics', + tavg24_2d_lnd_Nx.nbits: 12, + tavg24_2d_lnd_Nx.template: '%y4%m2%d2_%h2%n2z.nc4', + tavg24_2d_lnd_Nx.mode: 'time-averaged', + tavg24_2d_lnd_Nx.frequency: 240000, + tavg24_2d_lnd_Nx.ref_time: 000000, + tavg24_2d_lnd_Nx.regrid_exch: '../input/tile.data' + tavg24_2d_lnd_Nx.regrid_name: 'GRIDNAME' +# tavg24_2d_lnd_Nx.regrid_method: 'BILINEAR_MONOTONIC' , + tavg24_2d_lnd_Nx.grid_label: PC720x361-DC + tavg24_2d_lnd_Nx.deflate: 2, + tavg24_2d_lnd_Nx.fields: 'GRN' , 'VEGDYN' , + 'LAI' , 'VEGDYN' , + 'WET3' , 'GridComp' , 'GWETPROF' , 'WET2' , 'GridComp' , 'GWETROOT' , 'WET1' , 'GridComp' , 'GWETTOP' , 'WCPR' , 'GridComp' , 'PRMC' , 'WCRZ' , 'GridComp' , 'RZMC' , 'WCSF' , 'GridComp' , 'SFMC' , - 'TPSNOW' , 'GridComp' , - 'TPUNST' , 'GridComp' , 'TUNST' , - 'TPSAT' , 'GridComp' , 'TSAT' , - 'TPWLT' , 'GridComp' , 'TWLT' , - 'TPSURF' , 'GridComp' , 'TSURF' , - 'GRN' , 'VEGDYN' , - 'LAI' , 'VEGDYN' , - 'TP1' , 'GridComp' , - 'TP2' , 'GridComp' , - 'TP3' , 'GridComp' , - 'TP4' , 'GridComp' , - 'TP5' , 'GridComp' , - 'TP6' , 'GridComp' , - 'PRLAND' , 'GridComp' , 'PRECTOTLAND' , - 'SNOLAND' , 'GridComp' , 'PRECSNOLAND' , - 'TSLAND' , 'GridComp' , 'SNOMAS' , - 'SNOWDP' , 'GridComp' , 'SNODP' , - 'EVPSOI' , 'GridComp' , 'EVPSOIL' , - 'EVPVEG' , 'GridComp' , 'EVPTRNS' , - 'EVPINT' , 'GridComp' , 'EVPINTR' , - 'EVPICE' , 'GridComp' , 'EVPSBLN' , - 'RUNSURF' , 'GridComp' , 'RUNOFF' , - 'BASEFLOW' , 'GridComp' , + 'CAPAC' , 'GridComp' , 'INTRWATR' , + 'TPSNOW' , 'GridComp' , 'TPSNOWLAND' , + 'TPUNST' , 'GridComp' , 'TUNSTLAND' , + 'TPSAT' , 'GridComp' , 'TSATLAND' , + 'TPWLT' , 'GridComp' , 'TWLTLAND' , + 'TPSURF' , 'GridComp' , 'TSURFLAND' , + 'TP1' , 'GridComp' , 'TSOIL1' , # CATCH GC: TP1, ENSAVG GC: TSOIL1TILE + 'TP2' , 'GridComp' , 'TSOIL2' , # ... + 'TP3' , 'GridComp' , 'TSOIL3' , # ... + 'TP4' , 'GridComp' , 'TSOIL4' , # ... + 'TP5' , 'GridComp' , 'TSOIL5' , # ... + 'TP6' , 'GridComp' , 'TSOIL6' , # ... + 'PRLAND' , 'GridComp' , 'PRECTOTCORRLAND' , # assume "corrected" precip + 'SNOLAND' , 'GridComp' , 'PRECSNOCORRLAND' , # assume "corrected" precip + 'TSLAND' , 'GridComp' , 'SNOMASLAND' , + 'SNOWDP' , 'GridComp' , 'SNODPLAND' , + 'EVPSOI' , 'GridComp' , 'LHLANDSOIL' , + 'EVPVEG' , 'GridComp' , 'LHLANDTRNS' , + 'EVPINT' , 'GridComp' , 'LHLANDINTR' , + 'EVPICE' , 'GridComp' , 'LHLANDSBLN' , + 'RUNSURF' , 'GridComp' , 'RUNSURFLAND' , + 'BASEFLOW' , 'GridComp' , 'BASEFLOWLAND' , 'SMLAND' , 'GridComp' , - 'QINFIL' , 'GridComp' , - 'FRUST' , 'GridComp' , 'FRUNST' , - 'FRSAT' , 'GridComp' , - 'ASNOW' , 'GridComp' , 'FRSNO' , - 'FRWLT' , 'GridComp' , + 'QINFIL' , 'GridComp' , 'QINFILLAND' , + 'FRUST' , 'GridComp' , 'FRLANDUNST' , + 'FRSAT' , 'GridComp' , 'FRLANDSAT' , + 'ASNOW' , 'GridComp' , 'FRLANDSNO' , + 'FRWLT' , 'GridComp' , 'FRLANDWLT' , 'DFPARLAND' , 'GridComp' , 'PARDFLAND' , 'DRPARLAND' , 'GridComp' , 'PARDRLAND' , 'SHLAND' , 'GridComp' , @@ -259,11 +273,12 @@ COLLECTIONS: 'GHLAND' , 'GridComp' , 'TWLAND' , 'GridComp' , 'TELAND' , 'GridComp' , - 'DWLAND' , 'GridComp' , 'WCHANGE' , - 'DHLAND' , 'GridComp' , 'ECHANGE' , - 'SPLAND' , 'GridComp' , - 'SPWATR' , 'GridComp' , - 'SPSNOW' , 'GridComp' , + 'DWLAND' , 'GridComp' , 'WCHANGELAND' , + 'DHLAND' , 'GridComp' , 'ECHANGELAND' , + 'SPLAND' , 'GridComp' , 'SPSHLAND' , +# 'SPLH' , 'GridComp' , 'SPLHLAND' , # works for Catch only, not yet for CatchCN + 'SPWATR' , 'GridComp' , 'SPEVLAND' , + 'SPSNOW' , 'GridComp' , 'SPSNLAND' , 'PEATCLSM_WATERLEVEL', 'GridComp' , 'PEATCLSM_FSWCHANGE' , 'GridComp' , >>>HIST_AEROSOL<<< 'RMELTDU001' , 'GridComp' , @@ -305,6 +320,58 @@ COLLECTIONS: >>>HIST_IRRIG<<< 'IRRIGRATE' , 'GridComp' , :: + + const_1d_lnd_Nt.descr: 'Tile-space,Constant,Time-invariant,Single-Level,Assimilation,Land Surface Model Parameters', + const_1d_lnd_Nt.template: '%y4%m2%d2_%h2%n2z.bin', + const_1d_lnd_Nt.mode: 'instantaneous', + const_1d_lnd_Nt.frequency: 240000, + const_1d_lnd_Nt.ref_time: 000000, + const_1d_lnd_Nt.fields: 'DZGT1' , 'GridComp' , + 'DZGT2' , 'GridComp' , + 'DZGT3' , 'GridComp' , + 'DZGT4' , 'GridComp' , + 'DZGT5' , 'GridComp' , + 'DZGT6' , 'GridComp' , + 'DZPR' , 'GridComp' , + 'DZRZ' , 'GridComp' , + 'DZSF' , 'GridComp' , + 'DZTS' , 'GridComp' , + 'WPWET' , 'GridComp' , + 'WPEMW' , 'GridComp' , + 'WPMC' , 'GridComp' , + 'CDCR2' , 'GridComp' , + 'POROS' , 'GridComp' , + :: + + const_2d_lnd_Nx.format: 'CFIO', + const_2d_lnd_Nx.descr: '2d,Constant,Time-invariant,Single-Level,Assimilation,Land Surface Model Parameters', + const_2d_lnd_Nx.template: '%y4%m2%d2_%h2%n2z.nc4', + const_2d_lnd_Nx.mode: 'instantaneous', + const_2d_lnd_Nx.frequency: 240000, + const_2d_lnd_Nx.ref_time: 000000, + const_2d_lnd_Nx.regrid_exch: '../input/tile.data' + const_2d_lnd_Nx.regrid_name: 'GRIDNAME' + const_2d_lnd_Nx.regrid_method: 'BILINEAR_MONOTONIC' , + const_2d_lnd_Nx.grid_label: PC720x361-DC + const_2d_lnd_Nx.deflate: 2, + const_2d_lnd_Nx.fields: 'DZGT1' , 'GridComp' , + 'DZGT2' , 'GridComp' , + 'DZGT3' , 'GridComp' , + 'DZGT4' , 'GridComp' , + 'DZGT5' , 'GridComp' , + 'DZGT6' , 'GridComp' , + 'DZPR' , 'GridComp' , + 'DZRZ' , 'GridComp' , + 'DZSF' , 'GridComp' , + 'DZTS' , 'GridComp' , + 'WPWET' , 'GridComp' , + 'WPEMW' , 'GridComp' , + 'WPMC' , 'GridComp' , + 'CDCR2' , 'GridComp' , + 'POROS' , 'GridComp' , + :: + + SMAP_L4_SM_gph.descr: 'Tile-space,3-Hourly,Time-Averaged,Single-Level,Assimilation,SMAP L4_SM Land Geophysical Diagnostics', SMAP_L4_SM_gph.nbits: 12, SMAP_L4_SM_gph.template: '%y4%m2%d2_%h2%n2z.bin', @@ -318,12 +385,12 @@ COLLECTIONS: 'WET2' , 'ENSAVG' , 'sm_rootzone_wetness' , 'WET3' , 'ENSAVG' , 'sm_profile_wetness' , 'TPSURF' , 'ENSAVG' , 'surface_temp' , - 'TSOIL1TILE' , 'ENSAVG' , 'soil_temp_layer1' , - 'TSOIL2TILE' , 'ENSAVG' , 'soil_temp_layer2' , - 'TSOIL3TILE' , 'ENSAVG' , 'soil_temp_layer3' , - 'TSOIL4TILE' , 'ENSAVG' , 'soil_temp_layer4' , - 'TSOIL5TILE' , 'ENSAVG' , 'soil_temp_layer5' , - 'TSOIL6TILE' , 'ENSAVG' , 'soil_temp_layer6' , + 'TP1' , 'ENSAVG' , 'soil_temp_layer1' , + 'TP2' , 'ENSAVG' , 'soil_temp_layer2' , + 'TP3' , 'ENSAVG' , 'soil_temp_layer3' , + 'TP4' , 'ENSAVG' , 'soil_temp_layer4' , + 'TP5' , 'ENSAVG' , 'soil_temp_layer5' , + 'TP6' , 'ENSAVG' , 'soil_temp_layer6' , 'SNOWMASS' , 'ENSAVG' , 'snow_mass' , 'SNOWDP' , 'ENSAVG' , 'snow_depth' , 'EVLAND' , 'ENSAVG' , 'land_evapotranspiration_flux' , @@ -363,7 +430,7 @@ COLLECTIONS: inst1_1d_lnr_Nt.frequency: 010000 , inst1_1d_lnr_Nt.ref_time: 000000, inst1_1d_lnr_Nt.fields: 'TPSURF' , 'ENSAVG' , 'surface_temp' , - 'TSOIL1TILE' , 'ENSAVG' , 'soil_temp_layer1' , + 'TP1' , 'ENSAVG' , 'soil_temp_layer1' , 'TPSNOW' , 'ENSAVG' , 'snow_temp_layer1' , 'TB_LAND_1410MHZ_40DEG_HPOL' , 'LANDASSIM' , 'tb_h' , 'TB_LAND_1410MHZ_40DEG_VPOL' , 'LANDASSIM' , 'tb_v' , @@ -420,22 +487,22 @@ COLLECTIONS: 'WCRZ' , 'ENSAVG' , 'RZMC_FCST' , 'WCPR' , 'ENSAVG' , 'PRMC_FCST' , 'TPSURF' , 'ENSAVG' , 'TSURF_FCST' , - 'TSOIL1TILE' , 'ENSAVG' , 'TSOIL1_FCST' , + 'TP1' , 'ENSAVG' , 'TSOIL1_FCST' , 'WCSF_ENSSTD' , 'ENSAVG' , 'SFMC_FCST_ENSSTD' , 'WCRZ_ENSSTD' , 'ENSAVG' , 'RZMC_FCST_ENSSTD' , 'WCPR_ENSSTD' , 'ENSAVG' , 'PRMC_FCST_ENSSTD' , 'TPSURF_ENSSTD' , 'ENSAVG' , 'TSURF_FCST_ENSSTD' , - 'TSOIL1TILE_ENSSTD' , 'ENSAVG' , 'TSOIL1_FCST_ENSSTD' , + 'TP1_ENSSTD' , 'ENSAVG' , 'TSOIL1_FCST_ENSSTD' , 'WCSF_ANA' , 'LANDASSIM' , 'SFMC_ANA' , 'WCRZ_ANA' , 'LANDASSIM' , 'RZMC_ANA' , 'WCPR_ANA' , 'LANDASSIM' , 'PRMC_ANA' , 'TPSURF_ANA' , 'LANDASSIM' , 'TSURF_ANA' , - 'TSOIL1_ANA' , 'LANDASSIM' , 'TSOIL1_ANA' , + 'TP1_ANA' , 'LANDASSIM' , 'TSOIL1_ANA' , 'WCSF_ANA_ENSSTD' , 'LANDASSIM' , 'SFMC_ANA_ENSSTD' , 'WCRZ_ANA_ENSSTD' , 'LANDASSIM' , 'RZMC_ANA_ENSSTD' , 'WCPR_ANA_ENSSTD' , 'LANDASSIM' , 'PRMC_ANA_ENSSTD' , 'TPSURF_ANA_ENSSTD' , 'LANDASSIM' , 'TSURF_ANA_ENSSTD' , - 'TSOIL1_ANA_ENSSTD' , 'LANDASSIM' , 'TSOIL1_ANA_ENSSTD' + 'TP1_ANA_ENSSTD' , 'LANDASSIM' , 'TSOIL1_ANA_ENSSTD' :: # For lndfcstana, *.frequency and *.ref_time must be consistent with the LDAS.rc resource @@ -459,22 +526,22 @@ COLLECTIONS: 'WCRZ' , 'ENSAVG' , 'RZMC_FCST' , 'WCPR' , 'ENSAVG' , 'PRMC_FCST' , 'TPSURF' , 'ENSAVG' , 'TSURF_FCST' , - 'TSOIL1TILE' , 'ENSAVG' , 'TSOIL1_FCST' , + 'TP1' , 'ENSAVG' , 'TSOIL1_FCST' , 'WCSF_ENSSTD' , 'ENSAVG' , 'SFMC_FCST_ENSSTD' , 'WCRZ_ENSSTD' , 'ENSAVG' , 'RZMC_FCST_ENSSTD' , 'WCPR_ENSSTD' , 'ENSAVG' , 'PRMC_FCST_ENSSTD' , 'TPSURF_ENSSTD' , 'ENSAVG' , 'TSURF_FCST_ENSSTD' , - 'TSOIL1TILE_ENSSTD' , 'ENSAVG' , 'TSOIL1_FCST_ENSSTD' , + 'TP1_ENSSTD' , 'ENSAVG' , 'TSOIL1_FCST_ENSSTD' , 'WCSF_ANA' , 'LANDASSIM' , 'SFMC_ANA' , 'WCRZ_ANA' , 'LANDASSIM' , 'RZMC_ANA' , 'WCPR_ANA' , 'LANDASSIM' , 'PRMC_ANA' , 'TPSURF_ANA' , 'LANDASSIM' , 'TSURF_ANA' , - 'TSOIL1_ANA' , 'LANDASSIM' , 'TSOIL1_ANA' , + 'TP1_ANA' , 'LANDASSIM' , 'TSOIL1_ANA' , 'WCSF_ANA_ENSSTD' , 'LANDASSIM' , 'SFMC_ANA_ENSSTD' , 'WCRZ_ANA_ENSSTD' , 'LANDASSIM' , 'RZMC_ANA_ENSSTD' , 'WCPR_ANA_ENSSTD' , 'LANDASSIM' , 'PRMC_ANA_ENSSTD' , 'TPSURF_ANA_ENSSTD' , 'LANDASSIM' , 'TSURF_ANA_ENSSTD' , - 'TSOIL1_ANA_ENSSTD' , 'LANDASSIM' , 'TSOIL1_ANA_ENSSTD' + 'TP1_ANA_ENSSTD' , 'LANDASSIM' , 'TSOIL1_ANA_ENSSTD' :: # ========================== EOF ============================================================== diff --git a/GEOSldas_App/GEOSldas_HISTdet.rc b/GEOSldas_App/GEOSldas_HISTdet.rc new file mode 100644 index 00000000..55995fc3 --- /dev/null +++ b/GEOSldas_App/GEOSldas_HISTdet.rc @@ -0,0 +1,167 @@ +# +# Sample GEOSldas HISTORY.rc file for LADAS (central simulation) +# +# This sample is for the GEOSldas instance that is coupled with the central +# simulation component of the Hy4dEnVar ADAS: +# +# (1) The "catch_progn_incr" is output is the ensemble average. +# (2) The "catch_progn_incr" output is in tile space. Its definition is generic +################################################################################## + +VERSION: 1 +EXPID: GEOSldas_expid + +COLLECTIONS: + 'catch_progn_incr' + 'tavg3_1d_lnd_Nt' + 'inst3_2d_lndfcstana_Nx' + :: + +GRID_LABELS: PC720x361-DC + PC576x361-DC + :: + +PC720x361-DC.GRID_TYPE: LatLon +PC720x361-DC.IM_WORLD: 720 +PC720x361-DC.JM_WORLD: 361 +PC720x361-DC.POLE: PC +PC720x361-DC.DATELINE: DC +PC720x361-DC.LM: 1 + +PC576x361-DC.GRID_TYPE: LatLon +PC576x361-DC.IM_WORLD: 576 +PC576x361-DC.JM_WORLD: 361 +PC576x361-DC.POLE: PC +PC576x361-DC.DATELINE: DC +PC576x361-DC.LM: 1 + + +catch_progn_incr.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation,Ensemble-Average Land Prognostics Increments', +catch_progn_incr.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr.mode: 'instantaneous', +catch_progn_incr.frequency: 030000, +catch_progn_incr.ref_time: 013000, +catch_progn_incr.fields: 'TCFSAT_INCR' , 'LANDASSIM' , + 'TCFTRN_INCR' , 'LANDASSIM' , + 'TCFWLT_INCR' , 'LANDASSIM' , + 'QCFSAT_INCR' , 'LANDASSIM' , + 'QCFTRN_INCR' , 'LANDASSIM' , + 'QCFWLT_INCR' , 'LANDASSIM' , + 'CAPAC_INCR' , 'LANDASSIM' , + 'CATDEF_INCR' , 'LANDASSIM' , + 'RZEXC_INCR' , 'LANDASSIM' , + 'SRFEXC_INCR' , 'LANDASSIM' , + 'GHTCNT1_INCR' , 'LANDASSIM' , + 'GHTCNT2_INCR' , 'LANDASSIM' , + 'GHTCNT3_INCR' , 'LANDASSIM' , + 'GHTCNT4_INCR' , 'LANDASSIM' , + 'GHTCNT5_INCR' , 'LANDASSIM' , + 'GHTCNT6_INCR' , 'LANDASSIM' , + 'WESNN1_INCR' , 'LANDASSIM' , + 'WESNN2_INCR' , 'LANDASSIM' , + 'WESNN3_INCR' , 'LANDASSIM' , + 'HTSNNN1_INCR' , 'LANDASSIM' , + 'HTSNNN2_INCR' , 'LANDASSIM' , + 'HTSNNN3_INCR' , 'LANDASSIM' , + 'SNDZN1_INCR' , 'LANDASSIM' , + 'SNDZN2_INCR' , 'LANDASSIM' , + 'SNDZN3_INCR' , 'LANDASSIM' , + :: + + tavg3_1d_lnd_Nt.descr: 'Tile-space,Time-Averaged,Single-Level,Assimilation,Land Surface Diagnostics', + tavg3_1d_lnd_Nt.nbits: 12, + tavg3_1d_lnd_Nt.template: '%y4%m2%d2_%h2%n2z.bin', + tavg3_1d_lnd_Nt.mode: 'time-averaged', + tavg3_1d_lnd_Nt.frequency: 030000, + tavg3_1d_lnd_Nt.ref_time: 013000, + tavg3_1d_lnd_Nt.fields: 'WET3' , 'ENSAVG' , 'GWETPROF' , + 'WET2' , 'ENSAVG' , 'GWETROOT' , + 'WET1' , 'ENSAVG' , 'GWETTOP' , + 'WCPR' , 'ENSAVG' , 'PRMC' , + 'WCRZ' , 'ENSAVG' , 'RZMC' , + 'WCSF' , 'ENSAVG' , 'SFMC' , + 'TPSNOW' , 'ENSAVG' , + 'TPUNST' , 'ENSAVG' , 'TUNST' , + 'TPSAT' , 'ENSAVG' , 'TSAT' , + 'TPWLT' , 'ENSAVG' , 'TWLT' , + 'TPSURF' , 'ENSAVG' , 'TSURF' , + 'GRN' , 'VEGDYN_e0001' , + 'LAI' , 'VEGDYN_e0001' , + 'TP1' , 'ENSAVG' , + 'TP2' , 'ENSAVG' , + 'TP3' , 'ENSAVG' , + 'TP4' , 'ENSAVG' , + 'TP5' , 'ENSAVG' , + 'TP6' , 'ENSAVG' , + 'PRLAND' , 'ENSAVG' , 'PRECTOTLAND' , + 'SNOLAND' , 'ENSAVG' , 'PRECSNOLAND' , + 'TSLAND' , 'ENSAVG' , 'SNOMAS' , + 'SNOWDP' , 'ENSAVG' , 'SNODP' , + 'EVPSOI' , 'ENSAVG' , 'EVPSOIL' , + 'EVPVEG' , 'ENSAVG' , 'EVPTRNS' , + 'EVPINT' , 'ENSAVG' , 'EVPINTR' , + 'EVPICE' , 'ENSAVG' , 'EVPSBLN' , + 'RUNSURF' , 'ENSAVG' , 'RUNOFF' , + 'BASEFLOW' , 'ENSAVG' , + 'SMLAND' , 'ENSAVG' , + 'QINFIL' , 'ENSAVG' , + 'FRUST' , 'ENSAVG' , 'FRUNST' , + 'FRSAT' , 'ENSAVG' , + 'ASNOW' , 'ENSAVG' , 'FRSNO' , + 'FRWLT' , 'ENSAVG' , + 'DFPARLAND' , 'ENSAVG' , 'PARDFLAND' , + 'DRPARLAND' , 'ENSAVG' , 'PARDRLAND' , + 'SHLAND' , 'ENSAVG' , + 'LHLAND' , 'ENSAVG' , + 'EVLAND' , 'ENSAVG' , + 'LWLAND' , 'ENSAVG' , + 'SWLAND' , 'ENSAVG' , + 'GHLAND' , 'ENSAVG' , + 'TWLAND' , 'ENSAVG' , + 'TELAND' , 'ENSAVG' , + 'DWLAND' , 'ENSAVG' , 'WCHANGE' , + 'DHLAND' , 'ENSAVG' , 'ECHANGE' , + 'SPLAND' , 'ENSAVG' , + 'SPWATR' , 'ENSAVG' , + 'SPSNOW' , 'ENSAVG' , + 'PEATCLSM_WATERLEVEL', 'ENSAVG' , + 'PEATCLSM_FSWCHANGE' , 'ENSAVG' , + :: + + + inst3_2d_lndfcstana_Nx.descr: '2d,3-Hourly,Instantaneous,Single-Level,Assimilation,Ensemble Land Forecast and Analysis Diagnostics', + inst3_2d_lndfcstana_Nx.nbits: 12, + inst3_2d_lndfcstana_Nx.template: '%y4%m2%d2_%h2%n2z.nc4', + inst3_2d_lndfcstana_Nx.archive: '%c/Y%y4', + inst3_2d_lndfcstana_Nx.mode: 'instantaneous', + inst3_2d_lndfcstana_Nx.frequency: 030000, + inst3_2d_lndfcstana_Nx.ref_time: 013000, + inst3_2d_lndfcstana_Nx.format: 'CFIO', + inst3_2d_lndfcstana_Nx.regrid_exch: '../input/tile.data', + inst3_2d_lndfcstana_Nx.regrid_name: 'GRIDNAME', + inst3_2d_lndfcstana_Nx.grid_label: PC720x361-DC, + inst3_2d_lndfcstana_Nx.deflate: 2, + inst3_2d_lndfcstana_Nx.fields: 'WCSF' , 'ENSAVG' , 'SFMC_FCST' , + 'WCRZ' , 'ENSAVG' , 'RZMC_FCST' , + 'WCPR' , 'ENSAVG' , 'PRMC_FCST' , + 'TPSURF' , 'ENSAVG' , 'TSURF_FCST' , + 'TP1' , 'ENSAVG' , 'TSOIL1_FCST' , + 'WCSF_ENSSTD' , 'ENSAVG' , 'SFMC_FCST_ENSSTD' , + 'WCRZ_ENSSTD' , 'ENSAVG' , 'RZMC_FCST_ENSSTD' , + 'WCPR_ENSSTD' , 'ENSAVG' , 'PRMC_FCST_ENSSTD' , + 'TPSURF_ENSSTD' , 'ENSAVG' , 'TSURF_FCST_ENSSTD' , + 'TP1_ENSSTD' , 'ENSAVG' , 'TSOIL1_FCST_ENSSTD' , + 'WCSF_ANA' , 'LANDASSIM' , 'SFMC_ANA' , + 'WCRZ_ANA' , 'LANDASSIM' , 'RZMC_ANA' , + 'WCPR_ANA' , 'LANDASSIM' , 'PRMC_ANA' , + 'TPSURF_ANA' , 'LANDASSIM' , 'TSURF_ANA' , + 'TP1_ANA' , 'LANDASSIM' , 'TSOIL1_ANA' , + 'WCSF_ANA_ENSSTD' , 'LANDASSIM' , 'SFMC_ANA_ENSSTD' , + 'WCRZ_ANA_ENSSTD' , 'LANDASSIM' , 'RZMC_ANA_ENSSTD' , + 'WCPR_ANA_ENSSTD' , 'LANDASSIM' , 'PRMC_ANA_ENSSTD' , + 'TPSURF_ANA_ENSSTD' , 'LANDASSIM' , 'TSURF_ANA_ENSSTD' , + 'TP1_ANA_ENSSTD' , 'LANDASSIM' , 'TSOIL1_ANA_ENSSTD' + :: + + +# ========================== EOF ============================================================== diff --git a/GEOSldas_App/GEOSldas_HISTens.rc b/GEOSldas_App/GEOSldas_HISTens.rc new file mode 100644 index 00000000..872be4ca --- /dev/null +++ b/GEOSldas_App/GEOSldas_HISTens.rc @@ -0,0 +1,1207 @@ +# +# Sample GEOSldas HISTORY.rc file for LADAS (atm ensemble) +# +# - This sample HISTORY.rc is for the GEOSldas instance that is weakly coupled with the +# atmospheric ensemble component of the Hybrid-4DEnVar ADAS (ADASens). +# +# - The catch_progn_incr portion of the sample file was generated with the utility script +# "GEOSldas/src/Components/GEOSldas_GridComp/GEOSldas_App/util/config/generate_catchincr_hist.py". +# +# - The sample file triggers output of the GEOSldas "catch_progn_incr" collection in +# ensemble space, which is needed by ADASens. +# +# - The IDs of the ensemble members and their total number in GEOSldas must match +# those of ADASens. +# +# - The "catch_progn_incr" output is in tile space, which must be the same for +# GEOSldas and ADASens. +# +################################################################################## + +EXPID: GEOSldas_expid + +COLLECTIONS: +'tavg3_1d_lnd_Nt' +#'inst3_2d_lndfcstana_Nx' +'catch_progn_incr0001' +'catch_progn_incr0002' +'catch_progn_incr0003' +'catch_progn_incr0004' +'catch_progn_incr0005' +'catch_progn_incr0006' +'catch_progn_incr0007' +'catch_progn_incr0008' +'catch_progn_incr0009' +'catch_progn_incr0010' +'catch_progn_incr0011' +'catch_progn_incr0012' +'catch_progn_incr0013' +'catch_progn_incr0014' +'catch_progn_incr0015' +'catch_progn_incr0016' +'catch_progn_incr0017' +'catch_progn_incr0018' +'catch_progn_incr0019' +'catch_progn_incr0020' +'catch_progn_incr0021' +'catch_progn_incr0022' +'catch_progn_incr0023' +'catch_progn_incr0024' +'catch_progn_incr0025' +'catch_progn_incr0026' +'catch_progn_incr0027' +'catch_progn_incr0028' +'catch_progn_incr0029' +'catch_progn_incr0030' +'catch_progn_incr0031' +'catch_progn_incr0032' +:: + +GRID_LABELS: PC720x361-DC + PC576x361-DC + PC360x181-DC +:: +PC720x361-DC.GRID_TYPE: LatLon +PC720x361-DC.IM_WORLD: 720 +PC720x361-DC.JM_WORLD: 361 +PC720x361-DC.POLE: PC +PC720x361-DC.DATELINE: DC +PC720x361-DC.LM: 1 + +PC576x361-DC.GRID_TYPE: LatLon +PC576x361-DC.IM_WORLD: 576 +PC576x361-DC.JM_WORLD: 361 +PC576x361-DC.POLE: PC +PC576x361-DC.DATELINE: DC +PC576x361-DC.LM: 1 + +PC360x181-DC.GRID_TYPE: LatLon +PC360x181-DC.IM_WORLD: 360 +PC360x181-DC.JM_WORLD: 181 +PC360x181-DC.POLE: PC +PC360x181-DC.DATELINE: DC +PC360x181-DC.LM: 1 + + +tavg3_1d_lnd_Nt.descr: 'Tile-space,Time-Averaged,Single-Level,Assimilation,Land Surface Diagnostics', +tavg3_1d_lnd_Nt.nbits: 12, +tavg3_1d_lnd_Nt.template: '%y4%m2%d2_%h2%n2z.bin', +tavg3_1d_lnd_Nt.mode: 'time-averaged', +tavg3_1d_lnd_Nt.frequency: 030000, +tavg3_1d_lnd_Nt.ref_time: 000000, +tavg3_1d_lnd_Nt.fields: 'WET3' , 'ENSAVG' , 'GWETPROF' , + 'WET2' , 'ENSAVG' , 'GWETROOT' , + 'WET1' , 'ENSAVG' , 'GWETTOP' , + 'WCPR' , 'ENSAVG' , 'PRMC' , + 'WCRZ' , 'ENSAVG' , 'RZMC' , + 'WCSF' , 'ENSAVG' , 'SFMC' , + 'TPSNOW' , 'ENSAVG' , + 'TPUNST' , 'ENSAVG' , 'TUNST' , + 'TPSAT' , 'ENSAVG' , 'TSAT' , + 'TPWLT' , 'ENSAVG' , 'TWLT' , + 'TPSURF' , 'ENSAVG' , 'TSURF' , + 'GRN' , 'VEGDYN_e0001' , + 'LAI' , 'VEGDYN_e0001' , + 'TP1' , 'ENSAVG' , + 'TP2' , 'ENSAVG' , + 'TP3' , 'ENSAVG' , + 'TP4' , 'ENSAVG' , + 'TP5' , 'ENSAVG' , + 'TP6' , 'ENSAVG' , + 'PRLAND' , 'ENSAVG' , 'PRECTOTLAND' , + 'SNOLAND' , 'ENSAVG' , 'PRECSNOLAND' , + 'TSLAND' , 'ENSAVG' , 'SNOMAS' , + 'SNOWDP' , 'ENSAVG' , 'SNODP' , + 'EVPSOI' , 'ENSAVG' , 'EVPSOIL' , + 'EVPVEG' , 'ENSAVG' , 'EVPTRNS' , + 'EVPINT' , 'ENSAVG' , 'EVPINTR' , + 'EVPICE' , 'ENSAVG' , 'EVPSBLN' , + 'RUNSURF' , 'ENSAVG' , 'RUNOFF' , + 'BASEFLOW' , 'ENSAVG' , + 'SMLAND' , 'ENSAVG' , + 'QINFIL' , 'ENSAVG' , + 'FRUST' , 'ENSAVG' , 'FRUNST' , + 'FRSAT' , 'ENSAVG' , + 'ASNOW' , 'ENSAVG' , 'FRSNO' , + 'FRWLT' , 'ENSAVG' , + 'DFPARLAND' , 'ENSAVG' , 'PARDFLAND' , + 'DRPARLAND' , 'ENSAVG' , 'PARDRLAND' , + 'SHLAND' , 'ENSAVG' , + 'LHLAND' , 'ENSAVG' , + 'EVLAND' , 'ENSAVG' , + 'LWLAND' , 'ENSAVG' , + 'SWLAND' , 'ENSAVG' , + 'GHLAND' , 'ENSAVG' , + 'TWLAND' , 'ENSAVG' , + 'TELAND' , 'ENSAVG' , + 'DWLAND' , 'ENSAVG' , 'WCHANGE' , + 'DHLAND' , 'ENSAVG' , 'ECHANGE' , + 'SPLAND' , 'ENSAVG' , + 'SPWATR' , 'ENSAVG' , + 'SPSNOW' , 'ENSAVG' , + 'PEATCLSM_WATERLEVEL', 'ENSAVG' , + 'PEATCLSM_FSWCHANGE' , 'ENSAVG' , +:: + + +inst3_2d_lndfcstana_Nx.descr: '2d,3-Hourly,Instantaneous,Single-Level,Assimilation,Ensemble Land Forecast and Analysis Diagnostics', +inst3_2d_lndfcstana_Nx.nbits: 12, +inst3_2d_lndfcstana_Nx.template: '%y4%m2%d2_%h2%n2z.nc4', +inst3_2d_lndfcstana_Nx.archive: '%c/Y%y4', +inst3_2d_lndfcstana_Nx.mode: 'instantaneous', +inst3_2d_lndfcstana_Nx.frequency: 030000, +inst3_2d_lndfcstana_Nx.ref_time: 013000, +inst3_2d_lndfcstana_Nx.format: 'CFIO', +inst3_2d_lndfcstana_Nx.regrid_exch: '../input/tile.data', +inst3_2d_lndfcstana_Nx.regrid_name: 'GRIDNAME', +inst3_2d_lndfcstana_Nx.grid_label: PC360x181-DC, +inst3_2d_lndfcstana_Nx.deflate: 2, +inst3_2d_lndfcstana_Nx.deflate: 2, +inst3_2d_lndfcstana_Nx.fields: 'WCSF' , 'ENSAVG' , 'SFMC_FCST' , + 'WCRZ' , 'ENSAVG' , 'RZMC_FCST' , + 'WCPR' , 'ENSAVG' , 'PRMC_FCST' , + 'TPSURF' , 'ENSAVG' , 'TSURF_FCST' , + 'TP1' , 'ENSAVG' , 'TSOIL1_FCST' , + 'WCSF_ENSSTD' , 'ENSAVG' , 'SFMC_FCST_ENSSTD' , + 'WCRZ_ENSSTD' , 'ENSAVG' , 'RZMC_FCST_ENSSTD' , + 'WCPR_ENSSTD' , 'ENSAVG' , 'PRMC_FCST_ENSSTD' , + 'TPSURF_ENSSTD' , 'ENSAVG' , 'TSURF_FCST_ENSSTD' , + 'TP1_ENSSTD' , 'ENSAVG' , 'TSOIL1_FCST_ENSSTD' , + 'WCSF_ANA' , 'LANDASSIM' , 'SFMC_ANA' , + 'WCRZ_ANA' , 'LANDASSIM' , 'RZMC_ANA' , + 'WCPR_ANA' , 'LANDASSIM' , 'PRMC_ANA' , + 'TPSURF_ANA' , 'LANDASSIM' , 'TSURF_ANA' , + 'TP1_ANA' , 'LANDASSIM' , 'TSOIL1_ANA' , + 'WCSF_ANA_ENSSTD' , 'LANDASSIM' , 'SFMC_ANA_ENSSTD' , + 'WCRZ_ANA_ENSSTD' , 'LANDASSIM' , 'RZMC_ANA_ENSSTD' , + 'WCPR_ANA_ENSSTD' , 'LANDASSIM' , 'PRMC_ANA_ENSSTD' , + 'TPSURF_ANA_ENSSTD' , 'LANDASSIM' , 'TSURF_ANA_ENSSTD' , + 'TP1_ANA_ENSSTD' , 'LANDASSIM' , 'TSOIL1_ANA_ENSSTD' +:: + + +catch_progn_incr0001.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0001.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0001.mode: 'instantaneous', +catch_progn_incr0001.frequency: 030000, +catch_progn_incr0001.ref_time: 013000, +catch_progn_incr0001.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0001' , + 'TCFTRN_INCR' , 'CATCHINCR_e0001' , + 'TCFWLT_INCR' , 'CATCHINCR_e0001' , + 'QCFSAT_INCR' , 'CATCHINCR_e0001' , + 'QCFTRN_INCR' , 'CATCHINCR_e0001' , + 'QCFWLT_INCR' , 'CATCHINCR_e0001' , + 'CAPAC_INCR' , 'CATCHINCR_e0001' , + 'CATDEF_INCR' , 'CATCHINCR_e0001' , + 'RZEXC_INCR' , 'CATCHINCR_e0001' , + 'SRFEXC_INCR' , 'CATCHINCR_e0001' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0001' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0001' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0001' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0001' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0001' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0001' , + 'WESNN1_INCR' , 'CATCHINCR_e0001' , + 'WESNN2_INCR' , 'CATCHINCR_e0001' , + 'WESNN3_INCR' , 'CATCHINCR_e0001' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0001' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0001' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0001' , + 'SNDZN1_INCR' , 'CATCHINCR_e0001' , + 'SNDZN2_INCR' , 'CATCHINCR_e0001' , + 'SNDZN3_INCR' , 'CATCHINCR_e0001' , + +:: +catch_progn_incr0002.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0002.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0002.mode: 'instantaneous', +catch_progn_incr0002.frequency: 030000, +catch_progn_incr0002.ref_time: 013000, +catch_progn_incr0002.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0002' , + 'TCFTRN_INCR' , 'CATCHINCR_e0002' , + 'TCFWLT_INCR' , 'CATCHINCR_e0002' , + 'QCFSAT_INCR' , 'CATCHINCR_e0002' , + 'QCFTRN_INCR' , 'CATCHINCR_e0002' , + 'QCFWLT_INCR' , 'CATCHINCR_e0002' , + 'CAPAC_INCR' , 'CATCHINCR_e0002' , + 'CATDEF_INCR' , 'CATCHINCR_e0002' , + 'RZEXC_INCR' , 'CATCHINCR_e0002' , + 'SRFEXC_INCR' , 'CATCHINCR_e0002' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0002' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0002' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0002' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0002' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0002' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0002' , + 'WESNN1_INCR' , 'CATCHINCR_e0002' , + 'WESNN2_INCR' , 'CATCHINCR_e0002' , + 'WESNN3_INCR' , 'CATCHINCR_e0002' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0002' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0002' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0002' , + 'SNDZN1_INCR' , 'CATCHINCR_e0002' , + 'SNDZN2_INCR' , 'CATCHINCR_e0002' , + 'SNDZN3_INCR' , 'CATCHINCR_e0002' , + +:: +catch_progn_incr0003.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0003.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0003.mode: 'instantaneous', +catch_progn_incr0003.frequency: 030000, +catch_progn_incr0003.ref_time: 013000, +catch_progn_incr0003.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0003' , + 'TCFTRN_INCR' , 'CATCHINCR_e0003' , + 'TCFWLT_INCR' , 'CATCHINCR_e0003' , + 'QCFSAT_INCR' , 'CATCHINCR_e0003' , + 'QCFTRN_INCR' , 'CATCHINCR_e0003' , + 'QCFWLT_INCR' , 'CATCHINCR_e0003' , + 'CAPAC_INCR' , 'CATCHINCR_e0003' , + 'CATDEF_INCR' , 'CATCHINCR_e0003' , + 'RZEXC_INCR' , 'CATCHINCR_e0003' , + 'SRFEXC_INCR' , 'CATCHINCR_e0003' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0003' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0003' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0003' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0003' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0003' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0003' , + 'WESNN1_INCR' , 'CATCHINCR_e0003' , + 'WESNN2_INCR' , 'CATCHINCR_e0003' , + 'WESNN3_INCR' , 'CATCHINCR_e0003' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0003' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0003' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0003' , + 'SNDZN1_INCR' , 'CATCHINCR_e0003' , + 'SNDZN2_INCR' , 'CATCHINCR_e0003' , + 'SNDZN3_INCR' , 'CATCHINCR_e0003' , + +:: +catch_progn_incr0004.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0004.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0004.mode: 'instantaneous', +catch_progn_incr0004.frequency: 030000, +catch_progn_incr0004.ref_time: 013000, +catch_progn_incr0004.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0004' , + 'TCFTRN_INCR' , 'CATCHINCR_e0004' , + 'TCFWLT_INCR' , 'CATCHINCR_e0004' , + 'QCFSAT_INCR' , 'CATCHINCR_e0004' , + 'QCFTRN_INCR' , 'CATCHINCR_e0004' , + 'QCFWLT_INCR' , 'CATCHINCR_e0004' , + 'CAPAC_INCR' , 'CATCHINCR_e0004' , + 'CATDEF_INCR' , 'CATCHINCR_e0004' , + 'RZEXC_INCR' , 'CATCHINCR_e0004' , + 'SRFEXC_INCR' , 'CATCHINCR_e0004' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0004' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0004' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0004' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0004' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0004' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0004' , + 'WESNN1_INCR' , 'CATCHINCR_e0004' , + 'WESNN2_INCR' , 'CATCHINCR_e0004' , + 'WESNN3_INCR' , 'CATCHINCR_e0004' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0004' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0004' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0004' , + 'SNDZN1_INCR' , 'CATCHINCR_e0004' , + 'SNDZN2_INCR' , 'CATCHINCR_e0004' , + 'SNDZN3_INCR' , 'CATCHINCR_e0004' , + +:: +catch_progn_incr0005.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0005.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0005.mode: 'instantaneous', +catch_progn_incr0005.frequency: 030000, +catch_progn_incr0005.ref_time: 013000, +catch_progn_incr0005.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0005' , + 'TCFTRN_INCR' , 'CATCHINCR_e0005' , + 'TCFWLT_INCR' , 'CATCHINCR_e0005' , + 'QCFSAT_INCR' , 'CATCHINCR_e0005' , + 'QCFTRN_INCR' , 'CATCHINCR_e0005' , + 'QCFWLT_INCR' , 'CATCHINCR_e0005' , + 'CAPAC_INCR' , 'CATCHINCR_e0005' , + 'CATDEF_INCR' , 'CATCHINCR_e0005' , + 'RZEXC_INCR' , 'CATCHINCR_e0005' , + 'SRFEXC_INCR' , 'CATCHINCR_e0005' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0005' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0005' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0005' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0005' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0005' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0005' , + 'WESNN1_INCR' , 'CATCHINCR_e0005' , + 'WESNN2_INCR' , 'CATCHINCR_e0005' , + 'WESNN3_INCR' , 'CATCHINCR_e0005' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0005' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0005' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0005' , + 'SNDZN1_INCR' , 'CATCHINCR_e0005' , + 'SNDZN2_INCR' , 'CATCHINCR_e0005' , + 'SNDZN3_INCR' , 'CATCHINCR_e0005' , + +:: +catch_progn_incr0006.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0006.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0006.mode: 'instantaneous', +catch_progn_incr0006.frequency: 030000, +catch_progn_incr0006.ref_time: 013000, +catch_progn_incr0006.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0006' , + 'TCFTRN_INCR' , 'CATCHINCR_e0006' , + 'TCFWLT_INCR' , 'CATCHINCR_e0006' , + 'QCFSAT_INCR' , 'CATCHINCR_e0006' , + 'QCFTRN_INCR' , 'CATCHINCR_e0006' , + 'QCFWLT_INCR' , 'CATCHINCR_e0006' , + 'CAPAC_INCR' , 'CATCHINCR_e0006' , + 'CATDEF_INCR' , 'CATCHINCR_e0006' , + 'RZEXC_INCR' , 'CATCHINCR_e0006' , + 'SRFEXC_INCR' , 'CATCHINCR_e0006' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0006' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0006' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0006' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0006' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0006' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0006' , + 'WESNN1_INCR' , 'CATCHINCR_e0006' , + 'WESNN2_INCR' , 'CATCHINCR_e0006' , + 'WESNN3_INCR' , 'CATCHINCR_e0006' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0006' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0006' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0006' , + 'SNDZN1_INCR' , 'CATCHINCR_e0006' , + 'SNDZN2_INCR' , 'CATCHINCR_e0006' , + 'SNDZN3_INCR' , 'CATCHINCR_e0006' , + +:: +catch_progn_incr0007.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0007.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0007.mode: 'instantaneous', +catch_progn_incr0007.frequency: 030000, +catch_progn_incr0007.ref_time: 013000, +catch_progn_incr0007.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0007' , + 'TCFTRN_INCR' , 'CATCHINCR_e0007' , + 'TCFWLT_INCR' , 'CATCHINCR_e0007' , + 'QCFSAT_INCR' , 'CATCHINCR_e0007' , + 'QCFTRN_INCR' , 'CATCHINCR_e0007' , + 'QCFWLT_INCR' , 'CATCHINCR_e0007' , + 'CAPAC_INCR' , 'CATCHINCR_e0007' , + 'CATDEF_INCR' , 'CATCHINCR_e0007' , + 'RZEXC_INCR' , 'CATCHINCR_e0007' , + 'SRFEXC_INCR' , 'CATCHINCR_e0007' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0007' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0007' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0007' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0007' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0007' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0007' , + 'WESNN1_INCR' , 'CATCHINCR_e0007' , + 'WESNN2_INCR' , 'CATCHINCR_e0007' , + 'WESNN3_INCR' , 'CATCHINCR_e0007' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0007' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0007' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0007' , + 'SNDZN1_INCR' , 'CATCHINCR_e0007' , + 'SNDZN2_INCR' , 'CATCHINCR_e0007' , + 'SNDZN3_INCR' , 'CATCHINCR_e0007' , + +:: +catch_progn_incr0008.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0008.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0008.mode: 'instantaneous', +catch_progn_incr0008.frequency: 030000, +catch_progn_incr0008.ref_time: 013000, +catch_progn_incr0008.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0008' , + 'TCFTRN_INCR' , 'CATCHINCR_e0008' , + 'TCFWLT_INCR' , 'CATCHINCR_e0008' , + 'QCFSAT_INCR' , 'CATCHINCR_e0008' , + 'QCFTRN_INCR' , 'CATCHINCR_e0008' , + 'QCFWLT_INCR' , 'CATCHINCR_e0008' , + 'CAPAC_INCR' , 'CATCHINCR_e0008' , + 'CATDEF_INCR' , 'CATCHINCR_e0008' , + 'RZEXC_INCR' , 'CATCHINCR_e0008' , + 'SRFEXC_INCR' , 'CATCHINCR_e0008' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0008' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0008' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0008' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0008' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0008' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0008' , + 'WESNN1_INCR' , 'CATCHINCR_e0008' , + 'WESNN2_INCR' , 'CATCHINCR_e0008' , + 'WESNN3_INCR' , 'CATCHINCR_e0008' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0008' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0008' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0008' , + 'SNDZN1_INCR' , 'CATCHINCR_e0008' , + 'SNDZN2_INCR' , 'CATCHINCR_e0008' , + 'SNDZN3_INCR' , 'CATCHINCR_e0008' , + +:: +catch_progn_incr0009.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0009.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0009.mode: 'instantaneous', +catch_progn_incr0009.frequency: 030000, +catch_progn_incr0009.ref_time: 013000, +catch_progn_incr0009.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0009' , + 'TCFTRN_INCR' , 'CATCHINCR_e0009' , + 'TCFWLT_INCR' , 'CATCHINCR_e0009' , + 'QCFSAT_INCR' , 'CATCHINCR_e0009' , + 'QCFTRN_INCR' , 'CATCHINCR_e0009' , + 'QCFWLT_INCR' , 'CATCHINCR_e0009' , + 'CAPAC_INCR' , 'CATCHINCR_e0009' , + 'CATDEF_INCR' , 'CATCHINCR_e0009' , + 'RZEXC_INCR' , 'CATCHINCR_e0009' , + 'SRFEXC_INCR' , 'CATCHINCR_e0009' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0009' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0009' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0009' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0009' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0009' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0009' , + 'WESNN1_INCR' , 'CATCHINCR_e0009' , + 'WESNN2_INCR' , 'CATCHINCR_e0009' , + 'WESNN3_INCR' , 'CATCHINCR_e0009' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0009' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0009' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0009' , + 'SNDZN1_INCR' , 'CATCHINCR_e0009' , + 'SNDZN2_INCR' , 'CATCHINCR_e0009' , + 'SNDZN3_INCR' , 'CATCHINCR_e0009' , + +:: +catch_progn_incr0010.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0010.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0010.mode: 'instantaneous', +catch_progn_incr0010.frequency: 030000, +catch_progn_incr0010.ref_time: 013000, +catch_progn_incr0010.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0010' , + 'TCFTRN_INCR' , 'CATCHINCR_e0010' , + 'TCFWLT_INCR' , 'CATCHINCR_e0010' , + 'QCFSAT_INCR' , 'CATCHINCR_e0010' , + 'QCFTRN_INCR' , 'CATCHINCR_e0010' , + 'QCFWLT_INCR' , 'CATCHINCR_e0010' , + 'CAPAC_INCR' , 'CATCHINCR_e0010' , + 'CATDEF_INCR' , 'CATCHINCR_e0010' , + 'RZEXC_INCR' , 'CATCHINCR_e0010' , + 'SRFEXC_INCR' , 'CATCHINCR_e0010' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0010' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0010' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0010' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0010' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0010' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0010' , + 'WESNN1_INCR' , 'CATCHINCR_e0010' , + 'WESNN2_INCR' , 'CATCHINCR_e0010' , + 'WESNN3_INCR' , 'CATCHINCR_e0010' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0010' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0010' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0010' , + 'SNDZN1_INCR' , 'CATCHINCR_e0010' , + 'SNDZN2_INCR' , 'CATCHINCR_e0010' , + 'SNDZN3_INCR' , 'CATCHINCR_e0010' , + +:: +catch_progn_incr0011.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0011.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0011.mode: 'instantaneous', +catch_progn_incr0011.frequency: 030000, +catch_progn_incr0011.ref_time: 013000, +catch_progn_incr0011.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0011' , + 'TCFTRN_INCR' , 'CATCHINCR_e0011' , + 'TCFWLT_INCR' , 'CATCHINCR_e0011' , + 'QCFSAT_INCR' , 'CATCHINCR_e0011' , + 'QCFTRN_INCR' , 'CATCHINCR_e0011' , + 'QCFWLT_INCR' , 'CATCHINCR_e0011' , + 'CAPAC_INCR' , 'CATCHINCR_e0011' , + 'CATDEF_INCR' , 'CATCHINCR_e0011' , + 'RZEXC_INCR' , 'CATCHINCR_e0011' , + 'SRFEXC_INCR' , 'CATCHINCR_e0011' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0011' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0011' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0011' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0011' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0011' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0011' , + 'WESNN1_INCR' , 'CATCHINCR_e0011' , + 'WESNN2_INCR' , 'CATCHINCR_e0011' , + 'WESNN3_INCR' , 'CATCHINCR_e0011' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0011' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0011' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0011' , + 'SNDZN1_INCR' , 'CATCHINCR_e0011' , + 'SNDZN2_INCR' , 'CATCHINCR_e0011' , + 'SNDZN3_INCR' , 'CATCHINCR_e0011' , + +:: +catch_progn_incr0012.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0012.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0012.mode: 'instantaneous', +catch_progn_incr0012.frequency: 030000, +catch_progn_incr0012.ref_time: 013000, +catch_progn_incr0012.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0012' , + 'TCFTRN_INCR' , 'CATCHINCR_e0012' , + 'TCFWLT_INCR' , 'CATCHINCR_e0012' , + 'QCFSAT_INCR' , 'CATCHINCR_e0012' , + 'QCFTRN_INCR' , 'CATCHINCR_e0012' , + 'QCFWLT_INCR' , 'CATCHINCR_e0012' , + 'CAPAC_INCR' , 'CATCHINCR_e0012' , + 'CATDEF_INCR' , 'CATCHINCR_e0012' , + 'RZEXC_INCR' , 'CATCHINCR_e0012' , + 'SRFEXC_INCR' , 'CATCHINCR_e0012' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0012' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0012' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0012' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0012' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0012' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0012' , + 'WESNN1_INCR' , 'CATCHINCR_e0012' , + 'WESNN2_INCR' , 'CATCHINCR_e0012' , + 'WESNN3_INCR' , 'CATCHINCR_e0012' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0012' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0012' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0012' , + 'SNDZN1_INCR' , 'CATCHINCR_e0012' , + 'SNDZN2_INCR' , 'CATCHINCR_e0012' , + 'SNDZN3_INCR' , 'CATCHINCR_e0012' , + +:: +catch_progn_incr0013.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0013.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0013.mode: 'instantaneous', +catch_progn_incr0013.frequency: 030000, +catch_progn_incr0013.ref_time: 013000, +catch_progn_incr0013.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0013' , + 'TCFTRN_INCR' , 'CATCHINCR_e0013' , + 'TCFWLT_INCR' , 'CATCHINCR_e0013' , + 'QCFSAT_INCR' , 'CATCHINCR_e0013' , + 'QCFTRN_INCR' , 'CATCHINCR_e0013' , + 'QCFWLT_INCR' , 'CATCHINCR_e0013' , + 'CAPAC_INCR' , 'CATCHINCR_e0013' , + 'CATDEF_INCR' , 'CATCHINCR_e0013' , + 'RZEXC_INCR' , 'CATCHINCR_e0013' , + 'SRFEXC_INCR' , 'CATCHINCR_e0013' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0013' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0013' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0013' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0013' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0013' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0013' , + 'WESNN1_INCR' , 'CATCHINCR_e0013' , + 'WESNN2_INCR' , 'CATCHINCR_e0013' , + 'WESNN3_INCR' , 'CATCHINCR_e0013' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0013' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0013' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0013' , + 'SNDZN1_INCR' , 'CATCHINCR_e0013' , + 'SNDZN2_INCR' , 'CATCHINCR_e0013' , + 'SNDZN3_INCR' , 'CATCHINCR_e0013' , + +:: +catch_progn_incr0014.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0014.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0014.mode: 'instantaneous', +catch_progn_incr0014.frequency: 030000, +catch_progn_incr0014.ref_time: 013000, +catch_progn_incr0014.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0014' , + 'TCFTRN_INCR' , 'CATCHINCR_e0014' , + 'TCFWLT_INCR' , 'CATCHINCR_e0014' , + 'QCFSAT_INCR' , 'CATCHINCR_e0014' , + 'QCFTRN_INCR' , 'CATCHINCR_e0014' , + 'QCFWLT_INCR' , 'CATCHINCR_e0014' , + 'CAPAC_INCR' , 'CATCHINCR_e0014' , + 'CATDEF_INCR' , 'CATCHINCR_e0014' , + 'RZEXC_INCR' , 'CATCHINCR_e0014' , + 'SRFEXC_INCR' , 'CATCHINCR_e0014' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0014' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0014' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0014' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0014' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0014' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0014' , + 'WESNN1_INCR' , 'CATCHINCR_e0014' , + 'WESNN2_INCR' , 'CATCHINCR_e0014' , + 'WESNN3_INCR' , 'CATCHINCR_e0014' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0014' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0014' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0014' , + 'SNDZN1_INCR' , 'CATCHINCR_e0014' , + 'SNDZN2_INCR' , 'CATCHINCR_e0014' , + 'SNDZN3_INCR' , 'CATCHINCR_e0014' , + +:: +catch_progn_incr0015.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0015.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0015.mode: 'instantaneous', +catch_progn_incr0015.frequency: 030000, +catch_progn_incr0015.ref_time: 013000, +catch_progn_incr0015.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0015' , + 'TCFTRN_INCR' , 'CATCHINCR_e0015' , + 'TCFWLT_INCR' , 'CATCHINCR_e0015' , + 'QCFSAT_INCR' , 'CATCHINCR_e0015' , + 'QCFTRN_INCR' , 'CATCHINCR_e0015' , + 'QCFWLT_INCR' , 'CATCHINCR_e0015' , + 'CAPAC_INCR' , 'CATCHINCR_e0015' , + 'CATDEF_INCR' , 'CATCHINCR_e0015' , + 'RZEXC_INCR' , 'CATCHINCR_e0015' , + 'SRFEXC_INCR' , 'CATCHINCR_e0015' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0015' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0015' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0015' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0015' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0015' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0015' , + 'WESNN1_INCR' , 'CATCHINCR_e0015' , + 'WESNN2_INCR' , 'CATCHINCR_e0015' , + 'WESNN3_INCR' , 'CATCHINCR_e0015' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0015' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0015' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0015' , + 'SNDZN1_INCR' , 'CATCHINCR_e0015' , + 'SNDZN2_INCR' , 'CATCHINCR_e0015' , + 'SNDZN3_INCR' , 'CATCHINCR_e0015' , + +:: +catch_progn_incr0016.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0016.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0016.mode: 'instantaneous', +catch_progn_incr0016.frequency: 030000, +catch_progn_incr0016.ref_time: 013000, +catch_progn_incr0016.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0016' , + 'TCFTRN_INCR' , 'CATCHINCR_e0016' , + 'TCFWLT_INCR' , 'CATCHINCR_e0016' , + 'QCFSAT_INCR' , 'CATCHINCR_e0016' , + 'QCFTRN_INCR' , 'CATCHINCR_e0016' , + 'QCFWLT_INCR' , 'CATCHINCR_e0016' , + 'CAPAC_INCR' , 'CATCHINCR_e0016' , + 'CATDEF_INCR' , 'CATCHINCR_e0016' , + 'RZEXC_INCR' , 'CATCHINCR_e0016' , + 'SRFEXC_INCR' , 'CATCHINCR_e0016' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0016' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0016' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0016' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0016' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0016' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0016' , + 'WESNN1_INCR' , 'CATCHINCR_e0016' , + 'WESNN2_INCR' , 'CATCHINCR_e0016' , + 'WESNN3_INCR' , 'CATCHINCR_e0016' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0016' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0016' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0016' , + 'SNDZN1_INCR' , 'CATCHINCR_e0016' , + 'SNDZN2_INCR' , 'CATCHINCR_e0016' , + 'SNDZN3_INCR' , 'CATCHINCR_e0016' , + +:: +catch_progn_incr0017.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0017.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0017.mode: 'instantaneous', +catch_progn_incr0017.frequency: 030000, +catch_progn_incr0017.ref_time: 013000, +catch_progn_incr0017.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0017' , + 'TCFTRN_INCR' , 'CATCHINCR_e0017' , + 'TCFWLT_INCR' , 'CATCHINCR_e0017' , + 'QCFSAT_INCR' , 'CATCHINCR_e0017' , + 'QCFTRN_INCR' , 'CATCHINCR_e0017' , + 'QCFWLT_INCR' , 'CATCHINCR_e0017' , + 'CAPAC_INCR' , 'CATCHINCR_e0017' , + 'CATDEF_INCR' , 'CATCHINCR_e0017' , + 'RZEXC_INCR' , 'CATCHINCR_e0017' , + 'SRFEXC_INCR' , 'CATCHINCR_e0017' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0017' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0017' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0017' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0017' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0017' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0017' , + 'WESNN1_INCR' , 'CATCHINCR_e0017' , + 'WESNN2_INCR' , 'CATCHINCR_e0017' , + 'WESNN3_INCR' , 'CATCHINCR_e0017' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0017' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0017' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0017' , + 'SNDZN1_INCR' , 'CATCHINCR_e0017' , + 'SNDZN2_INCR' , 'CATCHINCR_e0017' , + 'SNDZN3_INCR' , 'CATCHINCR_e0017' , + +:: +catch_progn_incr0018.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0018.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0018.mode: 'instantaneous', +catch_progn_incr0018.frequency: 030000, +catch_progn_incr0018.ref_time: 013000, +catch_progn_incr0018.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0018' , + 'TCFTRN_INCR' , 'CATCHINCR_e0018' , + 'TCFWLT_INCR' , 'CATCHINCR_e0018' , + 'QCFSAT_INCR' , 'CATCHINCR_e0018' , + 'QCFTRN_INCR' , 'CATCHINCR_e0018' , + 'QCFWLT_INCR' , 'CATCHINCR_e0018' , + 'CAPAC_INCR' , 'CATCHINCR_e0018' , + 'CATDEF_INCR' , 'CATCHINCR_e0018' , + 'RZEXC_INCR' , 'CATCHINCR_e0018' , + 'SRFEXC_INCR' , 'CATCHINCR_e0018' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0018' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0018' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0018' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0018' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0018' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0018' , + 'WESNN1_INCR' , 'CATCHINCR_e0018' , + 'WESNN2_INCR' , 'CATCHINCR_e0018' , + 'WESNN3_INCR' , 'CATCHINCR_e0018' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0018' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0018' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0018' , + 'SNDZN1_INCR' , 'CATCHINCR_e0018' , + 'SNDZN2_INCR' , 'CATCHINCR_e0018' , + 'SNDZN3_INCR' , 'CATCHINCR_e0018' , + +:: +catch_progn_incr0019.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0019.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0019.mode: 'instantaneous', +catch_progn_incr0019.frequency: 030000, +catch_progn_incr0019.ref_time: 013000, +catch_progn_incr0019.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0019' , + 'TCFTRN_INCR' , 'CATCHINCR_e0019' , + 'TCFWLT_INCR' , 'CATCHINCR_e0019' , + 'QCFSAT_INCR' , 'CATCHINCR_e0019' , + 'QCFTRN_INCR' , 'CATCHINCR_e0019' , + 'QCFWLT_INCR' , 'CATCHINCR_e0019' , + 'CAPAC_INCR' , 'CATCHINCR_e0019' , + 'CATDEF_INCR' , 'CATCHINCR_e0019' , + 'RZEXC_INCR' , 'CATCHINCR_e0019' , + 'SRFEXC_INCR' , 'CATCHINCR_e0019' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0019' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0019' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0019' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0019' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0019' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0019' , + 'WESNN1_INCR' , 'CATCHINCR_e0019' , + 'WESNN2_INCR' , 'CATCHINCR_e0019' , + 'WESNN3_INCR' , 'CATCHINCR_e0019' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0019' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0019' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0019' , + 'SNDZN1_INCR' , 'CATCHINCR_e0019' , + 'SNDZN2_INCR' , 'CATCHINCR_e0019' , + 'SNDZN3_INCR' , 'CATCHINCR_e0019' , + +:: +catch_progn_incr0020.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0020.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0020.mode: 'instantaneous', +catch_progn_incr0020.frequency: 030000, +catch_progn_incr0020.ref_time: 013000, +catch_progn_incr0020.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0020' , + 'TCFTRN_INCR' , 'CATCHINCR_e0020' , + 'TCFWLT_INCR' , 'CATCHINCR_e0020' , + 'QCFSAT_INCR' , 'CATCHINCR_e0020' , + 'QCFTRN_INCR' , 'CATCHINCR_e0020' , + 'QCFWLT_INCR' , 'CATCHINCR_e0020' , + 'CAPAC_INCR' , 'CATCHINCR_e0020' , + 'CATDEF_INCR' , 'CATCHINCR_e0020' , + 'RZEXC_INCR' , 'CATCHINCR_e0020' , + 'SRFEXC_INCR' , 'CATCHINCR_e0020' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0020' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0020' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0020' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0020' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0020' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0020' , + 'WESNN1_INCR' , 'CATCHINCR_e0020' , + 'WESNN2_INCR' , 'CATCHINCR_e0020' , + 'WESNN3_INCR' , 'CATCHINCR_e0020' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0020' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0020' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0020' , + 'SNDZN1_INCR' , 'CATCHINCR_e0020' , + 'SNDZN2_INCR' , 'CATCHINCR_e0020' , + 'SNDZN3_INCR' , 'CATCHINCR_e0020' , + +:: +catch_progn_incr0021.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0021.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0021.mode: 'instantaneous', +catch_progn_incr0021.frequency: 030000, +catch_progn_incr0021.ref_time: 013000, +catch_progn_incr0021.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0021' , + 'TCFTRN_INCR' , 'CATCHINCR_e0021' , + 'TCFWLT_INCR' , 'CATCHINCR_e0021' , + 'QCFSAT_INCR' , 'CATCHINCR_e0021' , + 'QCFTRN_INCR' , 'CATCHINCR_e0021' , + 'QCFWLT_INCR' , 'CATCHINCR_e0021' , + 'CAPAC_INCR' , 'CATCHINCR_e0021' , + 'CATDEF_INCR' , 'CATCHINCR_e0021' , + 'RZEXC_INCR' , 'CATCHINCR_e0021' , + 'SRFEXC_INCR' , 'CATCHINCR_e0021' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0021' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0021' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0021' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0021' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0021' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0021' , + 'WESNN1_INCR' , 'CATCHINCR_e0021' , + 'WESNN2_INCR' , 'CATCHINCR_e0021' , + 'WESNN3_INCR' , 'CATCHINCR_e0021' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0021' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0021' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0021' , + 'SNDZN1_INCR' , 'CATCHINCR_e0021' , + 'SNDZN2_INCR' , 'CATCHINCR_e0021' , + 'SNDZN3_INCR' , 'CATCHINCR_e0021' , + +:: +catch_progn_incr0022.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0022.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0022.mode: 'instantaneous', +catch_progn_incr0022.frequency: 030000, +catch_progn_incr0022.ref_time: 013000, +catch_progn_incr0022.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0022' , + 'TCFTRN_INCR' , 'CATCHINCR_e0022' , + 'TCFWLT_INCR' , 'CATCHINCR_e0022' , + 'QCFSAT_INCR' , 'CATCHINCR_e0022' , + 'QCFTRN_INCR' , 'CATCHINCR_e0022' , + 'QCFWLT_INCR' , 'CATCHINCR_e0022' , + 'CAPAC_INCR' , 'CATCHINCR_e0022' , + 'CATDEF_INCR' , 'CATCHINCR_e0022' , + 'RZEXC_INCR' , 'CATCHINCR_e0022' , + 'SRFEXC_INCR' , 'CATCHINCR_e0022' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0022' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0022' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0022' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0022' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0022' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0022' , + 'WESNN1_INCR' , 'CATCHINCR_e0022' , + 'WESNN2_INCR' , 'CATCHINCR_e0022' , + 'WESNN3_INCR' , 'CATCHINCR_e0022' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0022' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0022' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0022' , + 'SNDZN1_INCR' , 'CATCHINCR_e0022' , + 'SNDZN2_INCR' , 'CATCHINCR_e0022' , + 'SNDZN3_INCR' , 'CATCHINCR_e0022' , + +:: +catch_progn_incr0023.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0023.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0023.mode: 'instantaneous', +catch_progn_incr0023.frequency: 030000, +catch_progn_incr0023.ref_time: 013000, +catch_progn_incr0023.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0023' , + 'TCFTRN_INCR' , 'CATCHINCR_e0023' , + 'TCFWLT_INCR' , 'CATCHINCR_e0023' , + 'QCFSAT_INCR' , 'CATCHINCR_e0023' , + 'QCFTRN_INCR' , 'CATCHINCR_e0023' , + 'QCFWLT_INCR' , 'CATCHINCR_e0023' , + 'CAPAC_INCR' , 'CATCHINCR_e0023' , + 'CATDEF_INCR' , 'CATCHINCR_e0023' , + 'RZEXC_INCR' , 'CATCHINCR_e0023' , + 'SRFEXC_INCR' , 'CATCHINCR_e0023' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0023' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0023' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0023' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0023' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0023' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0023' , + 'WESNN1_INCR' , 'CATCHINCR_e0023' , + 'WESNN2_INCR' , 'CATCHINCR_e0023' , + 'WESNN3_INCR' , 'CATCHINCR_e0023' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0023' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0023' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0023' , + 'SNDZN1_INCR' , 'CATCHINCR_e0023' , + 'SNDZN2_INCR' , 'CATCHINCR_e0023' , + 'SNDZN3_INCR' , 'CATCHINCR_e0023' , + +:: +catch_progn_incr0024.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0024.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0024.mode: 'instantaneous', +catch_progn_incr0024.frequency: 030000, +catch_progn_incr0024.ref_time: 013000, +catch_progn_incr0024.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0024' , + 'TCFTRN_INCR' , 'CATCHINCR_e0024' , + 'TCFWLT_INCR' , 'CATCHINCR_e0024' , + 'QCFSAT_INCR' , 'CATCHINCR_e0024' , + 'QCFTRN_INCR' , 'CATCHINCR_e0024' , + 'QCFWLT_INCR' , 'CATCHINCR_e0024' , + 'CAPAC_INCR' , 'CATCHINCR_e0024' , + 'CATDEF_INCR' , 'CATCHINCR_e0024' , + 'RZEXC_INCR' , 'CATCHINCR_e0024' , + 'SRFEXC_INCR' , 'CATCHINCR_e0024' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0024' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0024' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0024' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0024' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0024' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0024' , + 'WESNN1_INCR' , 'CATCHINCR_e0024' , + 'WESNN2_INCR' , 'CATCHINCR_e0024' , + 'WESNN3_INCR' , 'CATCHINCR_e0024' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0024' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0024' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0024' , + 'SNDZN1_INCR' , 'CATCHINCR_e0024' , + 'SNDZN2_INCR' , 'CATCHINCR_e0024' , + 'SNDZN3_INCR' , 'CATCHINCR_e0024' , + +:: +catch_progn_incr0025.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0025.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0025.mode: 'instantaneous', +catch_progn_incr0025.frequency: 030000, +catch_progn_incr0025.ref_time: 013000, +catch_progn_incr0025.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0025' , + 'TCFTRN_INCR' , 'CATCHINCR_e0025' , + 'TCFWLT_INCR' , 'CATCHINCR_e0025' , + 'QCFSAT_INCR' , 'CATCHINCR_e0025' , + 'QCFTRN_INCR' , 'CATCHINCR_e0025' , + 'QCFWLT_INCR' , 'CATCHINCR_e0025' , + 'CAPAC_INCR' , 'CATCHINCR_e0025' , + 'CATDEF_INCR' , 'CATCHINCR_e0025' , + 'RZEXC_INCR' , 'CATCHINCR_e0025' , + 'SRFEXC_INCR' , 'CATCHINCR_e0025' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0025' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0025' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0025' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0025' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0025' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0025' , + 'WESNN1_INCR' , 'CATCHINCR_e0025' , + 'WESNN2_INCR' , 'CATCHINCR_e0025' , + 'WESNN3_INCR' , 'CATCHINCR_e0025' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0025' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0025' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0025' , + 'SNDZN1_INCR' , 'CATCHINCR_e0025' , + 'SNDZN2_INCR' , 'CATCHINCR_e0025' , + 'SNDZN3_INCR' , 'CATCHINCR_e0025' , + +:: +catch_progn_incr0026.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0026.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0026.mode: 'instantaneous', +catch_progn_incr0026.frequency: 030000, +catch_progn_incr0026.ref_time: 013000, +catch_progn_incr0026.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0026' , + 'TCFTRN_INCR' , 'CATCHINCR_e0026' , + 'TCFWLT_INCR' , 'CATCHINCR_e0026' , + 'QCFSAT_INCR' , 'CATCHINCR_e0026' , + 'QCFTRN_INCR' , 'CATCHINCR_e0026' , + 'QCFWLT_INCR' , 'CATCHINCR_e0026' , + 'CAPAC_INCR' , 'CATCHINCR_e0026' , + 'CATDEF_INCR' , 'CATCHINCR_e0026' , + 'RZEXC_INCR' , 'CATCHINCR_e0026' , + 'SRFEXC_INCR' , 'CATCHINCR_e0026' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0026' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0026' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0026' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0026' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0026' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0026' , + 'WESNN1_INCR' , 'CATCHINCR_e0026' , + 'WESNN2_INCR' , 'CATCHINCR_e0026' , + 'WESNN3_INCR' , 'CATCHINCR_e0026' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0026' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0026' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0026' , + 'SNDZN1_INCR' , 'CATCHINCR_e0026' , + 'SNDZN2_INCR' , 'CATCHINCR_e0026' , + 'SNDZN3_INCR' , 'CATCHINCR_e0026' , + +:: +catch_progn_incr0027.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0027.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0027.mode: 'instantaneous', +catch_progn_incr0027.frequency: 030000, +catch_progn_incr0027.ref_time: 013000, +catch_progn_incr0027.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0027' , + 'TCFTRN_INCR' , 'CATCHINCR_e0027' , + 'TCFWLT_INCR' , 'CATCHINCR_e0027' , + 'QCFSAT_INCR' , 'CATCHINCR_e0027' , + 'QCFTRN_INCR' , 'CATCHINCR_e0027' , + 'QCFWLT_INCR' , 'CATCHINCR_e0027' , + 'CAPAC_INCR' , 'CATCHINCR_e0027' , + 'CATDEF_INCR' , 'CATCHINCR_e0027' , + 'RZEXC_INCR' , 'CATCHINCR_e0027' , + 'SRFEXC_INCR' , 'CATCHINCR_e0027' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0027' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0027' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0027' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0027' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0027' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0027' , + 'WESNN1_INCR' , 'CATCHINCR_e0027' , + 'WESNN2_INCR' , 'CATCHINCR_e0027' , + 'WESNN3_INCR' , 'CATCHINCR_e0027' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0027' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0027' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0027' , + 'SNDZN1_INCR' , 'CATCHINCR_e0027' , + 'SNDZN2_INCR' , 'CATCHINCR_e0027' , + 'SNDZN3_INCR' , 'CATCHINCR_e0027' , + +:: +catch_progn_incr0028.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0028.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0028.mode: 'instantaneous', +catch_progn_incr0028.frequency: 030000, +catch_progn_incr0028.ref_time: 013000, +catch_progn_incr0028.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0028' , + 'TCFTRN_INCR' , 'CATCHINCR_e0028' , + 'TCFWLT_INCR' , 'CATCHINCR_e0028' , + 'QCFSAT_INCR' , 'CATCHINCR_e0028' , + 'QCFTRN_INCR' , 'CATCHINCR_e0028' , + 'QCFWLT_INCR' , 'CATCHINCR_e0028' , + 'CAPAC_INCR' , 'CATCHINCR_e0028' , + 'CATDEF_INCR' , 'CATCHINCR_e0028' , + 'RZEXC_INCR' , 'CATCHINCR_e0028' , + 'SRFEXC_INCR' , 'CATCHINCR_e0028' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0028' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0028' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0028' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0028' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0028' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0028' , + 'WESNN1_INCR' , 'CATCHINCR_e0028' , + 'WESNN2_INCR' , 'CATCHINCR_e0028' , + 'WESNN3_INCR' , 'CATCHINCR_e0028' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0028' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0028' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0028' , + 'SNDZN1_INCR' , 'CATCHINCR_e0028' , + 'SNDZN2_INCR' , 'CATCHINCR_e0028' , + 'SNDZN3_INCR' , 'CATCHINCR_e0028' , + +:: +catch_progn_incr0029.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0029.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0029.mode: 'instantaneous', +catch_progn_incr0029.frequency: 030000, +catch_progn_incr0029.ref_time: 013000, +catch_progn_incr0029.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0029' , + 'TCFTRN_INCR' , 'CATCHINCR_e0029' , + 'TCFWLT_INCR' , 'CATCHINCR_e0029' , + 'QCFSAT_INCR' , 'CATCHINCR_e0029' , + 'QCFTRN_INCR' , 'CATCHINCR_e0029' , + 'QCFWLT_INCR' , 'CATCHINCR_e0029' , + 'CAPAC_INCR' , 'CATCHINCR_e0029' , + 'CATDEF_INCR' , 'CATCHINCR_e0029' , + 'RZEXC_INCR' , 'CATCHINCR_e0029' , + 'SRFEXC_INCR' , 'CATCHINCR_e0029' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0029' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0029' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0029' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0029' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0029' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0029' , + 'WESNN1_INCR' , 'CATCHINCR_e0029' , + 'WESNN2_INCR' , 'CATCHINCR_e0029' , + 'WESNN3_INCR' , 'CATCHINCR_e0029' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0029' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0029' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0029' , + 'SNDZN1_INCR' , 'CATCHINCR_e0029' , + 'SNDZN2_INCR' , 'CATCHINCR_e0029' , + 'SNDZN3_INCR' , 'CATCHINCR_e0029' , + +:: +catch_progn_incr0030.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0030.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0030.mode: 'instantaneous', +catch_progn_incr0030.frequency: 030000, +catch_progn_incr0030.ref_time: 013000, +catch_progn_incr0030.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0030' , + 'TCFTRN_INCR' , 'CATCHINCR_e0030' , + 'TCFWLT_INCR' , 'CATCHINCR_e0030' , + 'QCFSAT_INCR' , 'CATCHINCR_e0030' , + 'QCFTRN_INCR' , 'CATCHINCR_e0030' , + 'QCFWLT_INCR' , 'CATCHINCR_e0030' , + 'CAPAC_INCR' , 'CATCHINCR_e0030' , + 'CATDEF_INCR' , 'CATCHINCR_e0030' , + 'RZEXC_INCR' , 'CATCHINCR_e0030' , + 'SRFEXC_INCR' , 'CATCHINCR_e0030' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0030' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0030' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0030' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0030' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0030' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0030' , + 'WESNN1_INCR' , 'CATCHINCR_e0030' , + 'WESNN2_INCR' , 'CATCHINCR_e0030' , + 'WESNN3_INCR' , 'CATCHINCR_e0030' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0030' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0030' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0030' , + 'SNDZN1_INCR' , 'CATCHINCR_e0030' , + 'SNDZN2_INCR' , 'CATCHINCR_e0030' , + 'SNDZN3_INCR' , 'CATCHINCR_e0030' , + +:: +catch_progn_incr0031.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0031.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0031.mode: 'instantaneous', +catch_progn_incr0031.frequency: 030000, +catch_progn_incr0031.ref_time: 013000, +catch_progn_incr0031.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0031' , + 'TCFTRN_INCR' , 'CATCHINCR_e0031' , + 'TCFWLT_INCR' , 'CATCHINCR_e0031' , + 'QCFSAT_INCR' , 'CATCHINCR_e0031' , + 'QCFTRN_INCR' , 'CATCHINCR_e0031' , + 'QCFWLT_INCR' , 'CATCHINCR_e0031' , + 'CAPAC_INCR' , 'CATCHINCR_e0031' , + 'CATDEF_INCR' , 'CATCHINCR_e0031' , + 'RZEXC_INCR' , 'CATCHINCR_e0031' , + 'SRFEXC_INCR' , 'CATCHINCR_e0031' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0031' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0031' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0031' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0031' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0031' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0031' , + 'WESNN1_INCR' , 'CATCHINCR_e0031' , + 'WESNN2_INCR' , 'CATCHINCR_e0031' , + 'WESNN3_INCR' , 'CATCHINCR_e0031' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0031' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0031' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0031' , + 'SNDZN1_INCR' , 'CATCHINCR_e0031' , + 'SNDZN2_INCR' , 'CATCHINCR_e0031' , + 'SNDZN3_INCR' , 'CATCHINCR_e0031' , + +:: +catch_progn_incr0032.descr: 'Tile-space,3-Hourly,Instantaneous,Single-Level,Assimilation, Land Prognostics Increments', +catch_progn_incr0032.template: '%y4%m2%d2_%h2%n2z.bin', +catch_progn_incr0032.mode: 'instantaneous', +catch_progn_incr0032.frequency: 030000, +catch_progn_incr0032.ref_time: 013000, +catch_progn_incr0032.fields: 'TCFSAT_INCR' , 'CATCHINCR_e0032' , + 'TCFTRN_INCR' , 'CATCHINCR_e0032' , + 'TCFWLT_INCR' , 'CATCHINCR_e0032' , + 'QCFSAT_INCR' , 'CATCHINCR_e0032' , + 'QCFTRN_INCR' , 'CATCHINCR_e0032' , + 'QCFWLT_INCR' , 'CATCHINCR_e0032' , + 'CAPAC_INCR' , 'CATCHINCR_e0032' , + 'CATDEF_INCR' , 'CATCHINCR_e0032' , + 'RZEXC_INCR' , 'CATCHINCR_e0032' , + 'SRFEXC_INCR' , 'CATCHINCR_e0032' , + 'GHTCNT1_INCR' , 'CATCHINCR_e0032' , + 'GHTCNT2_INCR' , 'CATCHINCR_e0032' , + 'GHTCNT3_INCR' , 'CATCHINCR_e0032' , + 'GHTCNT4_INCR' , 'CATCHINCR_e0032' , + 'GHTCNT5_INCR' , 'CATCHINCR_e0032' , + 'GHTCNT6_INCR' , 'CATCHINCR_e0032' , + 'WESNN1_INCR' , 'CATCHINCR_e0032' , + 'WESNN2_INCR' , 'CATCHINCR_e0032' , + 'WESNN3_INCR' , 'CATCHINCR_e0032' , + 'HTSNNN1_INCR' , 'CATCHINCR_e0032' , + 'HTSNNN2_INCR' , 'CATCHINCR_e0032' , + 'HTSNNN3_INCR' , 'CATCHINCR_e0032' , + 'SNDZN1_INCR' , 'CATCHINCR_e0032' , + 'SNDZN2_INCR' , 'CATCHINCR_e0032' , + 'SNDZN3_INCR' , 'CATCHINCR_e0032' , + +:: + diff --git a/GEOSldas_App/LDASsa_DEFAULT_inputs_ensupd.nml b/GEOSldas_App/LDASsa_DEFAULT_inputs_ensupd.nml index ece206c4..b1c1764d 100644 --- a/GEOSldas_App/LDASsa_DEFAULT_inputs_ensupd.nml +++ b/GEOSldas_App/LDASsa_DEFAULT_inputs_ensupd.nml @@ -9,11 +9,10 @@ ! 7 May 2021 - removed "dtstep_assim" and "centered_update"; replaced with MAPL ! resource parameters "LANDASSIM_DT" and "LANDASSIM_T0" (in LDAS.rc) ! -! -------------------------------------------------------------------- +! ---------------------------------------------------------------------- &ens_upd_inputs - ! ---------------------------------------------------------------------- ! ! update type - for details see subroutine cat_enkf_update() @@ -23,18 +22,23 @@ ! ! # = no longer supported ! -! update_type = 0: NO assimilation, NO bias correction -! # update_type = 1: 1d soil moisture analysis; sfmc obs -! # update_type = 2: 3d soil moisture analysis; sfmc obs -! update_type = 3: 1d Tskin (assim incr NOT applied, use w/ bias corr) analysis; Tskin obs -! update_type = 4: 1d Tskin/ght1 (assim incr applied, use w/ or w/o bias corr) analysis; Tskin obs -! update_type = 5: 1d Tskin/ght1 (assim incr NOT applied, use w/ bias corr) analysis; Tskin obs -! update_type = 6: 1d soil moisture/Tskin/ght(1); TB obs -! update_type = 7: 3d Tskin/ght1 update; Tskin obs -! update_type = 8: 3d soil moisture/Tskin/ght(1); TB obs -! update_type = 9: 1d Tskin/ght1 update; FT obs -! update_type = 10: 3d soil moisture/Tskin/ght(1) excl. catdef unless PEATCLSM tile; TB obs -! update_type = 13: 3d soil moisture/Tskin/ght(1) excl. catdef unless PEATCLSM tile; sfmc and TB obs +! update_type | analysis state vector | assimilated obs +! ------------------------------------------------------------------------------------------------- +! 0 | NO assimilation, NO bias correction | n/a +! # 1 | 1d soil moisture | sfmc +! # 2 | 3d soil moisture | sfmc +! 3 | 1d Tskin (assim incr NOT applied, use w/ bias corr) | Tskin +! 4 | 1d Tskin/ght1 (assim incr applied, use w/ or w/o bias corr) | Tskin +! 5 | 1d Tskin/ght1 (assim incr NOT applied, use w/ bias corr) | Tskin +! 6 | 1d soil moisture/Tskin/ght(1) | Tb +! 7 | 3d Tskin/ght1 update | Tskin +! 8 | 3d soil moisture/Tskin/ght(1) | Tb +! 9 | 1d Tskin/ght1 update | FT +! 10 | 3d soil moisture/Tskin/ght(1) excl. catdef unless PEATCLSM tile | Tb +! 11 | 1d snow analysis (Toure et al. 2018 empirical gain) | SCF +! 12 | 3d soil moisture/Tskin/ght(1) excl. catdef unless PEATCLSM tile | sfmc/sfds, Tb, SCF +! | & 1d snow analysis (Toure et al. 2018 empirical gain) | +! 13 | 3d soil moisture/Tskin/ght(1) excl. catdef unless PEATCLSM tile | sfmc/sfds, Tb update_type = 0 @@ -2154,7 +2158,13 @@ obs_param_nml(48)%xcorr = 0.1875 obs_param_nml(48)%ycorr = 0.1875 obs_param_nml(48)%adapt = 0 -! -------------------------------------------------------------------- +! -------------------------------------------------------------------------------------------------------------- +! +! ASCAT_MET[X]_SM soil moisture observations from EUMETSAT +! +! Leave %name blank. Provide text files that contain file names via %flistpath and %flistname. +! +! ------------------- ! ! 49 = ASCAT_META_SM (ASCAT soil moisture ascending and descending orbits) ! @@ -2178,7 +2188,7 @@ obs_param_nml(49)%nodata = -9999. obs_param_nml(49)%varname = 'sfds' obs_param_nml(49)%units = '%' obs_param_nml(49)%path = '/discover/nobackup/projects/gmao/smap/SMAP_Nature/ASCAT_EUMETSAT/Metop_A/' -obs_param_nml(49)%name = 'M02-ASCA-ASCSMO02' +obs_param_nml(49)%name = '' obs_param_nml(49)%maskpath = '' obs_param_nml(49)%maskname = '' obs_param_nml(49)%scalepath = '' @@ -2217,7 +2227,7 @@ obs_param_nml(50)%nodata = -9999. obs_param_nml(50)%varname = 'sfds' obs_param_nml(50)%units = '%' obs_param_nml(50)%path = '/discover/nobackup/projects/gmao/smap/SMAP_Nature/ASCAT_EUMETSAT/Metop_B/' -obs_param_nml(50)%name = 'M01-ASCA-ASCSMO02' +obs_param_nml(50)%name = '' obs_param_nml(50)%maskpath = '' obs_param_nml(50)%maskname = '' obs_param_nml(50)%scalepath = '' @@ -2256,7 +2266,7 @@ obs_param_nml(51)%nodata = -9999. obs_param_nml(51)%varname = 'sfds' obs_param_nml(51)%units = '%' obs_param_nml(51)%path = '/discover/nobackup/projects/gmao/smap/SMAP_Nature/ASCAT_EUMETSAT/Metop_C/' -obs_param_nml(51)%name = 'M03-ASCA-ASCSMO02' +obs_param_nml(51)%name = '' obs_param_nml(51)%maskpath = '' obs_param_nml(51)%maskname = '' obs_param_nml(51)%scalepath = '' @@ -2353,9 +2363,87 @@ obs_param_nml(53)%xcorr = 0. obs_param_nml(53)%ycorr = 0. obs_param_nml(53)%adapt = 0 +! -------------------------------------------------------------------------------------------------------------- +! +! 54 = CYGNSS_SM_6hr (CYGNSS Level 3 soil moisture version 3.2) +! +! https://podaac.jpl.nasa.gov/dataset/CYGNSS_L3_SOIL_MOISTURE_V3.2 + +obs_param_nml(54)%descr = 'CYGNSS_SM_6hr' +obs_param_nml(54)%orbit = 3 +obs_param_nml(54)%pol = 0 +obs_param_nml(54)%N_ang = 0 +obs_param_nml(54)%freq = 0 +obs_param_nml(54)%FOV = 20. +obs_param_nml(54)%FOV_units = 'km' +obs_param_nml(54)%assim = .false. +obs_param_nml(54)%scale = .false. +obs_param_nml(54)%getinnov = .false. +obs_param_nml(54)%RTM_ID = 0 +obs_param_nml(54)%bias_Npar = 0 +obs_param_nml(54)%bias_trel = 864000 +obs_param_nml(54)%bias_tcut = 432000 +obs_param_nml(54)%nodata = -9999. +obs_param_nml(54)%varname = 'sfmc' +obs_param_nml(54)%units = 'm3 m-3' +obs_param_nml(54)%path = '/discover/nobackup/projects/gmao/smap/SMAP_Nature/CYGNSS/' +obs_param_nml(54)%name = '' +obs_param_nml(54)%maskpath = '' +obs_param_nml(54)%maskname = '' +obs_param_nml(54)%scalepath = '' +obs_param_nml(54)%scalename = '' +obs_param_nml(54)%flistpath = '' +obs_param_nml(54)%flistname = '' +obs_param_nml(54)%errstd = 0.04 +obs_param_nml(54)%std_normal_max = 2.5 +obs_param_nml(54)%zeromean = .true. +obs_param_nml(54)%coarsen_pert = .true. +obs_param_nml(54)%xcorr = 0.25 +obs_param_nml(54)%ycorr = 0.25 +obs_param_nml(54)%adapt = 0 + +! -------------------------------------------------------------------------------------------------------------- +! +! 55 = CYGNSS_SM_daily (CYGNSS Level 3 soil moisture version 3.2) +! +! https://podaac.jpl.nasa.gov/dataset/CYGNSS_L3_SOIL_MOISTURE_V3.2 + +obs_param_nml(55)%descr = 'CYGNSS_SM_daily' +obs_param_nml(55)%orbit = 3 +obs_param_nml(55)%pol = 0 +obs_param_nml(55)%N_ang = 0 +obs_param_nml(55)%freq = 0 +obs_param_nml(55)%FOV = 20. +obs_param_nml(55)%FOV_units = 'km' +obs_param_nml(55)%assim = .false. +obs_param_nml(55)%scale = .false. +obs_param_nml(55)%getinnov = .false. +obs_param_nml(55)%RTM_ID = 0 +obs_param_nml(55)%bias_Npar = 0 +obs_param_nml(55)%bias_trel = 864000 +obs_param_nml(55)%bias_tcut = 432000 +obs_param_nml(55)%nodata = -9999. +obs_param_nml(55)%varname = 'sfmc' +obs_param_nml(55)%units = 'm3 m-3' +obs_param_nml(55)%path = '/discover/nobackup/projects/gmao/smap/SMAP_Nature/CYGNSS/' +obs_param_nml(55)%name = '' +obs_param_nml(55)%maskpath = '' +obs_param_nml(55)%maskname = '' +obs_param_nml(55)%scalepath = '' +obs_param_nml(55)%scalename = '' +obs_param_nml(55)%flistpath = '' +obs_param_nml(55)%flistname = '' +obs_param_nml(55)%errstd = 0.04 +obs_param_nml(55)%std_normal_max = 2.5 +obs_param_nml(55)%zeromean = .true. +obs_param_nml(55)%coarsen_pert = .true. +obs_param_nml(55)%xcorr = 0.25 +obs_param_nml(55)%ycorr = 0.25 +obs_param_nml(55)%adapt = 0 ! -------------------------------------------------------------------- + / ! =========================== EOF ======================================= diff --git a/GEOSldas_App/ldas_setup b/GEOSldas_App/ldas_setup index 0c495d89..aeb152d4 100755 --- a/GEOSldas_App/ldas_setup +++ b/GEOSldas_App/ldas_setup @@ -51,12 +51,6 @@ class LDASsetup: 'MINLON','MAXLON','MINLAT','MAXLAT','EXCLUDE_FILE','INCLUDE_FILE','MWRTM_PATH','GRIDNAME', 'ADAS_EXPDIR', 'BCS_RESOLUTION' ] - # if built on sles15, BUILT_ON_SLES15 is "TRUE", else empty "" - BUILT_ON_SLES15 = "@BUILT_ON_SLES15@" - if BUILT_ON_SLES15 == "TRUE": - self.BUILT_ON_SLES15 = True - else: - self.BUILT_ON_SLES15 = False self.GEOS_SITE = "@GEOS_SITE@" @@ -94,6 +88,8 @@ class LDASsetup: exphome_ = cmdLineArgs['exphome'].rstrip('/') assert os.path.isdir(exphome_) # exphome should exist self.exphome = os.path.abspath(exphome_) + self.nymdb = cmdLineArgs['nymdb'] + self.nhmsb = cmdLineArgs['nhmsb'] self.verbose = cmdLineArgs['verbose'] self.runmodel = cmdLineArgs['runmodel'] if self.runmodel : @@ -153,6 +149,9 @@ class LDASsetup: for key in rqdExeInpKeys : assert key in self.rqdExeInp,' "%s" is required in the input file %s' % (key,self.exeinpfile) + if cmdLineArgs['nymdb'] != 'None' and cmdLineArgs['nhmsb'] != 'None' : + self.date = f"{self.nymdb} {self.nhmsb}" + self.rqdExeInp[ 'BEG_DATE' ] = self.date # print rqd exe inputs if self.verbose: @@ -167,9 +166,17 @@ class LDASsetup: _mydir = None self.ladas_coupling = int(self.rqdExeInp.get('LADAS_COUPLING',0)) self.adas_expdir ='' - if self.ladas_coupling > 0: - assert 'ADAS_EXPDIR' in self.rqdExeInp, " need ADAS_EXPDIR in the input file %s" %(self.exeinpfile) - self.adas_expdir = self.rqdExeInp['ADAS_EXPDIR'] + if self.ladas_coupling > 0 : + self.adas_expdir = os.path.dirname(self.exphome) + self.rqdExeInp[ 'ADAS_EXPDIR'] = self.adas_expdir + self.adas_expid = os.path.basename(self.adas_expdir) + self.rqdExeInp[ 'MET_TAG' ] = self.adas_expid + '__bkg' + if self.ladas_coupling == 1 : + self.rqdExeInp[ 'EXP_ID' ] = self.adas_expid + '_LDAS' + if self.ladas_coupling == 2 : + self.rqdExeInp[ 'EXP_ID' ] = self.adas_expid + '_LDAS4ens' + self.rqdExeInp[ 'MET_PATH' ] = self.adas_expdir +'/atmens/mem' + self.first_ens_id = int(self.rqdExeInp.get('FIRST_ENS_ID',0)) self.perturb = int(self.rqdExeInp.get('PERTURBATIONS',0)) if self.nens > 1: @@ -705,10 +712,7 @@ class LDASsetup: print ('\nCorrect the tile file if it is an old EASE tile format... \n') EASEtile=self.bcsdir+'/MAPL_'+short_tile cmd = self.bindir + '/preprocess_ldas.x correctease '+ tile + ' '+ EASEtile - if self.BUILT_ON_SLES15 : - print ("Executables were built on SLES15 and must be run on SLES15: " + cmd) - else: - print ("cmd: " + cmd) + print ("cmd: " + cmd) sp.call(shlex.split(cmd)) @@ -1079,7 +1083,7 @@ class LDASsetup: # DEFAULT rc files default_rc = glob.glob(etcdir+'/GEOSldas_*.rc') - assert len(default_rc)==4 + assert len(default_rc)==6 print (default_rc) for rcfile in default_rc: shortfile=rcfile.rsplit('GEOSldas_',1)[1] @@ -1112,6 +1116,25 @@ class LDASsetup: sp.call(shlex.split(cmd)) for line in fileinput.input(tmprcfile,inplace=True): print (line.rstrip().replace('GEOSldas_expid',self.rqdExeInp['EXP_ID'])) + + # take HISTdet or HISTens if ladas + if shortfile =='HISTdet.rc' and self.ladas_coupling == 1 : + tmprcfile=self.rundir+'/HISTORY.rc' + histrc_file=rcfile + shutil.copy2(rcfile, tmprcfile) + for line in fileinput.input(tmprcfile,inplace=True): + print (line.rstrip().replace('GEOSldas_expid',self.rqdExeInp['EXP_ID'])) + for line in fileinput.input(tmprcfile,inplace=True): + print (line.rstrip().replace('GRIDNAME',self.rqdExeInp['GRIDNAME'])) + if shortfile =='HISTens.rc' and self.ladas_coupling == 2 : + tmprcfile=self.rundir+'/HISTORY.rc' + histrc_file=rcfile + shutil.copy2(rcfile, tmprcfile) + for line in fileinput.input(tmprcfile,inplace=True): + print (line.rstrip().replace('GEOSldas_expid',self.rqdExeInp['EXP_ID'])) + for line in fileinput.input(tmprcfile,inplace=True): + print (line.rstrip().replace('GRIDNAME',self.rqdExeInp['GRIDNAME'])) + # just copy an empty ExtData.rc if shortfile=='ExtData.rc' : shutil.copy2(rcfile, self.rundir+'/'+shortfile) @@ -1358,10 +1381,8 @@ class LDASsetup: constraint='cas' if self.GEOS_SITE == "NAS": constraint = 'cas_ait' - elif self.BUILT_ON_SLES15: - constraint = 'mil' - else: - assert int(self.rqdRmInp['ntasks-per-node']) <= 46, 'ntasks-per-node should be <=46 for cas' + elif self.GEOS_SITE == "NCCS": + constraint = '"[mil|cas]"' SBATCHQSUB = 'sbatch' if self.GEOS_SITE == 'NAS': @@ -1393,7 +1414,6 @@ class LDASsetup: MY_ADAS_EXPDIR = self.adas_expdir, MY_EXPDIR = self.expdir, DETECTED_MPI_STACK = DETECTED_MPI_STACK, - BUILT_ON_SLES15 = str(self.BUILT_ON_SLES15).upper() ) with open('lenkf.j','wt') as fout : @@ -1504,6 +1524,11 @@ def _printExeInputKeys(rqdExeInpKeys): print ('# #') print ('# Surface meteorological forcing time step is in seconds. #') print ('# #') + print ('# NOTE: #') + print ('# When forcing is on cube-sphere (CS) grid, must use: #') + print ('# - Model tile space (BCS) derived from same CS grid. #') + print ('# - Nearest-neighbor interpolation (MET_HINTERP: 0). #') + print ('# #') print ('# For more information, see: #') print ('# GEOSldas/doc/README.MetForcing_and_BCS.md #') print ('# #') @@ -1548,14 +1573,12 @@ def _printExeInputKeys(rqdExeInpKeys): print ('# #') print ('# (2) EXP_DOMAIN must be global CS grid as in ADAS exp #') print ('# #') - print ('# (3) MET_TAG must be set to [ADAS_EXPID]__Nx+- #') + print ('# (3) MET_TAG must be set to [ADAS_EXPID]__bkg #') print ('# MET_PATH must be set as follows for #') print ('# LADAS_COUPLING = 1: #') - print ('# [full_path]/[LDAS_EXPID]/scratch/ #') + print ('# ../../../../recycle/holdpredout/ #') print ('# LADAS_COUPLING = 2: #') - print ('# [ADAS_EXPDIR]/atmens/ensdiag/forc #') - print ('# After ldas exp setup, verify the following link: #') - print ('# ../input/met_forcing/forc -> [MET_PATH] #') + print ('# [ADAS_EXPDIR]/atmens/mem #') print ('# #') print ('# (4) BCS_PATH must be consistent with that of #') print ('# [ADAS_EXPDIR][/run/lnbcs #') @@ -1705,6 +1728,16 @@ def parseCmdLine(): help='replace computing/sponsor account in batinp file', type=str, default='None' ) + p_setup.add_argument( + '--nymdb', + help='replaces BEG_DATE date in exeinp file ', + type=str, default='None' + ) + p_setup.add_argument( + '--nhmsb', + help='replaces BEG_DATE time in exeinp file ', + type=str, default='None' + ) p_setup.add_argument( '--runmodel', help='Obsolete.', diff --git a/GEOSldas_App/lenkf_j_template.py b/GEOSldas_App/lenkf_j_template.py index 0182edb0..6dcee191 100644 --- a/GEOSldas_App/lenkf_j_template.py +++ b/GEOSldas_App/lenkf_j_template.py @@ -87,12 +87,8 @@ else if ( ${{MPI_STACK}} == "intelmpi" ) then - setenv BUILT_ON_SLES15 {BUILT_ON_SLES15} - - if ( ${{BUILT_ON_SLES15}} == TRUE ) then - setenv I_MPI_FABRICS shm:ofi - setenv I_MPI_OFI_PROVIDER psm3 - endif # BUILT_ON_SLES15 + setenv I_MPI_FABRICS shm:ofi + setenv I_MPI_OFI_PROVIDER psm3 endif # MPI_STACK @@ -179,11 +175,6 @@ setenv GRID $forcgrid $GEOSBIN/enpert_forc.csh cd $SCRDIR - else - - # move central-simulation forcing held in met_forcing to scratch dir - echo "move lfo_Nx+- met forcing from $EXPDIR/input/met_forcing to $SCRDIR" - /bin/mv $EXPDIR/input/met_forcing/*lfo_Nx+-*nc4 $SCRDIR/. endif endif diff --git a/GEOSldas_App/preprocess_ldas_routines.F90 b/GEOSldas_App/preprocess_ldas_routines.F90 index 70af1d7a..ea34807c 100644 --- a/GEOSldas_App/preprocess_ldas_routines.F90 +++ b/GEOSldas_App/preprocess_ldas_routines.F90 @@ -409,7 +409,7 @@ subroutine domain_setup( & ! locals - integer :: n, this_tileid, this_catpfaf, N_exclude, N_include, indomain, rc + integer :: n, this_tileid, N_exclude, N_include, indomain, rc integer, dimension(N_cat_global) :: ExcludeList, IncludeList, tmp_d2g @@ -2964,7 +2964,7 @@ subroutine LDAS_read_til_file( tile_file, catch_file, tile_grid_g, tile_coord_la read (tmpline,*) & tile_coord(i)%typ, & ! 1 - tile_coord(i)%pfaf, & ! 2 + tile_coord(i)%pfaf_index, & ! 2 tile_coord(i)%com_lon, & ! 3 tile_coord(i)%com_lat, & ! 4 tile_coord(i)%i_indg, & ! 5 @@ -2985,7 +2985,7 @@ subroutine LDAS_read_til_file( tile_file, catch_file, tile_grid_g, tile_coord_la read (tmpline,*) & tile_coord(i)%typ, & ! 1 - tile_coord(i)%pfaf, & ! 2 * + tile_coord(i)%pfaf_index, & ! 2 * tile_coord(i)%com_lon, & ! 3 tile_coord(i)%com_lat, & ! 4 tile_coord(i)%i_indg, & ! 5 @@ -3009,7 +3009,7 @@ subroutine LDAS_read_til_file( tile_file, catch_file, tile_grid_g, tile_coord_la tile_coord(i)%j_indg, & ! 6 tile_coord(i)%frac_cell, & ! 7 tmpint1, & ! 8 - tile_coord(i)%pfaf, & ! 9 * + tile_coord(i)%pfaf_index, & ! 9 * tmpint2, & ! 10 tile_coord(i)%frac_pfaf, & ! 11 tmpint3 ! 12 * (previously "tile_id") @@ -3250,7 +3250,7 @@ subroutine read_catchment_def( catchment_def_file, N_tile, tile_coord ) ! ! Header line: N_tile ! - ! Columns: tile_id, Pfaf, min_lon, max_lon, min_lat, max_lat, [elev] + ! Columns: tile_id, pfaf_index, min_lon, max_lon, min_lat, max_lat, [elev] ! ! Elevation [m] is ONLY available for EASE grid tile definitions @@ -3266,7 +3266,7 @@ subroutine read_catchment_def( catchment_def_file, N_tile, tile_coord ) integer :: i, istat, tmpint1, sweep - integer, dimension(N_tile) :: tmp_tileid, tmp_pfaf + integer, dimension(N_tile) :: tmp_tileid, tmp_pfafindex character(len=*), parameter :: Iam = 'read_catchment_def' character(len=400) :: err_msg @@ -3305,7 +3305,7 @@ subroutine read_catchment_def( catchment_def_file, N_tile, tile_coord ) ! read 7 columns, avoid using exact format specification - read (10,*, iostat=istat) tmp_tileid(i), tmp_pfaf(i), & + read (10,*, iostat=istat) tmp_tileid(i), tmp_pfafindex(i), & tile_coord(i)%min_lon, & tile_coord(i)%max_lon, & tile_coord(i)%min_lat, & @@ -3316,7 +3316,7 @@ subroutine read_catchment_def( catchment_def_file, N_tile, tile_coord ) ! read 6 columns, avoid using exact format specification - read (10,*, iostat=istat) tmp_tileid(i), tmp_pfaf(i), & + read (10,*, iostat=istat) tmp_tileid(i), tmp_pfafindex(i), & tile_coord(i)%min_lon, & tile_coord(i)%max_lon, & tile_coord(i)%min_lat, & @@ -3358,8 +3358,8 @@ subroutine read_catchment_def( catchment_def_file, N_tile, tile_coord ) end do ! loop through sweeps - if ( any(tile_coord(1:N_tile)%tile_id/=tmp_tileid) .or. & - any(tile_coord(1:N_tile)%pfaf /=tmp_pfaf) ) then + if ( any(tile_coord(1:N_tile)%tile_id /=tmp_tileid) .or. & + any(tile_coord(1:N_tile)%pfaf_index/=tmp_pfafindex) ) then err_msg = 'tile_coord_file and catchment_def_file mismatch. (2)' call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) diff --git a/GEOSldas_App/process_hist.csh b/GEOSldas_App/process_hist.csh old mode 100755 new mode 100644 index 73d3b421..4c6516ff --- a/GEOSldas_App/process_hist.csh +++ b/GEOSldas_App/process_hist.csh @@ -54,12 +54,12 @@ endif if($NENS > 1) then set GridComp = ENSAVG sed -i 's|VEGDYN|'VEGDYN_e0000'|g' $HISTRC - sed -i 's|TP1|'TSOIL1TILE'|g' $HISTRC - sed -i 's|TP2|'TSOIL2TILE'|g' $HISTRC - sed -i 's|TP3|'TSOIL3TILE'|g' $HISTRC - sed -i 's|TP4|'TSOIL4TILE'|g' $HISTRC - sed -i 's|TP5|'TSOIL5TILE'|g' $HISTRC - sed -i 's|TP6|'TSOIL6TILE'|g' $HISTRC +# sed -i 's|TP1|'TSOIL1TILE'|g' $HISTRC +# sed -i 's|TP2|'TSOIL2TILE'|g' $HISTRC +# sed -i 's|TP3|'TSOIL3TILE'|g' $HISTRC +# sed -i 's|TP4|'TSOIL4TILE'|g' $HISTRC +# sed -i 's|TP5|'TSOIL5TILE'|g' $HISTRC +# sed -i 's|TP6|'TSOIL6TILE'|g' $HISTRC # sed -i 's|DATAATM|'DATAATM0000'|g' $HISTRC endif diff --git a/GEOSldas_App/sample_config_files/LADAS/exeinp.txt.Hy4dEnVar.atmens b/GEOSldas_App/sample_config_files/LADAS/exeinp.txt.Hy4dEnVar.atmens index bf4e17a9..410505dd 100644 --- a/GEOSldas_App/sample_config_files/LADAS/exeinp.txt.Hy4dEnVar.atmens +++ b/GEOSldas_App/sample_config_files/LADAS/exeinp.txt.Hy4dEnVar.atmens @@ -9,16 +9,27 @@ # # (2) Use the resource parameter settings below when editing MY_exeinp.txt # +# (3) The following resource parameters are provided via fvsetup, +# which supersede the default in MY_exeinp.txt: +# ADAS_EXPDIR +# ADAS_EXPID +# EXP_ID +# MET_TAG +# BEG_DATE +# GID ############################################################################## -NUM_LDAS_ENSEMBLE: [NUM_ATM_ENSEMBLE] +# e.g., ATMENS_AGCM_GRID = CF0090x6C +EXP_DOMAIN: [ATMENS_AGCM_GRID]_GLOBAL + +NUM_LDAS_ENSEMBLE: [NUM_ATMENS_ENSEMBLE] LADAS_COUPLING: 2 -ADAS_EXPDIR: [full_path]/[ADAS_EXPDIR] +ADAS_EXPDIR: [full_path]/[ADAS_EXPID] -MET_TAG: [ADAS_EXPID]__Nx+- -MET_PATH: [ADAS_EXPDIR]/atmens/ensdiag/mem +MET_TAG: [ADAS_EXPID]__bkg +MET_PATH: [ADAS_EXPDIR]/atmens/mem MET_HINTERP: 0 diff --git a/GEOSldas_App/sample_config_files/LADAS/exeinp.txt.Hy4dEnVar.central b/GEOSldas_App/sample_config_files/LADAS/exeinp.txt.Hy4dEnVar.central index c30c880a..0c682821 100644 --- a/GEOSldas_App/sample_config_files/LADAS/exeinp.txt.Hy4dEnVar.central +++ b/GEOSldas_App/sample_config_files/LADAS/exeinp.txt.Hy4dEnVar.central @@ -7,16 +7,27 @@ # (1) Create exeinp template using: # ldas_setup sample --exeinp > MY_exeinp.txt # -# (2) Use the resource parameter settings below when editing MY_exeinp.txt +# (2) Use the resource parameter settings below when editing MY_exeinp.txt # +# (3) The following resource parameters are provided via fvsetup, +# which supersede the default in MY_exeinp.txt +# ADAS_EXPDIR +# ADAS_EXPID +# EXP_ID +# MET_TAG +# BEG_DATE +# GID ############################################################################## +# e.g., CENTRAL_AGCM_GRID = CF0360x6C +EXP_DOMAIN: [CENTRAL_AGCM_GRID]_GLOBAL + LADAS_COUPLING: 1 -ADAS_EXPDIR: [full_path]/[ADAS_EXPDIR] +ADAS_EXPDIR: [full_path]/[ADAS_EXPID] -MET_TAG: [ADAS_EXPID]__Nx+- -MET_PATH: ../../scratch +MET_TAG: [ADAS_EXPID]__bkg +MET_PATH: ../../../../recycle/holdpredout # option to use perturbed forcing created from central simulation and atm ensemble # MET_PATH: [ADAS_EXPDIR]/atmens/rgdlfo diff --git a/GEOSldas_App/tile_bin2nc4.F90 b/GEOSldas_App/tile_bin2nc4.F90 index df52c8be..cf3f2fbc 100644 --- a/GEOSldas_App/tile_bin2nc4.F90 +++ b/GEOSldas_App/tile_bin2nc4.F90 @@ -3,18 +3,21 @@ PROGRAM tile_bin2nc4 implicit none INCLUDE 'netcdf.inc' - integer :: i,k, n, NTILES - integer :: NCFOutID, Vid, STATUS, CellID, TimID, nVars - character(256) :: Usage="tile_bin2nc4.x BINFILE DESCRIPTOR TILECOORD" + integer :: i,k, n, NTILES + integer :: NCFOutID, Vid, STATUS, CellID, TimID, nVars + character(256) :: Usage="tile_bin2nc4.x BINFILE DESCRIPTOR TILECOORD" ! DESCRIPTOR = GrADS ctl file generated by MAPL from HISTORY.rc character(512) :: BINFILE, TILECOORD, DESCRIPTOR, arg(3) character(128) :: MYNAME, BUF - integer, dimension(8) :: date_time_values + + integer, dimension(8) :: date_time_values character (22) :: time_stamp - real, allocatable, dimension (:) :: lons, lats, var + real, allocatable, dimension (:) :: lons, lats, var integer, allocatable, dimension (:) :: tileid, i_index, j_index + integer :: myunit1, myunit2 - real :: undef - ! processing command line agruments + real :: undef + + ! process command line arguments I = command_argument_count() @@ -28,7 +31,8 @@ PROGRAM tile_bin2nc4 call get_command_argument(n,arg(n)) enddo - call get_environment_variable ("MYNAME" ,MYNAME ) + call get_environment_variable ("MYNAME", MYNAME) + read(arg(1),'(a)') BINFILE read(arg(2),'(a)') DESCRIPTOR read(arg(3),'(a)') TILECOORD @@ -38,10 +42,11 @@ PROGRAM tile_bin2nc4 ! print *,trim(DESCRIPTOR) ! print *,trim(TILECOORD) - ! reading TILECOORD + ! read TILECOORD file open (newunit=myunit1, file = trim(TILECOORD), form = 'unformatted', action ='read') read (myunit1) NTILES + allocate (lons (1:NTILES)) allocate (lats (1:NTILES)) allocate (tileid (1:NTILES)) @@ -63,7 +68,7 @@ PROGRAM tile_bin2nc4 close (myunit1,status = 'keep') - ! read binary and write NC4 + ! read DESCRIPTOR file (=GrADS ctl file generated by MAPL from HISTORY.rc file) open (newunit=myunit1, file = trim(DESCRIPTOR), form ='formatted', action = 'read') nVars = 0 @@ -86,6 +91,8 @@ PROGRAM tile_bin2nc4 end do + ! prep nc4 file + status = NF_CREATE (trim(BINFILE)//'.nc4', NF_NETCDF4, NCFOutID) status = NF_DEF_DIM(NCFOutID, 'tile' , NTILES, CellID) status = NF_DEF_DIM(NCFOutID, 'time' , NF_UNLIMITED, TimID) @@ -102,8 +109,8 @@ PROGRAM tile_bin2nc4 status = NF_DEF_VAR(NCFOutID, 'JG' , NF_INT, 1 ,CellID, vid) status = NF_PUT_ATT_TEXT(NCFOutID, vid, 'long_name', & LEN_TRIM('J_INDEX'), 'J_INDEX') - do n = 1, nVars + do n = 1, nVars read(myunit1, '(a)', iostat=status) buf status = NF_DEF_VAR(NCFOutID,buf(1:index(buf,' ') -1) , NF_FLOAT, 2 ,(/CellID, TimID/), vid) status = NF_PUT_ATT_TEXT(NCFOutID, vid, 'long_name', & @@ -115,7 +122,6 @@ PROGRAM tile_bin2nc4 status = nf_put_att_real(NCFOutID, vid, '_FillValue',NF_FLOAT, 1, undef) end do - call date_and_time(VALUES=date_time_values) write (time_stamp,'(i4.4,a1,i2.2,a1,i2.2,1x,a2,1x,i2.2,a1,i2.2,a1,i2.2)') & @@ -133,7 +139,7 @@ PROGRAM tile_bin2nc4 status = NF_PUT_VARA_INT (NCFOutID,VarID(NCFOutID,'IG' ) ,(/1/),(/NTILES/),i_index ) status = NF_PUT_VARA_INT (NCFOutID,VarID(NCFOutID,'JG' ) ,(/1/),(/NTILES/),j_index ) - ! reading and writing + ! read data from binary file and write into nc4 file open (newunit=myunit2, file = trim(BINFILE)//'.bin', form = 'unformatted', action = 'read') @@ -152,47 +158,47 @@ PROGRAM tile_bin2nc4 close (myunit1) close (myunit2) - contains - - ! ---------------------------------------------------------------------- - - integer function VarID (NCFID, VNAME) - - integer, intent (in) :: NCFID - character(*), intent (in) :: VNAME - integer :: status - - STATUS = NF_INQ_VARID (NCFID, trim(VNAME) ,VarID) - IF (STATUS .NE. NF_NOERR) & - CALL HANDLE_ERR(STATUS, trim(VNAME)) - - end function VarID - +contains + + ! ---------------------------------------------------------------------- + + integer function VarID (NCFID, VNAME) + + integer, intent (in) :: NCFID + character(*), intent (in) :: VNAME + integer :: status + + STATUS = NF_INQ_VARID (NCFID, trim(VNAME) ,VarID) + IF (STATUS .NE. NF_NOERR) & + CALL HANDLE_ERR(STATUS, trim(VNAME)) + + end function VarID + ! ----------------------------------------------------------------------- - - SUBROUTINE HANDLE_ERR(STATUS, Line) - - INTEGER, INTENT (IN) :: STATUS - CHARACTER(*), INTENT (IN) :: Line - - IF (STATUS .NE. NF_NOERR) THEN - PRINT *, trim(Line),': ',NF_STRERROR(STATUS) - STOP 'Stopped' - ENDIF - - END SUBROUTINE HANDLE_ERR - - ! *********************************************************************** - + + SUBROUTINE HANDLE_ERR(STATUS, Line) + + INTEGER, INTENT (IN) :: STATUS + CHARACTER(*), INTENT (IN) :: Line + + IF (STATUS .NE. NF_NOERR) THEN + PRINT *, trim(Line),': ',NF_STRERROR(STATUS) + STOP 'Stopped' + ENDIF + + END SUBROUTINE HANDLE_ERR + + ! *********************************************************************** + FUNCTION getAttribute (SHORT_NAME, LNAME, UNT) result (str_atr) - + character(*), intent(in) :: SHORT_NAME integer, intent (in), optional :: LNAME, UNT character(128) :: str_atr, LONG_NAME, UNITS - + SELECT case (trim(SHORT_NAME)) - - ! For SM_L4 + + ! For L4_SM ! reichle, 20 May 2020: verified SHORT_NAME and corrected UNITS to match SMAP L4_SM Product Specs; LONG_NAME (mostly) from GEOS_CatchGridComp.F90 ! reichle, 14 Feb 2022: added "WATERTABLED" (now: "PEATCLSM_WATERLEVEL") and "FSWCHANGE" (now: "PEATCLSM_FSWCHANGE") ! reichle, 21 Feb 2022: added "mwrtm_vegopacity" @@ -249,206 +255,227 @@ FUNCTION getAttribute (SHORT_NAME, LNAME, UNT) result (str_atr) case ('TB_LAND_1410MHZ_40DEG_HPOL'); LONG_NAME = 'brightness_temperature_land_1410MHz_40deg_Hpol'; UNITS = 'K' case ('TB_LAND_1410MHZ_40DEG_VPOL'); LONG_NAME = 'brightness_temperature_land_1410MHz_40deg_Vpol'; UNITS = 'K' - ! Done for SM_L4 - - case ('Tair'); LONG_NAME = 'air_temperature_at_RefH'; UNITS = 'K' - case ('TA'); LONG_NAME = 'air_temperature_at_RefH'; UNITS = 'K' - case ('Qair'); LONG_NAME = 'specific_humidity_at_RefH'; UNITS = 'kg kg-1' - case ('QA'); LONG_NAME = 'specific_humidity_at_RefH'; UNITS = 'kg kg-1' - case ('LWdown'); LONG_NAME = 'surface_absorbed_longwave_flux'; UNITS = 'W m-2' - case ('LWDNSRF'); LONG_NAME = 'surface_absorbed_longwave_flux'; UNITS = 'W m-2' - case ('SWdown'); LONG_NAME = 'downward_shortwave_radiation'; UNITS = 'W m-2' - case ('Wind'); LONG_NAME = 'wind_speed_at_RefH'; UNITS = 'm s-1' - case ('UU'); LONG_NAME = 'wind_speed_at_RefH'; UNITS = 'm s-1' - case ('Psurf'); LONG_NAME = 'surface_pressure'; UNITS = 'Pa' - case ('PS'); LONG_NAME = 'surface_pressure'; UNITS = 'Pa' - case ('Rainf_C'); LONG_NAME = 'convective_rainfall'; UNITS = 'kg m-2 s-1' - case ('Rainf'); LONG_NAME = 'liquid_water_precipitation'; UNITS = 'kg m-2 s-1' - case ('Snowf'); LONG_NAME = 'total_snowfall'; UNITS = 'kg m-2 s-1' - case ('RainfSnowf'); LONG_NAME = 'RainfSnowf'; UNITS = 'kg m-2 s-1' - case ('SWnet'); LONG_NAME = 'downward_net_shortwave_radiation'; UNITS = 'W m-2' - case ('RefH'); LONG_NAME = 'reference_height_for_Tair_Qair_Wind'; UNITS = 'm' - case ('DZ'); LONG_NAME = 'reference_height_for_Tair_Qair_Wind'; UNITS = 'm' - case ('CATDEF'); LONG_NAME = 'catchment_deficit'; UNITS = 'kg m-2' - case ('RZEXC'); LONG_NAME = 'root_zone_excess'; UNITS = 'kg m-2' - case ('SRFEXC'); LONG_NAME = 'surface_excess'; UNITS = 'kg m-2' - case ('WESNN1'); LONG_NAME = 'snow_mass_layer_1'; UNITS = 'kg m-2' - case ('WESNN2'); LONG_NAME = 'snow_mass_layer_2'; UNITS = 'kg m-2' - case ('WESNN3'); LONG_NAME = 'snow_mass_layer_3'; UNITS = 'kg m-2' - case ('HTSNNN1'); LONG_NAME = 'heat_content_snow_layer_1'; UNITS = 'J m-2' - case ('HTSNNN2'); LONG_NAME = 'heat_content_snow_layer_2'; UNITS = 'J m-2' - case ('HTSNNN3'); LONG_NAME = 'heat_content_snow_layer_3'; UNITS = 'J m-2' - case ('SNDZN1'); LONG_NAME = 'snow_depth_layer_1'; UNITS = 'm' - case ('SNDZN2'); LONG_NAME = 'snow_depth_layer_2'; UNITS = 'm' - case ('SNDZN3'); LONG_NAME = 'snow_depth_layer_3'; UNITS = 'm' - case ('FICE1'); LONG_NAME = 'snow_frozen_fraction_layer_1'; UNITS = '1' - case ('FICE2'); LONG_NAME = 'snow_frozen_fraction_layer_2'; UNITS = '1' - case ('FICE3'); LONG_NAME = 'snow_frozen_fraction_layer_3'; UNITS = '1' - case ('ALBVR'); LONG_NAME = 'surface_reflectivity_for_visible_beam'; UNITS = '1' - case ('ALBVF'); LONG_NAME = 'surface_reflectivity_for_visible_diffuse'; UNITS = '1' - case ('ALBNR'); LONG_NAME = 'surface_reflectivity_for_near_infared_beam'; UNITS = '1' - case ('ALBNF'); LONG_NAME = 'surface_reflectivity_for_near_infrared_diffuse'; UNITS = '1' - case ('HLWUP'); LONG_NAME = 'surface_emitted_longwave_flux'; UNITS = 'W m-2' - case ('GWETPROF'); LONG_NAME = 'ave_prof_soil_wetness'; UNITS = '1' - case ('GWETROOT'); LONG_NAME = 'root_zone_soil_wetness'; UNITS = '1' - case ('GWETTOP'); LONG_NAME = 'surface_soil_wetness'; UNITS = '1' - case ('PRMC'); LONG_NAME = 'water_ave_prof'; UNITS = 'm3 m-3' - case ('RZMC'); LONG_NAME = 'water_root_zone'; UNITS = 'm3 m-3' - case ('SFMC'); LONG_NAME = 'water_surface_layer'; UNITS = 'm3 m-3' - case ('TPSNOW'); LONG_NAME = 'temperature_top_snow_layer'; UNITS = 'K' - case ('TUNST'); LONG_NAME = 'temperature_unsaturated_zone'; UNITS = 'K' - case ('TSAT'); LONG_NAME = 'temperature_saturated_zone'; UNITS = 'K' - case ('TWLT'); LONG_NAME = 'temperature_wilted_zone'; UNITS = 'K' - case ('TSURF'); LONG_NAME = 'ave_catchment_temp_incl_snw'; UNITS = 'K' - case ('TPSURF'); LONG_NAME = 'ave_catchment_temp_incl_snw'; UNITS = 'K' - case ('GRN'); LONG_NAME = 'greeness_fraction'; UNITS = '1' - case ('LAI'); LONG_NAME = 'leaf_area_index'; UNITS = '1' - case ('TP1'); LONG_NAME = 'soil_temperatures_layer_1'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 - case ('TP2'); LONG_NAME = 'soil_temperatures_layer_2'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 - case ('TP3'); LONG_NAME = 'soil_temperatures_layer_3'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 - case ('TP4'); LONG_NAME = 'soil_temperatures_layer_4'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 - case ('TP5'); LONG_NAME = 'soil_temperatures_layer_5'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 - case ('TP6'); LONG_NAME = 'soil_temperatures_layer_6'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 - case ('PRECTOTLAND');LONG_NAME = 'Total_precipitation_land'; UNITS = 'kg m-2 s-1' - case ('PRECSNOLAND');LONG_NAME = 'snowfall_land'; UNITS = 'kg m-2 s-1' - case ('SNOWMASS') ;LONG_NAME = 'snow_mass'; UNITS = 'kg m-2' - case ('SNOMAS') ;LONG_NAME = 'snow_mass'; UNITS = 'kg m-2' - case ('SNO'); LONG_NAME = 'snowfall'; UNITS = 'kg m-2 s-1' - case ('SNODP'); LONG_NAME = 'snow_depth_in_snow_covered_area'; UNITS = 'm' - case ('EVPSOIL'); LONG_NAME = 'baresoil_evap_energy_flux'; UNITS = 'W m-2' - case ('EVPTRNS'); LONG_NAME = 'transpiration_energy_flux'; UNITS = 'W m-2' - case ('EVPINTR'); LONG_NAME = 'interception_loss_energy_flux'; UNITS = 'W m-2' - case ('EVPSBLN'); LONG_NAME = 'snow_ice_evaporation_energy_flux'; UNITS = 'W m-2' - case ('RUNOFF'); LONG_NAME = 'runoff_flux'; UNITS = 'kg m-2 s-1' - case ('BASEFLOW'); LONG_NAME = 'baseflow_flux'; UNITS = 'kg m-2 s-1' - case ('SMLAND'); LONG_NAME = 'Snowmelt_flux_land'; UNITS = 'kg m-2 s-1' - case ('QINFIL'); LONG_NAME = 'rainwater_infiltration_flux'; UNITS = 'kg m-2 s-1' - case ('FRUNST'); LONG_NAME = 'fractional_area_of_unsaturated_zone'; UNITS = '1' - case ('FRSAT'); LONG_NAME = 'fractional_area_of_saturated_zone'; UNITS = '1' - case ('FRSNO'); LONG_NAME = 'fractional_area_of_land_snowcover'; UNITS = '1' - case ('FRWLT'); LONG_NAME = 'fractional_area_of_wilting_zone'; UNITS = '1' - case ('PARDFLAND'); LONG_NAME = 'surface_downwelling_par_diffuse_flux'; UNITS = 'W m-2' - case ('PARDRLAND'); LONG_NAME = 'surface_downwelling_par_beam_flux'; UNITS = 'W m-2' - case ('SHLAND'); LONG_NAME = 'Sensible_heat_flux_land'; UNITS = 'W m-2' - case ('LHLAND'); LONG_NAME = 'Latent_heat_flux_land'; UNITS = 'W m-2' - case ('EVLAND'); LONG_NAME = 'Evaporation_land'; UNITS = 'kg m-2 s-1' - case ('LWLAND'); LONG_NAME = 'Net_longwave_land'; UNITS = 'W m-2' - case ('SWLAND'); LONG_NAME = 'Net_shortwave_land'; UNITS = 'W m-2' - case ('SWDOWNLAND'); LONG_NAME = 'Incident_shortwave_land'; UNITS = 'W m-2' - case ('GHLAND'); LONG_NAME = 'Ground_heating_land'; UNITS = 'W m-2' - case ('TWLAND'); LONG_NAME = 'Avail_water_storage_land'; UNITS = 'kg m-2' - case ('TSLAND'); LONG_NAME = 'Total_snow_storage_land'; UNITS = 'kg m-2' - case ('TELAND'); LONG_NAME = 'Total_energy_storage_land'; UNITS = 'J m-2' - case ('WCHANGE'); LONG_NAME = 'rate_of_change_of_total_land_water'; UNITS = 'kg m-2 s-1' - case ('ECHANGE'); LONG_NAME = 'rate_of_change_of_total_land_energy'; UNITS = 'W m-2' - case ('SPLAND'); LONG_NAME = 'rate_of_spurious_land_energy_source'; UNITS = 'W m-2' - case ('SPWATR'); LONG_NAME = 'rate_of_spurious_land_water_source'; UNITS = 'kg m-2 s-1' - case ('SPSNOW'); LONG_NAME = 'rate_of_spurious_snow_energy'; UNITS = 'W m-2' - case ('PEATCLSM_WATERLEVEL');LONG_NAME = 'depth_to_water_table_from_surface_in_peat'; UNITS = 'm' - case ('PEATCLSM_FSWCHANGE'); LONG_NAME = 'change_in_free_surface_water_reservoir_on_peat'; UNITS = 'kg m-2 s-1' - case ('CNLAI'); LONG_NAME = 'CN_exposed_leaf-area_index'; UNITS = '1' - case ('CNTLAI'); LONG_NAME = 'CN_total_leaf-area_index'; UNITS = '1' - case ('CNSAI'); LONG_NAME = 'CN_exposed_stem-area_index'; UNITS = '1' - case ('CNTOTC'); LONG_NAME = 'CN_total_carbon'; UNITS = 'kg m-2' - case ('CNVEGC'); LONG_NAME = 'CN_total_vegetation_carbon'; UNITS = 'kg m-2' - case ('CNROOT'); LONG_NAME = 'CN_total_root_carbon'; UNITS = 'kg m-2' - case ('CNNPP'); LONG_NAME = 'CN_net_primary_production'; UNITS = 'kg m-2 s-1' - case ('CNGPP'); LONG_NAME = 'CN_gross_primary_production'; UNITS = 'kg m-2 s-1' - case ('CNSR'); LONG_NAME = 'CN_total_soil_respiration'; UNITS = 'kg m-2 s-1' - case ('CNNEE'); LONG_NAME = 'CN_net_ecosystem_exchange'; UNITS = 'kg m-2 s-1' - case ('CNXSMR'); LONG_NAME = 'abstract_C_pool_to_meet_excess_MR_demand'; UNITS = 'kg m-2' - case ('CNADD'); LONG_NAME = 'CN_added_to_maintain_positive_C'; UNITS = 'kg m-2 s-1' - case ('PARABS'); LONG_NAME = 'absorbed_PAR'; UNITS = 'W m-2' - case ('PARINC'); LONG_NAME = 'incident_PAR'; UNITS = 'W m-2' - case ('SCSAT'); LONG_NAME = 'saturated_stomatal_conductance'; UNITS = 'm s-1' - case ('SCUNS'); LONG_NAME = 'unstressed_stomatal_conductance'; UNITS = 'm s-1' - case ('BTRAN'); LONG_NAME = 'transpiration coefficient'; UNITS = '1' - case ('SIF'); LONG_NAME = 'solar induced fluorescence'; UNITS = 'umol m-2 sm s-1' - case ('CLOSS'); LONG_NAME = 'CN_carbon_loss_to_fire'; UNITS = 'kg m-2 s-1' - case ('BURN'); LONG_NAME = 'CN_fractional_area_burn_rate'; UNITS = 's-1' - case ('FSEL'); LONG_NAME = 'fire season length'; UNITS = 'days' - case ('EVPSNO'); LONG_NAME = 'snowpack_evaporation_energy_flux'; UNITS = 'W m-2' - case ('GHTSKIN'); LONG_NAME = 'Ground_heating_skin_temp'; UNITS = 'W m-2' - case ('WAT10CM'); LONG_NAME = 'soil moisture in Upper 10cm'; UNITS = 'kg m-2' - case ('WATSOI'); LONG_NAME = 'totoal soil moisture'; UNITS = 'kg m-2' - case ('ICESOI'); LONG_NAME = 'soil frozen water content'; UNITS = 'kg m-2' - case ('RMELTDU001'); LONG_NAME = 'flushed_out_dust_mass_flux_from_the_bottom_layer_bin_1'; UNITS = 'kg m-2 s-1' - case ('RMELTDU002'); LONG_NAME = 'flushed_out_dust_mass_flux_from_the_bottom_layer_bin_2'; UNITS = 'kg m-2 s-1' - case ('RMELTDU003'); LONG_NAME = 'flushed_out_dust_mass_flux_from_the_bottom_layer_bin_3'; UNITS = 'kg m-2 s-1' - case ('RMELTDU004'); LONG_NAME = 'flushed_out_dust_mass_flux_from_the_bottom_layer_bin_4'; UNITS = 'kg m-2 s-1' - case ('RMELTDU005'); LONG_NAME = 'flushed_out_dust_mass_flux_from_the_bottom_layer_bin_5'; UNITS = 'kg m-2 s-1' - case ('RMELTBC001'); LONG_NAME = 'flushed_out_black_carbon_mass_flux_from_the_bottom_layer_bin_1'; UNITS = 'kg m-2 s-1' - case ('RMELTBC002'); LONG_NAME = 'flushed_out_black_carbon_mass_flux_from_the_bottom_layer_bin_2'; UNITS = 'kg m-2 s-1' - case ('RMELTOC001'); LONG_NAME = 'flushed_out_organic_carbon_mass_flux_from_the_bottom_layer_bin_1'; UNITS = 'kg m-2 s-1' - case ('RMELTOC002'); LONG_NAME = 'flushed_out_organic_carbon_mass_flux_from_the_bottom_layer_bin_2'; UNITS = 'kg m-2 s-1' + ! End L4_SM ------------------------------------------------------------------------------------------------------------------------------------------------- + + case ('Tair'); LONG_NAME = 'air_temperature_at_RefH'; UNITS = 'K' + case ('TA'); LONG_NAME = 'air_temperature_at_RefH'; UNITS = 'K' + case ('Qair'); LONG_NAME = 'specific_humidity_at_RefH'; UNITS = 'kg kg-1' + case ('QA'); LONG_NAME = 'specific_humidity_at_RefH'; UNITS = 'kg kg-1' + case ('LWdown'); LONG_NAME = 'surface_absorbed_longwave_flux'; UNITS = 'W m-2' + case ('LWDNSRF'); LONG_NAME = 'surface_absorbed_longwave_flux'; UNITS = 'W m-2' + case ('SWdown'); LONG_NAME = 'downward_shortwave_radiation'; UNITS = 'W m-2' + case ('Wind'); LONG_NAME = 'wind_speed_at_RefH'; UNITS = 'm s-1' + case ('UU'); LONG_NAME = 'wind_speed_at_RefH'; UNITS = 'm s-1' + case ('Psurf'); LONG_NAME = 'surface_pressure'; UNITS = 'Pa' + case ('PS'); LONG_NAME = 'surface_pressure'; UNITS = 'Pa' + case ('Rainf_C'); LONG_NAME = 'convective_rainfall'; UNITS = 'kg m-2 s-1' + case ('Rainf'); LONG_NAME = 'liquid_water_precipitation'; UNITS = 'kg m-2 s-1' + case ('Snowf'); LONG_NAME = 'total_snowfall'; UNITS = 'kg m-2 s-1' + case ('RainfSnowf'); LONG_NAME = 'RainfSnowf'; UNITS = 'kg m-2 s-1' + case ('SWnet'); LONG_NAME = 'downward_net_shortwave_radiation'; UNITS = 'W m-2' + case ('RefH'); LONG_NAME = 'reference_height_for_Tair_Qair_Wind'; UNITS = 'm' + case ('DZ'); LONG_NAME = 'reference_height_for_Tair_Qair_Wind'; UNITS = 'm' + case ('CATDEF'); LONG_NAME = 'catchment_deficit'; UNITS = 'kg m-2' + case ('RZEXC'); LONG_NAME = 'root_zone_excess'; UNITS = 'kg m-2' + case ('SRFEXC'); LONG_NAME = 'surface_excess'; UNITS = 'kg m-2' + case ('CAPAC', 'INTRWATR'); LONG_NAME = 'vegetation_interception_water_storage'; UNITS = 'kg m-2' + case ('WESNN1'); LONG_NAME = 'snow_mass_layer_1'; UNITS = 'kg m-2' + case ('WESNN2'); LONG_NAME = 'snow_mass_layer_2'; UNITS = 'kg m-2' + case ('WESNN3'); LONG_NAME = 'snow_mass_layer_3'; UNITS = 'kg m-2' + case ('HTSNNN1'); LONG_NAME = 'heat_content_snow_layer_1'; UNITS = 'J m-2' + case ('HTSNNN2'); LONG_NAME = 'heat_content_snow_layer_2'; UNITS = 'J m-2' + case ('HTSNNN3'); LONG_NAME = 'heat_content_snow_layer_3'; UNITS = 'J m-2' + case ('SNDZN1'); LONG_NAME = 'snow_depth_layer_1'; UNITS = 'm' + case ('SNDZN2'); LONG_NAME = 'snow_depth_layer_2'; UNITS = 'm' + case ('SNDZN3'); LONG_NAME = 'snow_depth_layer_3'; UNITS = 'm' + case ('FICE1'); LONG_NAME = 'snow_frozen_fraction_layer_1'; UNITS = '1' + case ('FICE2'); LONG_NAME = 'snow_frozen_fraction_layer_2'; UNITS = '1' + case ('FICE3'); LONG_NAME = 'snow_frozen_fraction_layer_3'; UNITS = '1' + case ('ALBVR'); LONG_NAME = 'surface_reflectivity_for_visible_beam'; UNITS = '1' + case ('ALBVF'); LONG_NAME = 'surface_reflectivity_for_visible_diffuse'; UNITS = '1' + case ('ALBNR'); LONG_NAME = 'surface_reflectivity_for_near_infared_beam'; UNITS = '1' + case ('ALBNF'); LONG_NAME = 'surface_reflectivity_for_near_infrared_diffuse'; UNITS = '1' + case ('HLWUP'); LONG_NAME = 'surface_emitted_longwave_flux'; UNITS = 'W m-2' + case ('GWETPROF'); LONG_NAME = 'soil_wetness_profile'; UNITS = '1' + case ('GWETROOT'); LONG_NAME = 'soil_wetness_rootzone'; UNITS = '1' + case ('GWETTOP'); LONG_NAME = 'soil_wetness_surface'; UNITS = '1' + case ('PRMC'); LONG_NAME = 'soil_moisture_profile'; UNITS = 'm3 m-3' + case ('RZMC'); LONG_NAME = 'soil_moisture_rootzone'; UNITS = 'm3 m-3' + case ('SFMC'); LONG_NAME = 'soil_moisture_surface'; UNITS = 'm3 m-3' + case ('TPSNOW', 'TPSNOWLAND'); LONG_NAME = 'surface_temperature_of_snow_on_land'; UNITS = 'K' + case ('TUNST' , 'TUNSTLAND'); LONG_NAME = 'surface_temperature_of_unsaturated_zone'; UNITS = 'K' + case ('TSAT' , 'TSATLAND'); LONG_NAME = 'surface_temperature_of_saturated_zone'; UNITS = 'K' + case ('TWLT' , 'TWLTLAND'); LONG_NAME = 'surface_temperature_of_wilting_zone'; UNITS = 'K' + case ('TSURF', 'TPSURF', 'TSURFLAND'); LONG_NAME = 'surface_temperature_of_land_incl_snow'; UNITS = 'K' + case ('GRN'); LONG_NAME = 'vegetation_greenness_fraction'; UNITS = '1' + case ('LAI'); LONG_NAME = 'leaf_area_index'; UNITS = '1' + case ('TP1', 'TSOIL1'); LONG_NAME = 'soil_temperature_layer_1'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 + case ('TP2', 'TSOIL2'); LONG_NAME = 'soil_temperature_layer_2'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 + case ('TP3', 'TSOIL3'); LONG_NAME = 'soil_temperature_layer_3'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 + case ('TP4', 'TSOIL4'); LONG_NAME = 'soil_temperature_layer_4'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 + case ('TP5', 'TSOIL5'); LONG_NAME = 'soil_temperature_layer_5'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 + case ('TP6', 'TSOIL6'); LONG_NAME = 'soil_temperature_layer_6'; UNITS = 'K' ! units now K, rreichle & borescan, 6 Nov 2020 + case ('PRECTOTLAND', 'PRECTOTCORRLAND'); LONG_NAME = 'Total_precipitation_land'; UNITS = 'kg m-2 s-1' + case ('PRECSNOLAND', 'PRECSNOCORRLAND'); LONG_NAME = 'snowfall_land'; UNITS = 'kg m-2 s-1' + case ('SNOWMASS', 'SNOMAS'); LONG_NAME = 'snow_mass'; UNITS = 'kg m-2' + case ('TSLAND', 'SNOMASLAND'); LONG_NAME = 'Total_snow_storage_land'; UNITS = 'kg m-2' + case ('SNO'); LONG_NAME = 'snowfall'; UNITS = 'kg m-2 s-1' + case ('SNODP'); LONG_NAME = 'snow_depth_within_snow_covered_area_fraction'; UNITS = 'm' + case ('SNODPLAND'); LONG_NAME = 'snow_depth_within_snow_covered_area_fraction_on_land'; UNITS = 'm' + case ('EVPSOIL', 'LHLANDSOIL'); LONG_NAME = 'baresoil_evaporation_latent_heat_flux'; UNITS = 'W m-2' + case ('EVPTRNS', 'LHLANDTRNS'); LONG_NAME = 'transpiration_latent_heat_flux'; UNITS = 'W m-2' + case ('EVPINTR', 'LHLANDINTR'); LONG_NAME = 'interception_loss_latent_heat_flux'; UNITS = 'W m-2' + case ('EVPSBLN', 'LHLANDSBLN'); LONG_NAME = 'snowpack_evaporation_latent_heat_flux_on_land'; UNITS = 'W m-2' + case ('EVPSNO'); LONG_NAME = 'snowpack_evaporation_latent_heat_flux'; UNITS = 'W m-2' ! avg across all tile types + case ('RUNOFF'); LONG_NAME = 'runoff_total_flux'; UNITS = 'kg m-2 s-1' ! avg across all tile types + case ('RUNSURF', 'RUNSURFLAND'); LONG_NAME = 'overland runoff including throughflow'; UNITS = 'kg m-2 s-1' + case ('BASEFLOW'); LONG_NAME = 'baseflow_flux'; UNITS = 'kg m-2 s-1' + case ('BASEFLOWLAND'); LONG_NAME = 'baseflow_flux_land'; UNITS = 'kg m-2 s-1' + case ('SMLAND'); LONG_NAME = 'Snowmelt_flux_land'; UNITS = 'kg m-2 s-1' + case ('QINFIL', 'QINFILLAND'); LONG_NAME = 'Soil_water_infiltration_rate'; UNITS = 'kg m-2 s-1' + case ('FRUNST', 'FRLANDUNST'); LONG_NAME = 'fractional_area_of_unsaturated_zone'; UNITS = '1' + case ('FRSAT' , 'FRLANDSAT' ); LONG_NAME = 'fractional_area_of_saturated_zone'; UNITS = '1' + case ('FRSNO' , 'FRLANDSNO' ); LONG_NAME = 'fractional_area_of_snow_on_land'; UNITS = '1' + case ('FRWLT' , 'FRLANDWLT' ); LONG_NAME = 'fractional_area_of_wilting_zone'; UNITS = '1' + case ('PARDFLAND'); LONG_NAME = 'surface_downwelling_PAR_diffuse_flux'; UNITS = 'W m-2' + case ('PARDRLAND'); LONG_NAME = 'surface_downwelling_PAR_beam_flux'; UNITS = 'W m-2' + case ('SHLAND'); LONG_NAME = 'Sensible_heat_flux_land'; UNITS = 'W m-2' + case ('LHLAND'); LONG_NAME = 'Latent_heat_flux_land'; UNITS = 'W m-2' + case ('EVLAND'); LONG_NAME = 'Total_evaporation_land'; UNITS = 'kg m-2 s-1' + case ('LWLAND'); LONG_NAME = 'Net_longwave_flux_land'; UNITS = 'W m-2' + case ('SWLAND'); LONG_NAME = 'Net_shortwave_flux_land'; UNITS = 'W m-2' + case ('SWDOWNLAND'); LONG_NAME = 'Incident_shortwave_flux_land'; UNITS = 'W m-2' + case ('GHLAND'); LONG_NAME = 'Ground_heating_flux_land'; UNITS = 'W m-2' + case ('TWLAND'); LONG_NAME = 'total_water_storage_land'; UNITS = 'kg m-2' + case ('TELAND'); LONG_NAME = 'Total_energy_storage_land'; UNITS = 'J m-2' + case ('WCHANGE','WCHANGELAND'); LONG_NAME = 'rate_of_change_of_total_land_water'; UNITS = 'kg m-2 s-1' + case ('ECHANGE','ECHANGELAND'); LONG_NAME = 'rate_of_change_of_total_land_energy'; UNITS = 'W m-2' + case ('SPLAND', 'SPSHLAND'); LONG_NAME = 'Spurious_sensible_heat_flux_land'; UNITS = 'W m-2' + case ('SPLH' , 'SPLHLAND'); LONG_NAME = 'Spurious_latent_heat_flux_land'; UNITS = 'W m-2' + case ('SPWATR', 'SPEVLAND'); LONG_NAME = 'Spurious_evapotranspiration_flux_land'; UNITS = 'kg m-2 s-1' + case ('SPSNOW', 'SPSNLAND'); LONG_NAME = 'Spurious_snow_energy_flux_land'; UNITS = 'W m-2' + case ('PEATCLSM_WATERLEVEL'); LONG_NAME = 'depth_to_water_table_from_surface_in_peat'; UNITS = 'm' + case ('PEATCLSM_FSWCHANGE'); LONG_NAME = 'change_in_free_surface_water_reservoir_on_peat'; UNITS = 'kg m-2 s-1' + case ('CNLAI'); LONG_NAME = 'CN_exposed_leaf-area_index'; UNITS = '1' + case ('CNTLAI'); LONG_NAME = 'CN_total_leaf-area_index'; UNITS = '1' + case ('CNSAI'); LONG_NAME = 'CN_exposed_stem-area_index'; UNITS = '1' + case ('CNTOTC'); LONG_NAME = 'CN_total_carbon'; UNITS = 'kg m-2' + case ('CNVEGC'); LONG_NAME = 'CN_total_vegetation_carbon'; UNITS = 'kg m-2' + case ('CNROOT'); LONG_NAME = 'CN_total_root_carbon'; UNITS = 'kg m-2' + case ('CNNPP'); LONG_NAME = 'CN_net_primary_production'; UNITS = 'kg m-2 s-1' + case ('CNGPP'); LONG_NAME = 'CN_gross_primary_production'; UNITS = 'kg m-2 s-1' + case ('CNSR'); LONG_NAME = 'CN_total_soil_respiration'; UNITS = 'kg m-2 s-1' + case ('CNNEE'); LONG_NAME = 'CN_net_ecosystem_exchange'; UNITS = 'kg m-2 s-1' + case ('CNXSMR'); LONG_NAME = 'abstract_C_pool_to_meet_excess_MR_demand'; UNITS = 'kg m-2' + case ('CNADD'); LONG_NAME = 'CN_added_to_maintain_positive_C'; UNITS = 'kg m-2 s-1' + case ('PARABS'); LONG_NAME = 'absorbed_PAR'; UNITS = 'W m-2' + case ('PARINC'); LONG_NAME = 'incident_PAR'; UNITS = 'W m-2' + case ('SCSAT'); LONG_NAME = 'saturated_stomatal_conductance'; UNITS = 'm s-1' + case ('SCUNS'); LONG_NAME = 'unstressed_stomatal_conductance'; UNITS = 'm s-1' + case ('BTRAN'); LONG_NAME = 'transpiration coefficient'; UNITS = '1' + case ('SIF'); LONG_NAME = 'solar induced fluorescence'; UNITS = 'umol m-2 sm s-1' + case ('CLOSS'); LONG_NAME = 'CN_carbon_loss_to_fire'; UNITS = 'kg m-2 s-1' + case ('BURN'); LONG_NAME = 'CN_fractional_area_burn_rate'; UNITS = 's-1' + case ('FSEL'); LONG_NAME = 'fire season length'; UNITS = 'days' + case ('GHTSKIN'); LONG_NAME = 'Ground_heating_flux_for_skin_temp_land'; UNITS = 'W m-2' + case ('WAT10CM'); LONG_NAME = 'soil moisture in Upper 10cm'; UNITS = 'kg m-2' + case ('WATSOI'); LONG_NAME = 'total soil moisture'; UNITS = 'kg m-2' + case ('ICESOI'); LONG_NAME = 'soil frozen water content'; UNITS = 'kg m-2' + case ('RMELTDU001'); LONG_NAME = 'flushed_out_dust_mass_flux_from_the_bottom_layer_bin_1'; UNITS = 'kg m-2 s-1' + case ('RMELTDU002'); LONG_NAME = 'flushed_out_dust_mass_flux_from_the_bottom_layer_bin_2'; UNITS = 'kg m-2 s-1' + case ('RMELTDU003'); LONG_NAME = 'flushed_out_dust_mass_flux_from_the_bottom_layer_bin_3'; UNITS = 'kg m-2 s-1' + case ('RMELTDU004'); LONG_NAME = 'flushed_out_dust_mass_flux_from_the_bottom_layer_bin_4'; UNITS = 'kg m-2 s-1' + case ('RMELTDU005'); LONG_NAME = 'flushed_out_dust_mass_flux_from_the_bottom_layer_bin_5'; UNITS = 'kg m-2 s-1' + case ('RMELTBC001'); LONG_NAME = 'flushed_out_black_carbon_mass_flux_from_the_bottom_layer_bin_1'; UNITS = 'kg m-2 s-1' + case ('RMELTBC002'); LONG_NAME = 'flushed_out_black_carbon_mass_flux_from_the_bottom_layer_bin_2'; UNITS = 'kg m-2 s-1' + case ('RMELTOC001'); LONG_NAME = 'flushed_out_organic_carbon_mass_flux_from_the_bottom_layer_bin_1'; UNITS = 'kg m-2 s-1' + case ('RMELTOC002'); LONG_NAME = 'flushed_out_organic_carbon_mass_flux_from_the_bottom_layer_bin_2'; UNITS = 'kg m-2 s-1' + ! land constants + + case ('CDCR2'); LONG_NAME = 'maximum soil water content above wilting point'; UNITS = 'kg m-2' + case ('DZGT1'); LONG_NAME = 'thickness_of_soil_layer_associated_with_TSOIL1'; UNITS = 'm' + case ('DZGT2'); LONG_NAME = 'thickness_of_soil_layer_associated_with_TSOIL2'; UNITS = 'm' + case ('DZGT3'); LONG_NAME = 'thickness_of_soil_layer_associated_with_TSOIL3'; UNITS = 'm' + case ('DZGT4'); LONG_NAME = 'thickness_of_soil_layer_associated_with_TSOIL4'; UNITS = 'm' + case ('DZGT5'); LONG_NAME = 'thickness_of_soil_layer_associated_with_TSOIL5'; UNITS = 'm' + case ('DZGT6'); LONG_NAME = 'thickness_of_soil_layer_associated_with_TSOIL6'; UNITS = 'm' + case ('DZPR'); LONG_NAME = 'thickness_of_soil_layer_associated_with_PRMC_and_GWETPROF'; UNITS = 'm' + case ('DZRZ'); LONG_NAME = 'thickness_of_soil_layer_associated_with_RZMC_and_GWETROOT'; UNITS = 'm' + case ('DZSF'); LONG_NAME = 'thickness_of_soil_layer_associated_with_SFMC_and_GWETTOP'; UNITS = 'm' + case ('DZTS'); LONG_NAME = 'thickness_of_soil_layer_associated_with_TSATLAND_TUNSTLAND_and_TWLTLAND'; UNITS = 'm' + case ('POROS'); LONG_NAME = 'soil_porosity'; UNITS = 'm3 m-3' + case ('WPEMW'); LONG_NAME = 'soil_wilting_point_in_equivalent_mass_of_total_profile_water'; UNITS = 'kg m-2' + case ('WPMC'); LONG_NAME = 'soil_wilting_point_in_volumetric_units'; UNITS = 'm3 m-3' + case ('WPWET'); LONG_NAME = 'soil_wilting_point_in_degree_of_saturation_units'; UNITS = '1' + ! land assimilation increments for Catchment prognostic variables in coupled land-atmosphere DAS (#sqz 2020-01) - case ('TCFSAT_INCR'); LONG_NAME = 'increment_canopy_temperature_saturated_zone'; UNITS = 'K' - case ('TCFTRN_INCR'); LONG_NAME = 'increment_canopy_temperature_transition_zone'; UNITS = 'K' - case ('TCFWLT_INCR'); LONG_NAME = 'increment_canopy_temperature_wilting_zone'; UNITS = 'K' - case ('QCFSAT_INCR'); LONG_NAME = 'increment_canopy_specific_humidity_saturated_zone'; UNITS = 'kg kg-1' - case ('QCFTRN_INCR'); LONG_NAME = 'increment_canopy_specific_humidity_transition_zone'; UNITS = 'kg kg-1' - case ('QCFWLT_INCR'); LONG_NAME = 'increment_canopy_specific_humidity_wilting_zone'; UNITS = 'kg kg-1' - case ('CAPAC_INCR'); LONG_NAME = 'increment_interception_reservoir_capac'; UNITS = 'kg m-2' - case ('CATDEF_INCR'); LONG_NAME = 'increment_catchment_deficit'; UNITS = 'kg m-2' - case ('RZEXC_INCR'); LONG_NAME = 'increment_root_zone_excess'; UNITS = 'kg m-2' - case ('SRFEXC_INCR'); LONG_NAME = 'increment_surface_excess'; UNITS = 'kg m-2' - case ('GHTCNT1_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_1'; UNITS = 'J m-2' - case ('GHTCNT2_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_2'; UNITS = 'J m-2' - case ('GHTCNT3_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_3'; UNITS = 'J m-2' - case ('GHTCNT4_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_4'; UNITS = 'J m-2' - case ('GHTCNT5_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_5'; UNITS = 'J m-2' - case ('GHTCNT6_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_6'; UNITS = 'J m-2' - case ('WESNN1_INCR'); LONG_NAME = 'increment_snow_mass_layer_1'; UNITS = 'kg m-2' - case ('WESNN2_INCR'); LONG_NAME = 'increment_snow_mass_layer_2'; UNITS = 'kg m-2' - case ('WESNN3_INCR'); LONG_NAME = 'increment_snow_mass_layer_3'; UNITS = 'kg m-2' - case ('HTSNNN1_INCR'); LONG_NAME = 'increment_heat_content_snow_layer_1'; UNITS = 'J m-2' - case ('HTSNNN2_INCR'); LONG_NAME = 'increment_heat_content_snow_layer_2'; UNITS = 'J m-2' - case ('HTSNNN3_INCR'); LONG_NAME = 'increment_heat_content_snow_layer_3'; UNITS = 'J m-2' - case ('SNDZN1_INCR'); LONG_NAME = 'increment_snow_depth_layer_1'; UNITS = 'm' - case ('SNDZN2_INCR'); LONG_NAME = 'increment_snow_depth_layer_2'; UNITS = 'm' - case ('SNDZN3_INCR'); LONG_NAME = 'increment_snow_depth_layer_3'; UNITS = 'm' + case ('TCFSAT_INCR'); LONG_NAME = 'increment_surface_temperature_of_saturated_zone'; UNITS = 'K' + case ('TCFTRN_INCR'); LONG_NAME = 'increment_surface_temperature_of_transition_zone'; UNITS = 'K' + case ('TCFWLT_INCR'); LONG_NAME = 'increment_surface_temperature_of_wilting_zone'; UNITS = 'K' + case ('QCFSAT_INCR'); LONG_NAME = 'increment_surface_specific_humidity_of_saturated_zone'; UNITS = 'kg kg-1' + case ('QCFTRN_INCR'); LONG_NAME = 'increment_surface_specific_humidity_of_transition_zone'; UNITS = 'kg kg-1' + case ('QCFWLT_INCR'); LONG_NAME = 'increment_surface_specific_humidity_of_wilting_zone'; UNITS = 'kg kg-1' + case ('CAPAC_INCR'); LONG_NAME = 'increment_vegetation_interception_water_storage'; UNITS = 'kg m-2' + case ('CATDEF_INCR'); LONG_NAME = 'increment_catchment_deficit'; UNITS = 'kg m-2' + case ('RZEXC_INCR'); LONG_NAME = 'increment_root_zone_excess'; UNITS = 'kg m-2' + case ('SRFEXC_INCR'); LONG_NAME = 'increment_surface_excess'; UNITS = 'kg m-2' + case ('GHTCNT1_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_1'; UNITS = 'J m-2' + case ('GHTCNT2_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_2'; UNITS = 'J m-2' + case ('GHTCNT3_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_3'; UNITS = 'J m-2' + case ('GHTCNT4_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_4'; UNITS = 'J m-2' + case ('GHTCNT5_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_5'; UNITS = 'J m-2' + case ('GHTCNT6_INCR'); LONG_NAME = 'increment_soil_heat_content_layer_6'; UNITS = 'J m-2' + case ('WESNN1_INCR'); LONG_NAME = 'increment_snow_mass_layer_1'; UNITS = 'kg m-2' + case ('WESNN2_INCR'); LONG_NAME = 'increment_snow_mass_layer_2'; UNITS = 'kg m-2' + case ('WESNN3_INCR'); LONG_NAME = 'increment_snow_mass_layer_3'; UNITS = 'kg m-2' + case ('HTSNNN1_INCR'); LONG_NAME = 'increment_heat_content_snow_layer_1'; UNITS = 'J m-2' + case ('HTSNNN2_INCR'); LONG_NAME = 'increment_heat_content_snow_layer_2'; UNITS = 'J m-2' + case ('HTSNNN3_INCR'); LONG_NAME = 'increment_heat_content_snow_layer_3'; UNITS = 'J m-2' + case ('SNDZN1_INCR'); LONG_NAME = 'increment_snow_depth_layer_1'; UNITS = 'm' + case ('SNDZN2_INCR'); LONG_NAME = 'increment_snow_depth_layer_2'; UNITS = 'm' + case ('SNDZN3_INCR'); LONG_NAME = 'increment_snow_depth_layer_3'; UNITS = 'm' ! land assimilation forecast and analysis for Catchment model diagnostics - case ('SFMC_FCST'); LONG_NAME = 'soil_moisture_surface_forecast'; UNITS = 'm3 m-3' - case ('RZMC_FCST'); LONG_NAME = 'soil_moisture_rootzone_forecast'; UNITS = 'm3 m-3' - case ('PRMC_FCST'); LONG_NAME = 'soil_moisture_profile_forecast'; UNITS = 'm3 m-3' - case ('TSURF_FCST'); LONG_NAME = 'ave_catchment_temp_incl_snw_forecast'; UNITS = 'K' - case ('TSOIL1_FCST'); LONG_NAME = 'soil_temperatures_layer_1_forecast'; UNITS = 'K' - - case ('SFMC_FCST_ENSSTD'); LONG_NAME = 'soil_moisture_surface_forecast_ensstd'; UNITS = 'm3 m-3' - case ('RZMC_FCST_ENSSTD'); LONG_NAME = 'soil_moisture_rootzone_forecast_ensstd'; UNITS = 'm3 m-3' - case ('PRMC_FCST_ENSSTD'); LONG_NAME = 'soil_moisture_profile_forecast_ensstd'; UNITS = 'm3 m-3' - case ('TSURF_FCST_ENSSTD'); LONG_NAME = 'ave_catchment_temp_incl_snw_forecast_ensstd'; UNITS = 'K' - case ('TSOIL1_FCST_ENSSTD'); LONG_NAME = 'soil_temperatures_layer_1_forecast_ensstd'; UNITS = 'K' - - case ('SFMC_ANA'); LONG_NAME = 'soil_moisture_surface_analysis'; UNITS = 'm3 m-3' - case ('RZMC_ANA'); LONG_NAME = 'soil_moisture_rootzone_analysis'; UNITS = 'm3 m-3' - case ('PRMC_ANA'); LONG_NAME = 'soil_moisture_profile_analysis'; UNITS = 'm3 m-3' - case ('TSURF_ANA'); LONG_NAME = 'ave_catchment_temp_incl_snw_analysis'; UNITS = 'K' - case ('TSOIL1_ANA'); LONG_NAME = 'soil_temperatures_layer_1_analysis'; UNITS = 'K' - - case ('SFMC_ANA_ENSSTD'); LONG_NAME = 'soil_moisture_surface_analysis_ensstd'; UNITS = 'm3 m-3' - case ('RZMC_ANA_ENSSTD'); LONG_NAME = 'soil_moisture_rootzone_analysis_ensstd'; UNITS = 'm3 m-3' - case ('PRMC_ANA_ENSSTD'); LONG_NAME = 'soil_moisture_profile_analysis_ensstd'; UNITS = 'm3 m-3' - case ('TSURF_ANA_ENSSTD'); LONG_NAME = 'ave_catchment_temp_incl_snw_analysis_ensstd'; UNITS = 'K' - case ('TSOIL1_ANA_ENSSTD'); LONG_NAME = 'soil_temperatures_layer_1_analysis_ensstd'; UNITS = 'K' - - ! other land assimilation fields - - case ('MWRTM_VEGOPACITY'); LONG_NAME = 'Lband_microwave_vegopacity_normalized_with_cos_inc_angle'; UNITS = '1' + case ('SFMC_FCST'); LONG_NAME = 'soil_moisture_surface_forecast'; UNITS = 'm3 m-3' + case ('RZMC_FCST'); LONG_NAME = 'soil_moisture_rootzone_forecast'; UNITS = 'm3 m-3' + case ('PRMC_FCST'); LONG_NAME = 'soil_moisture_profile_forecast'; UNITS = 'm3 m-3' + case ('TSURF_FCST'); LONG_NAME = 'surface_temperature_of_land_incl_snow_forecast'; UNITS = 'K' + case ('TSOIL1_FCST'); LONG_NAME = 'soil_temperature_layer_1_forecast'; UNITS = 'K' + + case ('SFMC_FCST_ENSSTD'); LONG_NAME = 'soil_moisture_surface_forecast_ensstd'; UNITS = 'm3 m-3' + case ('RZMC_FCST_ENSSTD'); LONG_NAME = 'soil_moisture_rootzone_forecast_ensstd'; UNITS = 'm3 m-3' + case ('PRMC_FCST_ENSSTD'); LONG_NAME = 'soil_moisture_profile_forecast_ensstd'; UNITS = 'm3 m-3' + case ('TSURF_FCST_ENSSTD'); LONG_NAME = 'surface_temperature_of_land_incl_snow_forecast_ensstd'; UNITS = 'K' + case ('TSOIL1_FCST_ENSSTD'); LONG_NAME = 'soil_temperature_layer_1_forecast_ensstd'; UNITS = 'K' + + case ('SFMC_ANA'); LONG_NAME = 'soil_moisture_surface_analysis'; UNITS = 'm3 m-3' + case ('RZMC_ANA'); LONG_NAME = 'soil_moisture_rootzone_analysis'; UNITS = 'm3 m-3' + case ('PRMC_ANA'); LONG_NAME = 'soil_moisture_profile_analysis'; UNITS = 'm3 m-3' + case ('TSURF_ANA'); LONG_NAME = 'surface_temperature_of_land_incl_snow_analysis'; UNITS = 'K' + case ('TSOIL1_ANA'); LONG_NAME = 'soil_temperature_layer_1_analysis'; UNITS = 'K' + + case ('SFMC_ANA_ENSSTD'); LONG_NAME = 'soil_moisture_surface_analysis_ensstd'; UNITS = 'm3 m-3' + case ('RZMC_ANA_ENSSTD'); LONG_NAME = 'soil_moisture_rootzone_analysis_ensstd'; UNITS = 'm3 m-3' + case ('PRMC_ANA_ENSSTD'); LONG_NAME = 'soil_moisture_profile_analysis_ensstd'; UNITS = 'm3 m-3' + case ('TSURF_ANA_ENSSTD'); LONG_NAME = 'surface_temperature_of_land_incl_snow_ensstd'; UNITS = 'K' + case ('TSOIL1_ANA_ENSSTD'); LONG_NAME = 'soil_temperature_layer_1_analysis_ensstd'; UNITS = 'K' + + ! other land assimilation fields + + case ('MWRTM_VEGOPACITY'); LONG_NAME = 'Lband_microwave_vegopacity_normalized_with_cos_inc_angle'; UNITS = '1' ! default LONG_NAME and UNITS for nc4 files created by tile_bin2nc4.F90 (used for any SHORT_NAME not listed above): - case default; LONG_NAME = 'not defined in tile_bin2nc4.F90'; UNITS = 'not defined in tile_bin2nc4.F90'; - + case default; LONG_NAME = 'not defined in tile_bin2nc4.F90'; UNITS = 'not defined in tile_bin2nc4.F90'; + end select - + if (present(LNAME)) str_atr = trim (LONG_NAME) if (present(UNT)) str_atr = trim (UNITS ) - + END FUNCTION getAttribute - + END PROGRAM tile_bin2nc4 diff --git a/GEOSldas_App/util/config/rewind_GEOSldas.csh b/GEOSldas_App/util/config/rewind_GEOSldas.csh index a52a1951..38e383e9 100755 --- a/GEOSldas_App/util/config/rewind_GEOSldas.csh +++ b/GEOSldas_App/util/config/rewind_GEOSldas.csh @@ -70,24 +70,24 @@ while ($inens <= $NENS) if ($inens < 10) then set ENSDIR = `echo ens000${inens}` - set catin = `echo catch000${inens}` - set pertin = `echo landpert000${inens}` - set seedin = `echo obspertrseed000${inens}` + set catin = `echo catch_e000${inens}` + set pertin = `echo landpert_e000${inens}` + set seedin = `echo obspertrseed_e000${inens}` else if($inens < 100) then set ENSDIR = `echo ens00${inens}` - set catin = `echo catch00${inens}` - set pertin = `echo landpert00${inens}` - set seedin = `echo obspertrseed00${inens}` + set catin = `echo catch_e00${inens}` + set pertin = `echo landpert_e00${inens}` + set seedin = `echo obspertrseed_e00${inens}` else if($inens < 1000) then set ENSDIR = `echo ens0${inens}` - set catin = `echo catch0${inens}` - set pertin = `echo landpert0${inens}` - set seedin = `echo obspertrseed0${inens}` + set catin = `echo catch_e0${inens}` + set pertin = `echo landpert_e0${inens}` + set seedin = `echo obspertrseed_e0${inens}` else set ENSDIR = `echo ens${inens}` - set catin = `echo catch${inens}` - set pertin = `echo landpert${inens}` - set seedin = `echo obspertrseed${inens}` + set catin = `echo catch_e${inens}` + set pertin = `echo landpert_e${inens}` + set seedin = `echo obspertrseed_e${inens}` endif /bin/ln -s ${rsout}/${ENSDIR}/Y${yin}/M${min}/${expid}.catch_internal_rst.${date} ${catin}_internal_rst diff --git a/GEOSldas_App/util/shared/matlab/read_catchmentdef.m b/GEOSldas_App/util/shared/matlab/read_catchmentdef.m new file mode 100644 index 00000000..3a12c93d --- /dev/null +++ b/GEOSldas_App/util/shared/matlab/read_catchmentdef.m @@ -0,0 +1,46 @@ +function [tile_coord ] = read_catchmentdef( fname ) + +% read (land) tile properties from "catchment.def" file (EASEv2 and cube-sphere) +% +% reichle, 24 Jan 2025 +% +% ------------------------------------------------------------- + +% read file + +disp(['reading from ', fname]) + +ifp = fopen( fname, 'r' ); + +% read header line + +tmpdata = fscanf( ifp, '%f', 1 ); + +tile_coord.N_tile = tmpdata(1); + +% read rest of data + +tmpdata = fscanf( ifp, '%f' ); + +fclose(ifp); + +disp('done reading "catchment.def" file') + +% -------------------------------------------------- + +% process data + +tmpdata = reshape(tmpdata, [7, tile_coord.N_tile])'; + +tile_coord.tile_id = tmpdata(:,1); +tile_coord.pfaf_index = tmpdata(:,2); + +tile_coord.min_lon = tmpdata(:,3); +tile_coord.max_lon = tmpdata(:,4); +tile_coord.min_lat = tmpdata(:,5); +tile_coord.max_lat = tmpdata(:,6); + +tile_coord.elev = tmpdata(:,7); + +% ========== EOF =================================================== + diff --git a/GEOSldas_App/util/shared/matlab/read_tile_file.m b/GEOSldas_App/util/shared/matlab/read_tile_file.m new file mode 100644 index 00000000..874d6894 --- /dev/null +++ b/GEOSldas_App/util/shared/matlab/read_tile_file.m @@ -0,0 +1,446 @@ +function [ tile_coord ] = read_til_file( fname_til, fname_catchmentdef ) + +% read tile coordinates from tile file ("til") file (nc4 or ASCII, EASEv2 or cube-sphere) and +% put data into tile_coord structure (similar to that defined in GEOSldas) +% +% inputs: +% fname_til : Name (with full path) of nc4 or ASCII tile file (see examples below). +% +% fname_catchmentdef : Name of matching catchment.def file. +% OPTIONAL, for use with ASCII tile file from bcs in legacy layout +% (assembled from fname_til if tile file is from bcs in new layout). +% +% fname_til examples: +% '/discover/nobackup/projects/gmao/bcs_shared/fvInput/ExtData/esm/tiles/v12/geometry/EASEv2_M36/EASEv2_M36_964x406.til' +% '/discover/nobackup/projects/gmao/bcs_shared/fvInput/ExtData/esm/tiles/v12/geometry/CF0360x6C_DE1440xPE0720/CF0360x6C_DE1440xPE0720-Pfafstetter.til' +% +% IMPORTANT: +% This reader is designed to work for bcs versions NL5, v11, v12, and newer (beginning ~2022). +% It should be backward-compatible for most older bcs versions, but there is no +% expectation that it will work universally across all old and new versions. +% +% reichle, 27 Jan 2025 +% +% ------------------------------------------------------------- + +disp(['reading from ', fname_til]) + +% detect nc4 vs ASCII + +is_nc4 = 1; + +if ~strcmp(fname_til(end-2:end),'nc4'), is_nc4=0; end + +% ------------------------------------------------------------- + +if is_nc4 + + % read nc4 file + + s = ncinfo( fname_til ); + + % dimensions + + tile_coord.N_tile = s.Dimensions.Length; + + % --------------------------------- + + % read tile space attributes + + attnames = {s.Attributes.Name}; + + for kk=1:length(attnames) + + this_attname = attnames{kk}; + + % skip select attributes + + if strcmp(this_attname,'NCO' ), continue, end + if strcmp(this_attname,'history'), continue, end + + tmpdata = ncreadatt( fname_til, '/', this_attname ); + + cmd = ['tile_coord.', this_attname, ' = tmpdata;']; + + %disp(cmd) + eval(cmd) + + end + + % --------------------------------- + + % read tile variables + + varnames = {s.Variables.Name}; + + for kk=1:length(varnames) + + this_varname = varnames{kk}; + + tmpdata = ncread( fname_til, this_varname ); + + cmd = ['tile_coord.', this_varname, ' = tmpdata;']; + + %disp(cmd) + eval(cmd) + + end + +else + + % ------------------------------------------------------------- + % + % read ASCII file + + % determine fname_catchmentdef + + if ~exist('fname_catchmentdef','var') + + ind=strfind(fname_til,'/'); + + % verify that tile file is from bcs in new layout and naming convention + + if ~strcmp( fname_til(ind(end-2)+1:ind(end-1)-1), 'geometry' ) + + error('cannot derive fname_catchmentdef; try using optional input argument') + + end + + resolution = fname_til(ind(end-1)+1:ind(end)-1); + + fname_catchmentdef = [ fname_til(1:ind(end-2)), 'land/', resolution, '/clsm/catchment.def' ]; + + end + + % ------------------------------------------------------------- + % + % read tile file + + disp(['reading from ', fname_til]) + + ifp = fopen( fname_til, 'r' ); + + % ------------------------------------------------------------- + % + % EASE grid tile space? + + isEASE = 0; + + if ~isempty(findstr('EASE',fname_til)), isEASE=1; end + + % -------------- + % + % determine number of data columns + + if isEASE + + % NOTE: very old EASE versions have N_data_col=8 + % + % between SMAP bcs v001 (through Vv3030) and SMAP bcs v003[a] (from Vv4030), + % a new (9th) column was added in the *.til file + + N_data_col = 9; + + else + + N_data_col = 12; + + end + + % ------------------------------------------------------------- + % + % Number of integers in first header line depends on bcs version: + + N_headerline1 = 4; % for bcs versions after ~2022 + + old_versions = { 'Fortuna', ... + 'Ganymed', ... + 'Heracles', ... + 'Icarus', ... + 'Jason', ... + 'DYAMOND2', ... + 'FV3-1_0', ... + 'NL3', ... + 'NL4', ... + }; + + for kk=1:length(old_versions) + + if ~isempty( strfind( fname_til, old_versions{kk} )) + + N_headerline1 = 3; + + disp([ 'detected old bcs version ', old_versions{kk} ]) + + end + end + + % make exception for select "new" versions (stored in legacy bcs directory) that would otherwise + % be classified as "old" per the loop above + + new_versions = { 'Icarus-NLv5', ... + 'DYAMOND', ... + }; + + for kk=1:length(new_versions) + + if ~isempty( strfind( fname_til, new_versions{kk} )) + + N_headerline1 = 4; + + disp([ 'detected exception for new bcs version ', new_versions{kk} ]) + + end + end + + % echo final value of N_headerline1 + + disp(['using N_headerline1 = ', num2str(N_headerline1) ]) + + % ------------------------------------------------------------- + % + % read header + + % header line 1: + + tmpdata = fscanf( ifp, '%f', N_headerline1 ); + + N_tile_tmp = tmpdata(1); + + if N_headerline1==4 + + tile_coord.N_PfafCat = tmpdata(2); + tile_coord.raster_nx = tmpdata(3); + tile_coord.raster_ny = tmpdata(4); + + elseif N_headerline1==3 + + tile_coord.N_PfafCat = NaN; + tile_coord.raster_nx = tmpdata(2); + tile_coord.raster_ny = tmpdata(3); + + end + + % -------------- + % + % header line 2: + + tile_coord.N_Grids = fscanf( ifp, '%f', 1 ); + + % verify N_Grids (should be 1 for EASE and 2 for non-EASE) + + if isEASE & tile_coord.N_Grids~=1, error(['unexpected N_Grids for EASE tile space: ', num2str(tile_coord.N_Grids)]), end + + if ~isEASE & tile_coord.N_Grids~=2, error(['unexpected N_Grids for non-EASE tile space: ', num2str(tile_coord.N_Grids)]), end + + % Deal with older EASE bcs versions having (useless) header lines for grid 2, + % despite having the correct value of N_Grids=1 in header line 2. + + if isEASE & ( ~isempty(findstr('NL3',fname_til)) | ~isempty(findstr('NL4',fname_til)) ) + + tmp_n_grids = 2; + + else + + tmp_n_grids = tile_coord.N_Grids; + + end + + % -------------- + % + % header lines 3-5: + + tile_coord.Grid_Name = fscanf( ifp, '%s', 1 ); + tile_coord.IM = fscanf( ifp, '%f', 1 ); + tile_coord.JM = fscanf( ifp, '%f', 1 ); + + % -------------- + % + % header lines 6-8 (if present): + + if tmp_n_grids==2 + + % NOTE: EASE NL3 and NL4 contain additional header lines for second grid, despite (correct) N_Grids=1 + % For these old versions, read (and then ignore) additional header lines. + + tile_coord.Grid_ocn_Name = fscanf( ifp, '%s', 1 ); + tile_coord.IM_ocn = fscanf( ifp, '%f', 1 ); + tile_coord.JM_ocn = fscanf( ifp, '%f', 1 ); + + end + + % -------------- + % + % read data + + tmpdata = fscanf( ifp, '%f' ); + + fclose(ifp); + + disp('done reading "til" file') + + % verify N_tile*N_data_col against number of data read + + if length(tmpdata)~=N_tile_tmp*N_data_col, error('something wrong with N_tile*N_data_col'), end + + % convert into 2d array + + tmpdata = transpose( reshape(tmpdata, [N_data_col, N_tile_tmp]) ); + + % -------------------------------------------------- + % + % assign tile_id + % + % by convention, tile_id is equal to index number of tile in *.til file + + tmp_tileid = transpose(1:N_tile_tmp); + + % -------------------------------------------------- + % + % subset (if requested) + + %ind = find(tmpdata(:,1)==100); % keep only land + %ind = find(tmpdata(:,1)== 19); % keep only lakes + %ind = find(tmpdata(:,1)== 20); % keep only ice + %ind = find(tmpdata(:,1)~= 0); % keep land, lake, landice + + %tmpdata = tmpdata( ind,:); + + %tmp_tileid = tmp_tileid( ind, 1); + + % -------------------------------------------------- + % + % copy data into tile_coord structure + + tile_coord.N_tile = size(tmpdata,1); % number of tiles (assign here in case of subsetting above) + + % the following are universal (for EASE and non-EASE, all tile types) + + tile_coord.tile_id = tmp_tileid; % tile ID + + tile_coord.typ = tmpdata(:, 1); % tile type + + tile_coord.com_lon = tmpdata(:, 3); % center-of-mass longitude of tile + tile_coord.com_lat = tmpdata(:, 4); % center-of-mass latitude of tile + + tile_coord.i_indg = tmpdata(:, 5); % i index of tile on global "atm" (or EASE) grid + tile_coord.j_indg = tmpdata(:, 6); % j index of tile on global "atm" (or EASE) grid + tile_coord.frac_cell = tmpdata(:, 7); % area fraction of "atm" (or EASE) grid cell + + % initialize remaining fields (to be filled below) + + tmpNaN = NaN*ones(tile_coord.N_tile,1); + + tile_coord.min_lon = tmpNaN; % min longitude of tile + tile_coord.max_lon = tmpNaN; % max longitude of tile + tile_coord.min_lat = tmpNaN; % min latitude of tile + tile_coord.max_lat = tmpNaN; % max latitude of tile + + tile_coord.elev = tmpNaN; % elevation of tile + + tile_coord.area = tmpNaN; % area of "atm" grid cell + tile_coord.pfaf_index = tmpNaN; % index of (hydrological) Pfafstetter catchment + tile_coord.frac_pfaf = tmpNaN; % area fraction of Pfafstetter catchment + + if ~isEASE + + tile_coord.i_indg_ocn = tmpNaN; % i index of tile on global "ocean" grid (grid 2) + tile_coord.j_indg_ocn = tmpNaN; % j index of tile on global "ocean" grid (grid 2) + tile_coord.frac_cell_ocn = tmpNaN; % area fraction of "ocean" grid cell (grid 2) + + end + + % -------------------------------------------------- + % + % get indices for tile types + + ind_land = find( tile_coord.typ == 100); + ind_lake = find( tile_coord.typ == 19); + ind_landice = find( tile_coord.typ == 20); + ind_ocean = find( tile_coord.typ == 0); + + ind_NOTland = find( tile_coord.typ ~= 100); + ind_NOTocean = find( tile_coord.typ ~= 0); + + if isEASE + + col_area = NaN; + col_pfafindex = 2; % land tiles only + col_fracpfaf = NaN; % land tiles only + + else + + col_area = 2; + col_pfafindex = 9; % land tiles only + col_fracpfaf = 11; + + end + + + if ~isnan(col_area) + + tile_coord.area = tmpdata(:, col_area); % tile area + + end + + tile_coord.pfaf_index( ind_NOTocean) = tmpdata(ind_NOTocean, col_pfafindex); + + % ------------------------------------------------- + % + % EASE grid tile file: + % + % column 8: Pfafstetter index (same as column 2) + % column 9: Pfafstetter ID + % + % non-EASE grid tile file: + % + % column 9: i_indg2 [for ocean tiles] *OR* pfaf_index [for non-ocean tiles] + % column 10: j_indg2 + % column 11: frac_cell2 [for ocean tiles] *OR* frac_pfaf [for non-ocean tiles] + % column 12: dummy_index2 + + if ~isEASE + + tile_coord.frac_pfaf( ind_NOTocean) = tmpdata(ind_NOTocean, col_fracpfaf); + + tile_coord.i_indg_ocn( ind_ocean) = tmpdata(ind_ocean, 9); + tile_coord.j_indg_ocn( ind_ocean) = tmpdata(ind_ocean, 10); + tile_coord.frac_cell_ocn(ind_ocean) = tmpdata(ind_ocean, 11); + + end + + % ------------------------------------------------- + % + % get additional info from (land-only) "catchment.def" file + + tctmp = read_catchmentdef( fname_catchmentdef ); + + % verify consistency of catchment.def file and tile file + + if tctmp.N_tile~=length(ind_land) + + error('mismatch between tile file and catchment.def file: N_tile') + + end + + if ( any(tile_coord.tile_id( ind_land) - tctmp.tile_id ) | ... + any(tile_coord.pfaf_index(ind_land) - tctmp.pfaf_index) ... + ) + + error('mismatch between tile file and catchment.def file: tile_id or pfaf_index') + + end + + % fill tile_coord with relevant info from catchment.def + + tile_coord.min_lon(ind_land) = tctmp.min_lon; + tile_coord.max_lon(ind_land) = tctmp.max_lon; + tile_coord.min_lat(ind_land) = tctmp.min_lat; + tile_coord.max_lat(ind_land) = tctmp.max_lat; + + tile_coord.elev( ind_land) = tctmp.elev; + +end % if is_nc4 + +% ========== EOF =================================================== + diff --git a/GEOSldas_App/util/shared/matlab/read_tilecoord.m b/GEOSldas_App/util/shared/matlab/read_tilecoord.m index 422f6fb8..61cb646e 100644 --- a/GEOSldas_App/util/shared/matlab/read_tilecoord.m +++ b/GEOSldas_App/util/shared/matlab/read_tilecoord.m @@ -76,71 +76,71 @@ ifp = fopen( fname, 'r', machfmt); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.N_tile = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.N_tile = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); Nt = tile_coord.N_tile; - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.tile_id = fread( ifp, Nt, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.tile_id = fread( ifp, Nt, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.typ = fread( ifp, Nt, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.typ = fread( ifp, Nt, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.pfaf = fread( ifp, Nt, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.pfaf_index = fread( ifp, Nt, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.com_lon = fread( ifp, Nt, float_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.com_lon = fread( ifp, Nt, float_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.com_lat = fread( ifp, Nt, float_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.com_lat = fread( ifp, Nt, float_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.min_lon = fread( ifp, Nt, float_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.min_lon = fread( ifp, Nt, float_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.max_lon = fread( ifp, Nt, float_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.max_lon = fread( ifp, Nt, float_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.min_lat = fread( ifp, Nt, float_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.min_lat = fread( ifp, Nt, float_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.max_lat = fread( ifp, Nt, float_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.max_lat = fread( ifp, Nt, float_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.i_indg = fread( ifp, Nt, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.i_indg = fread( ifp, Nt, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.j_indg = fread( ifp, Nt, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.j_indg = fread( ifp, Nt, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.frac_cell = fread( ifp, Nt, float_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.frac_cell = fread( ifp, Nt, float_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.frac_pfaf = fread( ifp, Nt, float_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.frac_pfaf = fread( ifp, Nt, float_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.area = fread( ifp, Nt, float_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.area = fread( ifp, Nt, float_precision ); + fortran_tag = fread( ifp, 1, int_precision ); - fortran_tag = fread( ifp, 1, int_precision ); - tile_coord.elev = fread( ifp, Nt, float_precision ); - fortran_tag = fread( ifp, 1, int_precision ); + fortran_tag = fread( ifp, 1, int_precision ); + tile_coord.elev = fread( ifp, Nt, float_precision ); + fortran_tag = fread( ifp, 1, int_precision ); % if requested, convert to ASCII (txt) file @@ -166,7 +166,7 @@ '%5i%5i%13.6f%13.6f%13.4f%13.4f\n'], ... [tile_coord.tile_id(ii), ... tile_coord.typ(ii), ... - tile_coord.pfaf(ii), ... + tile_coord.pfaf_index(ii), ... tile_coord.com_lon(ii), ... tile_coord.com_lat(ii), ... tile_coord.min_lon(ii), ... @@ -208,7 +208,7 @@ tile_coord.tile_id = tmpdata(:, 1); tile_coord.typ = tmpdata(:, 2); - tile_coord.pfaf = tmpdata(:, 3); + tile_coord.pfaf_index = tmpdata(:, 3); tile_coord.com_lon = tmpdata(:, 4); tile_coord.com_lat = tmpdata(:, 5); tile_coord.min_lon = tmpdata(:, 6); diff --git a/GEOSmetforce_GridComp/LDAS_Forcing.F90 b/GEOSmetforce_GridComp/LDAS_Forcing.F90 old mode 100755 new mode 100644 index b87e6734..607dbcf0 --- a/GEOSmetforce_GridComp/LDAS_Forcing.F90 +++ b/GEOSmetforce_GridComp/LDAS_Forcing.F90 @@ -3091,6 +3091,10 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, & ! - updated comments ! ! qliu+reichle, 5 Dec 2023 - added GEOS-IT + ! + ! rreichle, 18 Dec 2024 - added M21C + ! + ! sqzhang+rreichle, 8 Apr 2025 - added "bkg.lfo_[inst,tavg]" for coupled land/atm DAS (replacing "Nx+-") ! ! ----------------------------------- ! @@ -3163,6 +3167,7 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, & integer, parameter :: N_MERRA_vars = 13 integer, parameter :: N_MERRA2_vars = 12 ! same as for G5DAS (excl Aerosol vars) integer, parameter :: N_Aerosol_vars = 60 ! additional aerosol forcing vars for GOSWIM (w/ MERRA-2 only for now) + integer, parameter :: N_M21C_vars = 12 integer, parameter :: N_MERRA2plusAerosol_vars = N_MERRA2_vars + N_Aerosol_vars @@ -3170,11 +3175,16 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, & real, parameter :: nodata_GEOSgcm = 1.e15 - character(40), dimension(N_G5DAS_vars, N_defs_cols) :: G5DAS_defs + character(40), dimension(N_G5DAS_vars, N_defs_cols) :: G5DAS_defs + character(40), dimension(N_G5DAS_vars, N_defs_cols) :: G5BKG_defs character(40), dimension(N_G5DAS_vars, N_defs_cols) :: GEOSIT_defs character(40), dimension(N_MERRA_vars, N_defs_cols) :: MERRA_defs character(40), dimension(N_MERRA2plusAerosol_vars, N_defs_cols) :: M2INT_defs character(40), dimension(N_MERRA2plusAerosol_vars, N_defs_cols) :: M2COR_defs + character(40), dimension(N_M21C_vars, N_defs_cols) :: M21CINT_defs + character(40), dimension(N_M21C_vars, N_defs_cols) :: M21CCOR_defs + character(40), dimension(N_M21C_vars, N_defs_cols) :: M21CCSINT_defs + character(40), dimension(N_M21C_vars, N_defs_cols) :: M21CCSCOR_defs character(40), dimension(:,:), allocatable :: GEOSgcm_defs @@ -3205,7 +3215,7 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, & integer :: j, k, GEOSgcm_var, fid, km, lm, nvars, ngatts, rc, YYYYMMDD, HHMMSS - logical :: minimize_shift, use_prec_corr, use_Predictor, tmp_init + logical :: minimize_shift, use_prec_corr, use_bkg, tmp_init logical :: daily_met_files, daily_precipcorr_files @@ -3245,6 +3255,46 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, & G5DAS_defs(11,:)=[character(len=40):: 'QLML ','inst','inst1_2d_lfo_Nx','diag','S'] G5DAS_defs(12,:)=[character(len=40):: 'SPEEDLML','inst','inst1_2d_lfo_Nx','diag','S'] + + ! ----------------------------------------------------------------------- + ! + ! define coupled land/atm DAS file specs (i.e., use bkg.lfo_* files) + ! + ! same as G5DAS except for file tag (column 3) + + G5BKG_defs = G5DAS_defs + + ! character(40): + ! 1 2 3 4 + ! 1234567890123456789012345678901234567890 + + G5BKG_defs( 1,3) = 'bkg.lfo_tavg ' + G5BKG_defs( 2,3) = 'bkg.lfo_tavg ' + G5BKG_defs( 3,3) = 'bkg.lfo_tavg ' + G5BKG_defs( 4,3) = 'bkg.lfo_tavg ' + G5BKG_defs( 5,3) = 'bkg.lfo_tavg ' + G5BKG_defs( 6,3) = 'bkg.lfo_tavg ' + G5BKG_defs( 7,3) = 'bkg.lfo_tavg ' + G5BKG_defs( 8,3) = 'bkg.lfo_inst ' + G5BKG_defs( 9,3) = 'bkg.lfo_inst ' + G5BKG_defs(10,3) = 'bkg.lfo_inst ' + G5BKG_defs(11,3) = 'bkg.lfo_inst ' + G5BKG_defs(12,3) = 'bkg.lfo_inst ' + + G5BKG_defs( 1,4) = 'rs ' + G5BKG_defs( 2,4) = 'rs ' + G5BKG_defs( 3,4) = 'rs ' + G5BKG_defs( 4,4) = 'rs ' + G5BKG_defs( 5,4) = 'rs ' + G5BKG_defs( 6,4) = 'rs ' + G5BKG_defs( 7,4) = 'rs ' + G5BKG_defs( 8,4) = 'rs ' + G5BKG_defs( 9,4) = 'rs ' + G5BKG_defs(10,4) = 'rs ' + G5BKG_defs(11,4) = 'rs ' + G5BKG_defs(12,4) = 'rs ' + + ! ----------------------------------------------------------------------- ! ! define GEOS-IT file specs @@ -3253,8 +3303,7 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, & GEOSIT_defs = G5DAS_defs - ! GEOSIT character(40): - ! + ! character(40): ! 1 2 3 4 ! 1234567890123456789012345678901234567890 @@ -3272,6 +3321,91 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, & GEOSIT_defs(12,3) = 'lfo_inst_1hr_glo_L576x361_slv ' + ! ----------------------------------------------------------------------- + ! + ! define M21C file specs + ! + ! M21C file specs with uncorrected (AGCM) precip from the "int" Collection + ! (ie, the precip generated by the AGCM within the M21C system) + ! + ! NOTE: This is *NOT* the precipitation seen by the land surface in the M21C system. + + M21CINT_defs( 1,:)=[character(len=40):: 'SWGDN ', 'tavg','lfo_tavg_1hr_glo_L1152x721_slv', 'diag','F'] + M21CINT_defs( 2,:)=[character(len=40):: 'LWGAB ', 'tavg','lfo_tavg_1hr_glo_L1152x721_slv', 'diag','F'] + M21CINT_defs( 3,:)=[character(len=40):: 'PARDR ', 'tavg','lfo_tavg_1hr_glo_L1152x721_slv', 'diag','F'] + M21CINT_defs( 4,:)=[character(len=40):: 'PARDF ', 'tavg','lfo_tavg_1hr_glo_L1152x721_slv', 'diag','F'] + M21CINT_defs( 5,:)=[character(len=40):: 'PRECRAINCU', 'tavg','int_tavg_1hr_glo_L1152x721_slv', 'diag','F'] ! uncorrected + M21CINT_defs( 6,:)=[character(len=40):: 'PRECRAINLS', 'tavg','int_tavg_1hr_glo_L1152x721_slv', 'diag','F'] ! uncorrected + M21CINT_defs( 7,:)=[character(len=40):: 'PRECSNO ', 'tavg','int_tavg_1hr_glo_L1152x721_slv', 'diag','F'] ! uncorrected + M21CINT_defs( 8,:)=[character(len=40):: 'PS ', 'inst','lfo_inst_1hr_glo_L1152x721_slv', 'diag','S'] + M21CINT_defs( 9,:)=[character(len=40):: 'HLML ', 'inst','lfo_inst_1hr_glo_L1152x721_slv', 'diag','S'] + M21CINT_defs( 10,:)=[character(len=40):: 'TLML ', 'inst','lfo_inst_1hr_glo_L1152x721_slv', 'diag','S'] + M21CINT_defs( 11,:)=[character(len=40):: 'QLML ', 'inst','lfo_inst_1hr_glo_L1152x721_slv', 'diag','S'] + M21CINT_defs( 12,:)=[character(len=40):: 'SPEEDLML ', 'inst','lfo_inst_1hr_glo_L1152x721_slv', 'diag','S'] + + ! same but for cube-sphere lfo (only works when using matching c360 tile space for simulation) + + M21CCSINT_defs = M21CINT_defs + + ! character(40): + ! 1 2 3 4 + ! 1234567890123456789012345678901234567890 + + M21CCSINT_defs( 1,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' + M21CCSINT_defs( 2,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' + M21CCSINT_defs( 3,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' + M21CCSINT_defs( 4,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' + M21CCSINT_defs( 5,3) = 'int_tavg_1hr_glo_C360x360x6_slv ' ! uncorrected + M21CCSINT_defs( 6,3) = 'int_tavg_1hr_glo_C360x360x6_slv ' ! uncorrected + M21CCSINT_defs( 7,3) = 'int_tavg_1hr_glo_C360x360x6_slv ' ! uncorrected + M21CCSINT_defs( 8,3) = 'lfo_inst_1hr_glo_C360x360x6_slv ' + M21CCSINT_defs( 9,3) = 'lfo_inst_1hr_glo_C360x360x6_slv ' + M21CCSINT_defs(10,3) = 'lfo_inst_1hr_glo_C360x360x6_slv ' + M21CCSINT_defs(11,3) = 'lfo_inst_1hr_glo_C360x360x6_slv ' + M21CCSINT_defs(12,3) = 'lfo_inst_1hr_glo_C360x360x6_slv ' + + ! M21C file specs with corrected precip, which could be either + ! - native (ie, the precip seen by the land surface in the M21C system), or + ! - corrected in post-processing using M21C (uncorrected) precip as the background + ! The default is to use M21C native precip corrections. If the "met_tag" includes + ! an optional "__prec[xyz]" string, the precip corrections specified by [xyz] are used. + ! + ! NOTE: This is *NOT* the same as the corrected precipitation of the off-line + ! spin-up run used to generate the M21C land surface initial conditions + ! for each stream. These precip files used for that have a MERRA-2 background. + + M21CCOR_defs = M21CINT_defs + + M21CCOR_defs( 5,:)=[character(len=40):: 'PRECRAINCUCORR','tavg','lfo_tavg_1hr_glo_L1152x721_slv', 'diag','F'] ! M21C built-in corrections + M21CCOR_defs( 6,:)=[character(len=40):: 'PRECRAINLSCORR','tavg','lfo_tavg_1hr_glo_L1152x721_slv', 'diag','F'] ! M21C built-in corrections + M21CCOR_defs( 7,:)=[character(len=40):: 'PRECSNOCORR ','tavg','lfo_tavg_1hr_glo_L1152x721_slv', 'diag','F'] ! M21C built-in corrections + + ! same but for cube-sphere lfo (only works when using matching c360 tile space for simulation) + + M21CCSCOR_defs = M21CCOR_defs + + ! character(40): + ! 1 2 3 4 + ! 1234567890123456789012345678901234567890 + + M21CCSCOR_defs( 1,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' + M21CCSCOR_defs( 2,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' + M21CCSCOR_defs( 3,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' + M21CCSCOR_defs( 4,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' + M21CCSCOR_defs( 5,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' ! M21C built-in corrections + M21CCSCOR_defs( 6,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' ! M21C built-in corrections + M21CCSCOR_defs( 7,3) = 'lfo_tavg_1hr_glo_C360x360x6_slv ' ! M21C built-in corrections + M21CCSCOR_defs( 8,3) = 'lfo_inst_1hr_glo_C360x360x6_slv ' + M21CCSCOR_defs( 9,3) = 'lfo_inst_1hr_glo_C360x360x6_slv ' + M21CCSCOR_defs(10,3) = 'lfo_inst_1hr_glo_C360x360x6_slv ' + M21CCSCOR_defs(11,3) = 'lfo_inst_1hr_glo_C360x360x6_slv ' + M21CCSCOR_defs(12,3) = 'lfo_inst_1hr_glo_C360x360x6_slv ' + + + ! ----------------------------------------------------------------------- + ! + ! define MERRA-2 file specs + ! ! MERRA-2 file specs with uncorrected (AGCM) precip from the "int" Collection ! (ie, the precip generated by the AGCM within the MERRA-2 system) ! @@ -3443,8 +3577,10 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, & M2COR_defs(71,:)=[character(len=40):: 'SSSD004 ','tavg','tavg1_2d_adg_Nx','diag','F'] M2COR_defs(72,:)=[character(len=40):: 'SSSD005 ','tavg','tavg1_2d_adg_Nx','diag','F'] - - ! MERRA file specs + + ! ----------------------------------------------------------------------- + ! + ! define (original) MERRA file specs ! ! use *only* "tavg" files b/c "bkg.sfc" files are available only every 6h ! @@ -3549,6 +3685,47 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, & call parse_MERRA_met_tag( met_path, met_tag, date_time_bkwd, & met_path_bkwd, prec_path_bkwd, met_tag_bkwd, use_prec_corr ) + + elseif (met_tag(1:4)=='M21C') then ! M21C (must check M21C before MERRA-2 because MERRA2 uses "M2") + + N_GEOSgcm_vars = N_M21C_vars + + allocate(GEOSgcm_defs(N_GEOSgcm_vars,N_defs_cols)) + + if (met_tag(1:7)=='M21CINT') then + + GEOSgcm_defs(1:N_GEOSgcm_vars,:) = M21CINT_defs( 1:N_GEOSgcm_vars,:) + + elseif (met_tag(1:7)=='M21CCOR') then + + GEOSgcm_defs(1:N_GEOSgcm_vars,:) = M21CCOR_defs( 1:N_GEOSgcm_vars,:) + + elseif (met_tag(1:9)=='M21CCSINT') then + + GEOSgcm_defs(1:N_GEOSgcm_vars,:) = M21CCSINT_defs(1:N_GEOSgcm_vars,:) + + elseif (met_tag(1:9)=='M21CCSCOR') then + + GEOSgcm_defs(1:N_GEOSgcm_vars,:) = M21CCSCOR_defs(1:N_GEOSgcm_vars,:) + + else + + call ldas_abort(LDAS_GENERIC_ERROR, Iam, 'unknown "M21C[xxx]" met_tag') + + end if + + daily_met_files = .false. ! might change to daily upon public distribution? + + call parse_M21C_met_tag( met_path, met_tag, date_time_inst, & + met_path_inst, prec_path_inst, met_tag_inst, use_prec_corr ) + + call parse_M21C_met_tag( met_path, met_tag, date_time_fwd, & + met_path_fwd, prec_path_fwd, met_tag_fwd, use_prec_corr ) + + call parse_M21C_met_tag( met_path, met_tag, date_time_bkwd, & + met_path_bkwd, prec_path_bkwd, met_tag_bkwd, use_prec_corr ) + + elseif (met_tag(1:2)=='M2') then ! MERRA-2 select case (AEROSOL_DEPOSITION) @@ -3595,47 +3772,51 @@ subroutine get_GEOS( date_time, force_dtstep, met_path, met_tag, & call parse_MERRA2_met_tag( met_path, met_tag, date_time_bkwd, & met_path_bkwd, prec_path_bkwd, met_tag_bkwd, use_prec_corr ) + - else ! GEOS ADAS (FP) + else ! GEOS ADAS (FP, GEOSIT) + + call parse_G5DAS_met_tag( met_path, met_tag, date_time_inst, & + met_path_inst, prec_path_inst, met_tag_inst, use_prec_corr, & + use_bkg ) + + call parse_G5DAS_met_tag( met_path, met_tag, date_time_fwd, & + met_path_fwd, prec_path_fwd, met_tag_fwd, use_prec_corr, & + use_bkg ) + call parse_G5DAS_met_tag( met_path, met_tag, date_time_bkwd, & + met_path_bkwd, prec_path_bkwd, met_tag_bkwd, use_prec_corr, & + use_bkg ) + ! AEROSOL_DEPOSITION /= 0 is NOT supported N_GEOSgcm_vars = N_G5DAS_vars allocate(GEOSgcm_defs(N_GEOSgcm_vars,N_defs_cols)) - if ( (index(met_tag, 'GEOSIT') > 0) .or. (index(met_tag, 'geosit') > 0) ) then + if ( (index(met_tag, 'GEOSIT') > 0) .or. (index(met_tag, 'geosit') > 0) ) then GEOSgcm_defs(1:N_G5DAS_vars,:) = GEOSIT_defs - else + else if ( use_bkg ) then + GEOSgcm_defs(1:N_G5DAS_vars,:) = G5BKG_defs + + ! +++++++++++++++++++++++++++++ + ! for now, keep 'Nx+-' to ensure backward compatibility w/ regression tests; 'Nx+-' is obsolete otherwise + ! - reichle, 14 Apr 2025 + if (index(met_tag, 'Nx+-') > 0) then ! "met_tag" here is as specified in LDAS.rc, incl. optional tag segments + GEOSgcm_defs(1:N_G5DAS_vars,:) = G5DAS_defs + ! append "+-" to GCM file tag (ie, replace "Nx" with "Nx+-") + do j=1,N_GEOSgcm_vars + GEOSgcm_defs(j,3) = trim(GEOSgcm_defs(j,3)) // '+-' + end do + end if + ! +++++++++++++++++++++++++++++ + + else GEOSgcm_defs(1:N_G5DAS_vars,:) = G5DAS_defs end if - call parse_G5DAS_met_tag( met_path, met_tag, date_time_inst, & - met_path_inst, prec_path_inst, met_tag_inst, use_prec_corr, & - use_Predictor ) - - call parse_G5DAS_met_tag( met_path, met_tag, date_time_fwd, & - met_path_fwd, prec_path_fwd, met_tag_fwd, use_prec_corr, & - use_Predictor ) - - call parse_G5DAS_met_tag( met_path, met_tag, date_time_bkwd, & - met_path_bkwd, prec_path_bkwd, met_tag_bkwd, use_prec_corr, & - use_Predictor ) - - if (use_Predictor) then - - ! append "+-" to GCM file tag (ie, replace "Nx" with "Nx+-") - - do j=1,N_GEOSgcm_vars - - GEOSgcm_defs(j,3) = trim(GEOSgcm_defs(j,3)) // '+-' - - end do - - end if - end if - + allocate(force_array(N_catd,N_GEOSgcm_vars)) ! --------------------------------------------------------------------------- @@ -4624,11 +4805,166 @@ subroutine parse_MERRA2_met_tag( met_path_in, met_tag_in, date_time, & end subroutine parse_MERRA2_met_tag + ! **************************************************************** + + subroutine parse_M21C_met_tag( met_path_in, met_tag_in, date_time, & + met_path_default, met_path_prec, met_tag_out, use_prec_corr ) + + ! reichle, 15 Jan 2025 + + ! parse M21C "met_tag", extract M21C stream, assemble data paths + ! + ! met_tag = "M21C[CS][xxx]_[STREAM]{__prec[PREC]}" + ! + ! where {__prec[PREC]} is optional and where + ! + ! [xxx] = 'INT' or 'COR' + ! [CS] = cube-sphere forcing (optional; works only with matching c360 tile space for simulation) + ! [STREAM] = 'jan98', 'jan08', 'jan18', or 'cross' + ! [PREC] = indicates corrected precip dataset + ! + ! examples: + ! + ! STREAM = 'jan08' : use only Stream 2 M21C data + ! STREAM = 'cross' : integrate across more than one M21C stream + ! + ! --------------------------------------------------------------------------- + + implicit none + + character(*), intent(in) :: met_path_in + character(*), intent(in) :: met_tag_in + + type(date_time_type), intent(in) :: date_time + + character(200), intent(out) :: met_path_default, met_path_prec + character( 80), intent(out) :: met_tag_out + + logical, intent(out) :: use_prec_corr + + ! local variables + + integer :: is, tmpind + + type(date_time_type) :: dt1, dt2 + + character( 5) :: tmpstream + character(16) :: stream + character(80) :: prec_tag + + character(len=*), parameter :: Iam = 'parse_M21C_met_tag' + character(len=400) :: err_msg + + ! ---------------------------------------------------------- + + ! define intervals that determine which MERRA-2 stream is used + ! in integrations that "cross" multiple streams + ! + ! 1/1/1998 - 12/31/2007: e5303_m21c_jan98 (Stream 1) + ! 1/1/2008 - 12/31/2017: e5303_m21c_jan08 (Stream 2) + ! 1/1/2018 - present: e5303_m21c_jan18 (Stream 3) + + ! dates before dt1 use Stream 1 + + dt1%year = 2008 + dt1%month = 1 + dt1%day = 1 + dt1%hour = 0 + dt1%min = 0 + dt1%sec = 0 + + ! otherwise, dates before dt2 use Stream 2 + + dt2%year = 2018 + dt2%month = 1 + dt2%day = 1 + dt2%hour = 0 + dt2%min = 0 + dt2%sec = 0 + + ! ---------------------------------------------------- + + ! initialize + + met_tag_out = repeat(' ', len(met_tag_out)) + + stream = repeat(' ', len(stream )) + + ! define which stream to use + + tmpind = 9 + + if (met_tag_in(5:6) == 'CS') tmpind = tmpind + 2 + + tmpstream = met_tag_in(tmpind:tmpind+4) + + if (tmpstream=='cross') then + + if (datetime_lt_refdatetime( date_time, dt1 )) then + + tmpstream = 'jan98' + + elseif (datetime_lt_refdatetime( date_time, dt2 )) then + + tmpstream = 'jan08' + + else + + tmpstream = 'jan18' + + end if + + end if + + met_tag_out = 'e5303_m21c_' // tmpstream + + met_path_default = trim(met_path_in) // '/' + + ! ----------------------------------------------------- + ! + ! identify which precip corrections to use, + ! assemble met_path accordingly + ! + ! met_tag = "M21C[CS][xxx]_[STREAM]{__prec[PREC]}" + ! + ! where {__prec[PREC]} is optional + + is = index( met_tag_in, '__') + + if (is>0) then ! using precip corrections + + prec_tag = met_tag_in(is+6:len(met_tag_in)) + + met_path_prec = trim(met_path_in) // '/precip_corr_' // trim(prec_tag) // '/' + + use_prec_corr = .true. + + else ! not using precip corrections + + prec_tag = repeat(' ', len(prec_tag)) + + met_path_prec = met_path_default + + use_prec_corr = .false. + + ! check if prec_tag was accidentally appended with a single underscore + + if (len_trim(met_tag_in)>tmpind+6) then + + err_msg = 'questionable met_tag_in, not enough double underscores' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + + end if + + end if + + end subroutine parse_M21C_met_tag + ! **************************************************************** - subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, & - met_path_default, met_path_prec, met_tag_out, use_prec_corr, & - use_Predictor ) + subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, & + met_path_default, met_path_prec, met_tag_out, use_prec_corr, & + use_bkg ) ! parse G5DAS "met_tag" ! @@ -4659,13 +4995,14 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, & ! reichle, 17 Jan 2020: added FP transition from f522 to f525 ! reichle, 3 Apr 2020: added FP transition from f525 to f525_p5 ! qliu+reichle, 5 Dec 2023: added GEOS-IT - ! + ! sqz+reichle, 8 Apr 2025: added G5BKG (replacing "Nx+-") + ! ! --------------------------------------------------------------------------- implicit none - character(*), intent(in) :: met_path_in - character(*), intent(in) :: met_tag_in + character(*), intent(in) :: met_path_in + character(*), intent(in) :: met_tag_in type(date_time_type), intent(in) :: date_time @@ -4673,7 +5010,7 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, & character( 80), intent(out) :: met_tag_out logical, intent(out) :: use_prec_corr - logical, intent(out) :: use_Predictor + logical, intent(out) :: use_bkg ! local variables @@ -4927,7 +5264,7 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, & use_prec_corr = .false. - use_Predictor = .false. + use_bkg = .false. ! ----------------------------------------------------- ! @@ -5110,11 +5447,15 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, & use_prec_corr = .true. prec_tag = tmp_tag(ii)(5:len(tmp_tag(ii))) + + elseif ( (tmp_tag(ii)(1:3)=='bkg') .or. (tmp_tag(ii)(1:4)=='Nx+-') ) then + ! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ! for now, keep 'Nx+-' to ensure backward compatibility w/ regression tests; 'Nx+-' is obsolete otherwise + ! - reichle, 14 Apr 2025 + ! +++++++++++++++++++++++++++++ - elseif (tmp_tag(ii)(1:4)=='Nx+-') then + use_bkg = .true. - use_Predictor = .true. - else err_msg = 'invalid met_tag_in, unknown optional tag segment' @@ -5143,7 +5484,7 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, & ! Double-check if optional tag segments were somehow missed, e.g., ! because they were accidentally appended with single underscores. ! Assumes that "prec" and "Nx+-" never appear in GEOS-5 product names. - ! Does NOT protect against spelling errors, e.g., "__perc" or "__Nx-+". + ! Does NOT protect against spelling errors, e.g., "__perc" or "__bgk" or "__Nx-+". ! - reichle, 24 Nov 2015 if ((.not. use_prec_corr) .and. (index( met_tag_in, 'prec')>0)) then @@ -5153,13 +5494,22 @@ subroutine parse_G5DAS_met_tag( met_path_in, met_tag_in, date_time, & end if - if ((.not. use_Predictor) .and. (index( met_tag_in, 'Nx+-')>0)) then + if ((.not. use_bkg) .and. (index( met_tag_in, 'bkg')>0)) then - err_msg = 'questionable met_tag_in: includes "Nx+-" but use_Predictor=.false.' + err_msg = 'questionable met_tag_in: includes "bkg" but use_bkg=.false.' + call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) + + end if + + ! +++++++++++++++++++++++++++++ + ! for now, keep 'Nx+-' to ensure backward compatibility w/ regression tests; 'Nx+-' is obsolete otherwise + ! - reichle, 14 Apr 2025 + if ((.not. use_bkg) .and. (index( met_tag_in, 'Nx+-')>0)) then + err_msg = 'questionable met_tag_in: includes "Nx+-" but use_bkg=.false.' call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) - end if - + ! +++++++++++++++++++++++++++++ + end subroutine parse_G5DAS_met_tag ! **************************************************************** @@ -5214,12 +5564,19 @@ subroutine get_GEOS_forcing_filename(fname_full,file_exists, date_time, daily_fi time_stamp(1:8) = YYYY // MM // DD - elseif (index(met_tag,'GEOSIT') > 0 .or. index(met_tag,'geosit') > 0) then + elseif ( & + index(met_tag,'GEOSIT') > 0 .or. index(met_tag,'geosit') > 0 .or. & + index(met_tag,'M21C' ) > 0 .or. index(met_tag,'m21c' ) > 0 & + ) then + + ! newer time stamp format (GEOS-IT, M21C, ...) time_stamp(1:16) = YYYY //'-'// MM //'-'// DD // 'T' // trim(HHMM) // 'Z' - + else + ! old time stamp format (MERRA, MERRA-2, FP) + time_stamp(1:14) = YYYY // MM // DD // '_' // trim(HHMM) // 'z' end if @@ -5288,7 +5645,6 @@ subroutine get_GEOS_forcing_filename(fname_full,file_exists, date_time, daily_fi fname_full_tmp2 = trim(fname_full) ! remember for error log below - ! last try: for GEOS FP with generic file names, try product counter '.V02.' in year/month/day dir if (trim(met_tag(1:11))=='GEOS.fp.asm') then @@ -6336,8 +6692,7 @@ program ut_parse_G5DAS_met_tag character( 80) :: met_tag_out logical :: use_prec_corr - logical :: use_Predictor - + logical :: use_bkg ! other integer :: ii @@ -6348,11 +6703,12 @@ program ut_parse_G5DAS_met_tag met_tag_in_vec = (/ & 'gcmexpname' , & - 'gcmexpname__Nx+-' , & + 'gcmexpname__bkg' , & + 'gcmexpname__bkg' , & 'gcmexpname__precCORRPREC', & - 'gcmexpname__precCORRPREC__Nx+-' , & - 'gcmexpname__Nx+-__precCORRPREC' , & - 'gcmexpname__qrecCORRPREC__Nx+-' /) + 'gcmexpname__precCORRPREC__bkg' , & + 'gcmexpname__bkg__precCORRPREC' , & + 'gcmexpname__qrecCORRPREC__bgk' /) do ii=1,N_met_tag_in @@ -6364,13 +6720,13 @@ program ut_parse_G5DAS_met_tag write (*,*) 'met_tag_in = ', trim(met_tag_in) call parse_G5DAS_met_tag( met_path_in, met_tag_in, & - met_path_default, met_path_prec, met_tag_out, use_prec_corr, use_Predictor ) + met_path_default, met_path_prec, met_tag_out, use_prec_corr, use_bkg ) write (*,*) 'met_path_default = ', trim(met_path_default) write (*,*) 'met_path_prec = ', trim(met_path_prec) write (*,*) 'met_tag_out = ', trim(met_tag_out) - write (*,*) 'use_prec_corr = ', use_prec_corr - write (*,*) 'use_Predictor = ', use_Predictor + write (*,*) 'use_prec_corr = ', use_prec_corr + write (*,*) 'use_bkg = ', use_bkg end do diff --git a/LDAS_Shared/LDAS_TileCoordType.F90 b/LDAS_Shared/LDAS_TileCoordType.F90 index 4861ddce..f89aa5e7 100644 --- a/LDAS_Shared/LDAS_TileCoordType.F90 +++ b/LDAS_Shared/LDAS_TileCoordType.F90 @@ -50,7 +50,7 @@ module LDAS_TileCoordType integer :: tile_id ! unique tile ID integer :: f_num ! full domain ID integer :: typ ! (0=MAPL_Ocean, 100=MAPL_Land, 19=MAPL_Lake, 20=MAPL_LandIce) - integer :: pfaf ! Pfafstetter number (for land tiles, NOT unique) + integer :: pfaf_index ! index of Pfafstetter catchment (for land tiles, NOT unique) real :: com_lon ! center-of-mass longitude real :: com_lat ! center-of-mass latitude real :: min_lon ! minimum longitude (bounding box for tile) @@ -398,21 +398,21 @@ subroutine io_tile_coord_type( action, unitnum, N_tile, tile_coord ) write (unitnum) N_tile - write (unitnum) (tile_coord(n)%tile_id, n=1,N_tile) - write (unitnum) (tile_coord(n)%typ, n=1,N_tile) - write (unitnum) (tile_coord(n)%pfaf, n=1,N_tile) - write (unitnum) (tile_coord(n)%com_lon, n=1,N_tile) - write (unitnum) (tile_coord(n)%com_lat, n=1,N_tile) - write (unitnum) (tile_coord(n)%min_lon, n=1,N_tile) - write (unitnum) (tile_coord(n)%max_lon, n=1,N_tile) - write (unitnum) (tile_coord(n)%min_lat, n=1,N_tile) - write (unitnum) (tile_coord(n)%max_lat, n=1,N_tile) - write (unitnum) (tile_coord(n)%i_indg, n=1,N_tile) - write (unitnum) (tile_coord(n)%j_indg, n=1,N_tile) - write (unitnum) (tile_coord(n)%frac_cell, n=1,N_tile) - write (unitnum) (tile_coord(n)%frac_pfaf, n=1,N_tile) - write (unitnum) (tile_coord(n)%area, n=1,N_tile) - write (unitnum) (tile_coord(n)%elev, n=1,N_tile) + write (unitnum) (tile_coord(n)%tile_id, n=1,N_tile) + write (unitnum) (tile_coord(n)%typ, n=1,N_tile) + write (unitnum) (tile_coord(n)%pfaf_index, n=1,N_tile) + write (unitnum) (tile_coord(n)%com_lon, n=1,N_tile) + write (unitnum) (tile_coord(n)%com_lat, n=1,N_tile) + write (unitnum) (tile_coord(n)%min_lon, n=1,N_tile) + write (unitnum) (tile_coord(n)%max_lon, n=1,N_tile) + write (unitnum) (tile_coord(n)%min_lat, n=1,N_tile) + write (unitnum) (tile_coord(n)%max_lat, n=1,N_tile) + write (unitnum) (tile_coord(n)%i_indg, n=1,N_tile) + write (unitnum) (tile_coord(n)%j_indg, n=1,N_tile) + write (unitnum) (tile_coord(n)%frac_cell, n=1,N_tile) + write (unitnum) (tile_coord(n)%frac_pfaf, n=1,N_tile) + write (unitnum) (tile_coord(n)%area, n=1,N_tile) + write (unitnum) (tile_coord(n)%elev, n=1,N_tile) case ('r','R') @@ -437,7 +437,7 @@ subroutine io_tile_coord_type( action, unitnum, N_tile, tile_coord ) read (unitnum, iostat=istat) tmp_int; if (istat>0) call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) tile_coord(:)%typ = tmp_int(:) read (unitnum, iostat=istat) tmp_int; if (istat>0) call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) - tile_coord(:)%pfaf = tmp_int(:) + tile_coord(:)%pfaf_index = tmp_int(:) read (unitnum, iostat=istat) tmp_real; if (istat>0) call ldas_abort(LDAS_GENERIC_ERROR, Iam, err_msg) tile_coord(:)%com_lon = tmp_real(:) diff --git a/LDAS_Shared/LDAS_ensdrv_mpi.F90 b/LDAS_Shared/LDAS_ensdrv_mpi.F90 index 07cf17bd..1da40cdf 100644 --- a/LDAS_Shared/LDAS_ensdrv_mpi.F90 +++ b/LDAS_Shared/LDAS_ensdrv_mpi.F90 @@ -129,7 +129,7 @@ subroutine init_MPI_types() ! integer :: tile_id ! unique tile ID ! integer :: f_num ! full domain ID ! integer :: typ ! (0=MAPL_Ocean, 100=MAPL_Land, 19=MAPL_Lake, 20=MAPL_LandIce) - ! integer :: pfaf ! Pfafstetter number (for land tiles, NOT unique) + ! integer :: pfaf_index ! index of Pfafstetter catchment (for land tiles, NOT unique) ! real :: com_lon ! center-of-mass longitude ! real :: com_lat ! center-of-mass latitude ! real :: min_lon ! minimum longitude (bounding box for tile)