From dc02f69fc44c80f382769d88dbc961fe45bb68d9 Mon Sep 17 00:00:00 2001 From: AndrewEichmann-NOAA <58948505+AndrewEichmann-NOAA@users.noreply.github.com> Date: Thu, 10 Oct 2024 20:12:23 -0400 Subject: [PATCH 01/13] Fixes task names in gw-ci tests (#1320) This fixes the renaming of g-w tasks in the gw-ci tests. Tested on Hera - some tests fail, but as they did before and evidently not because of this renaming. Resolves https://github.com/NOAA-EMC/GDASApp/issues/1319 --- test/gw-ci/CMakeLists.txt | 46 +++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/test/gw-ci/CMakeLists.txt b/test/gw-ci/CMakeLists.txt index 1dba4dc0d..6c9faedf1 100644 --- a/test/gw-ci/CMakeLists.txt +++ b/test/gw-ci/CMakeLists.txt @@ -20,17 +20,17 @@ function(add_cycling_tests pslot YAML_PATH HOMEgfs RUNTESTS PROJECT_SOURCE_DIR T # stage IC's message(STATUS "staging the 1/2 cycle IC's for ${test_name} ctest") - add_test(NAME ${test_name}_gdasstage_ic_${HALF_CYCLE} - COMMAND /bin/bash -c "${PROJECT_SOURCE_DIR}/test/gw-ci/run_exp.sh ${pslot} gdasstage_ic ${HALF_CYCLE}" + add_test(NAME ${test_name}_gdas_stage_ic_${HALF_CYCLE} + COMMAND /bin/bash -c "${PROJECT_SOURCE_DIR}/test/gw-ci/run_exp.sh ${pslot} gdas_stage_ic ${HALF_CYCLE}" WORKING_DIRECTORY ${RUNTESTS}) - set_tests_properties(${test_name}_gdasstage_ic_${HALF_CYCLE} PROPERTIES LABELS "manual") + set_tests_properties(${test_name}_gdas_stage_ic_${HALF_CYCLE} PROPERTIES LABELS "manual") - # 1/2 cycle gdasfcst - message(STATUS "preparing 1/2 cycle gdasfcst for ${pslot} ctest") - add_test(NAME ${test_name}_gdasfcst_${HALF_CYCLE} - COMMAND /bin/bash -c "${PROJECT_SOURCE_DIR}/test/gw-ci/run_exp.sh ${pslot} gdasfcst_seg0 ${HALF_CYCLE}" + # 1/2 cycle gdas_fcst + message(STATUS "preparing 1/2 cycle gdas_fcst for ${pslot} ctest") + add_test(NAME ${test_name}_gdas_fcst_${HALF_CYCLE} + COMMAND /bin/bash -c "${PROJECT_SOURCE_DIR}/test/gw-ci/run_exp.sh ${pslot} gdas_fcst_seg0 ${HALF_CYCLE}" WORKING_DIRECTORY ${RUNTESTS}) - set_tests_properties(${test_name}_gdasfcst_${HALF_CYCLE} PROPERTIES LABELS "manual") + set_tests_properties(${test_name}_gdas_fcst_${HALF_CYCLE} PROPERTIES LABELS "manual") # Select the list of tasks to run for the full cycle message(STATUS "Tasks ${TASK_LIST}") @@ -54,12 +54,12 @@ if (WORKFLOW_TESTS) set(pslot "WCDA-3DVAR-C48mx500") set(YAML_PATH ${HOMEgfs}/ci/cases/pr/C48mx500_3DVarAOWCDA.yaml) set(TASK_LIST - "gdasprepoceanobs" - "gdasmarinebmat" - "gdasmarineanlinit" - "gdasmarineanlvar" - "gdasmarineanlchkpt" - "gdasmarineanlfinal" + "gdas_prepoceanobs" + "gdas_marinebmat" + "gdas_marineanlinit" + "gdas_marineanlvar" + "gdas_marineanlchkpt" + "gdas_marineanlfinal" ) add_cycling_tests(${pslot} ${YAML_PATH} ${HOMEgfs} ${RUNTESTS} ${PROJECT_SOURCE_DIR} "${TASK_LIST}") endif() @@ -85,15 +85,15 @@ if (RUN_GW_CI) set(pslot "GFSv17-3DVAR-C384mx025") set(YAML_PATH ${HOMEgfs}/ci/cases/gfsv17/C384mx025_3DVarAOWCDA.yaml) set(TASK_LIST - "gdasprepoceanobs" - "gdasmarinebmat" - "gdasmarineanlinit" - "gdasmarineanlvar" - "gdasmarineanlchkpt" - "gdasmarineanlfinal" - "gdasocnanalvrfy" - "gdasprep" - "gdasanal" + "gdas_prepoceanobs" + "gdas_marinebmat" + "gdas_marineanlinit" + "gdas_marineanlvar" + "gdas_marineanlchkpt" + "gdas_marineanlfinal" + "gdas_ocnanalvrfy" + "gdas_prep" + "gdas_anal" ) add_cycling_tests(${pslot} ${YAML_PATH} ${HOMEgfs} ${RUNTESTS} ${PROJECT_SOURCE_DIR} "${TASK_LIST}") endif() From 496b624e9f142be8e1ff5aff21f90308eef6b074 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Fri, 11 Oct 2024 13:35:02 +0000 Subject: [PATCH 02/13] Update to build on WCOSS (#1321) This updates the hashes of OOPS and SABER to incorporate changes needed for two ternary operators to instead be if-else statements to allow Intel 19 on WCOSS to compile JEDI. --- sorc/oops | 2 +- sorc/saber | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sorc/oops b/sorc/oops index 78a7a1ac3..0d2c235d7 160000 --- a/sorc/oops +++ b/sorc/oops @@ -1 +1 @@ -Subproject commit 78a7a1ac378db5b7950a597e7fe119f4ce684514 +Subproject commit 0d2c235d791e1ba0023ce300103174dddf71aed7 diff --git a/sorc/saber b/sorc/saber index bfab007ac..1f23a3665 160000 --- a/sorc/saber +++ b/sorc/saber @@ -1 +1 @@ -Subproject commit bfab007ac003bec1d6adddee5517f3abb701fdd3 +Subproject commit 1f23a36657f6d10b770348de0f5454e01d377105 From 6fb0a655ffe61c6dd4f2acaa4c4490121ba980fb Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Fri, 11 Oct 2024 15:10:24 +0000 Subject: [PATCH 03/13] Add modulefile/compile support for Gaea C6 (#1325) Closes #1323 This PR adds support for compiling GDASApp on Gaea's C6 nodes with spack-stack 1.6.0 Co-authored-by: Cory Martin --- build.sh | 2 +- modulefiles/GDAS/gaeac6.intel.lua | 95 +++++++++++++++++++++++++++++++ ush/detect_machine.sh | 3 + 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 modulefiles/GDAS/gaeac6.intel.lua diff --git a/build.sh b/build.sh index 48931b553..42ec34284 100755 --- a/build.sh +++ b/build.sh @@ -71,7 +71,7 @@ while getopts "p:t:c:hvdfa" opt; do done case ${BUILD_TARGET} in - hera | orion | hercules | wcoss2 | noaacloud | gaea) + hera | orion | hercules | wcoss2 | noaacloud | gaea | gaeac6 ) echo "Building GDASApp on $BUILD_TARGET" source $dir_root/ush/module-setup.sh module use $dir_root/modulefiles diff --git a/modulefiles/GDAS/gaeac6.intel.lua b/modulefiles/GDAS/gaeac6.intel.lua new file mode 100644 index 000000000..9069da3b8 --- /dev/null +++ b/modulefiles/GDAS/gaeac6.intel.lua @@ -0,0 +1,95 @@ +help([[ +Load environment for running the GDAS application with Intel compilers and MPI. +]]) + +local pkgName = myModuleName() +local pkgVersion = myModuleVersion() +local pkgNameVer = myModuleFullName() + +prepend_path("MODULEPATH", '/ncrc/proj/epic/spack-stack/c6/spack-stack-1.6.0/envs/unified-env/install/modulefiles/Core') +prepend_path("MODULEPATH", '/ncrc/proj/epic/rocoto/modulefiles') + +-- below two lines get us access to the spack-stack modules +load("stack-intel/2023.2.0") +load("stack-cray-mpich/8.1.29") +-- JCSDA has 'jedi-fv3-env/unified-dev', but we should load these manually as needed +load("cmake/3.23.1") +load("gettext/0.20.2") +--load("libunistring/1.1") +--load("libidn2/2.3.4") +load("pcre2/10.42") +load("curl/8.4.0") +load("zlib/1.2.13") +load("git/2.42.0") +load("pkg-config/0.29.2") +load("hdf5/1.14.0") +load("parallel-netcdf/1.12.2") +load("netcdf-c/4.9.2") +load("nccmp/1.9.0.1") +load("netcdf-fortran/4.6.1") +load("nco/5.0.6") +load("parallelio/2.5.10") +load("wget/1.21.3") +load("boost/1.83.0") +load("bufr/12.0.1") +load("git-lfs/2.11.0") +load("ecbuild/3.7.2") +load("openjpeg/2.3.1") +load("eccodes/2.32.0") +load("eigen/3.4.0") +load("openblas/0.3.24") +load("eckit/1.24.5") +load("fftw/3.3.10") +load("fckit/0.11.0") +load("fiat/1.2.0") +load("ectrans/1.2.0") +load("fms/2023.04") +load("esmf/8.6.0") +load("atlas/0.35.1") +load("sp/2.5.0") +load("gsl-lite/0.37.0") +load("libjpeg/2.1.0") +load("krb5/1.20.1") +load("libtirpc/1.3.3") +load("hdf/4.2.15") +load("jedi-cmake/1.4.0") +load("libpng/1.6.37") +--load("libxt/1.1.5") +--load("libxmu/1.1.4") +--load("libxpm/4.11.0") +load("libxaw/1.10.13") +load("udunits/2.2.28") +load("ncview/2.1.9") +load("netcdf-cxx4/4.3.1") +load("json/3.10.5") +load("crtm/2.4.0.1") +load("rocoto/1.3.6") +load("prod_util/2.1.1") + +load("py-jinja2/3.0.3") +load("py-netcdf4/1.5.8") +load("py-pybind11/2.11.0") +load("py-pycodestyle/2.11.0") +load("py-pyyaml/6.0") +load("py-scipy/1.11.3") +load("py-xarray/2023.7.0") +load("py-f90nml/1.4.3") +load("py-pip/23.1.2") + +setenv("CC","cc") +setenv("CXX","CC") +setenv("FC","ftn") + +local mpiexec = '/usr/bin/srun' +local mpinproc = '-n' +setenv('MPIEXEC_EXEC', mpiexec) +setenv('MPIEXEC_NPROC', mpinproc) + +setenv("CRTM_FIX","/gpfs/f6/ira-sti/world-shared/GDASApp/fix/crtm/2.4.0") +setenv("GDASAPP_TESTDATA","/gpfs/f6/ira-sti/world-shared/GDASApp/testdata") +setenv("GDASAPP_UNIT_TEST_DATA_PATH", "/gpfs/f6/ira-sti/world-shared/GDASApp/unittestdata") + +whatis("Name: ".. "pkgName") +whatis("Version: ".. "pkgVersion") +whatis("Category: GDASApp") +whatis("Description: Load all libraries needed for GDASApp") diff --git a/ush/detect_machine.sh b/ush/detect_machine.sh index 683ee0db7..997c394fa 100755 --- a/ush/detect_machine.sh +++ b/ush/detect_machine.sh @@ -24,6 +24,9 @@ case $(hostname -f) in gaea5[1-8]) MACHINE_ID=gaea ;; ### gaea51-58 gaea5[1-8].ncrc.gov) MACHINE_ID=gaea ;; ### gaea51-58 + gaea6[1-8]) MACHINE_ID=gaeac6 ;; ### gaea61-68 + gaea6[1-8].ncrc.gov) MACHINE_ID=gaeac6 ;; ### gaea61-68 + hfe0[1-9]) MACHINE_ID=hera ;; ### hera01-09 hfe1[0-2]) MACHINE_ID=hera ;; ### hera10-12 hecflow01) MACHINE_ID=hera ;; ### heraecflow01 From e024564f72e8b8b617e2a6a1cc06053e6dfb5786 Mon Sep 17 00:00:00 2001 From: DavidNew-NOAA <134300700+DavidNew-NOAA@users.noreply.github.com> Date: Tue, 15 Oct 2024 09:08:09 -0400 Subject: [PATCH 04/13] JCB-based obs+bias staging (#1312) This PR is a companion to Global-Workflow PR [#2992](https://github.com/NOAA-EMC/global-workflow/pull/2992) and JCB-GDAS PR [#31](https://github.com/NOAA-EMC/jcb-gdas/pull/31). It adds two parameters required for the above Global-Workflow PR to the JCB base YAML for the atmosphere. --- parm/atm/jcb-base.yaml.j2 | 14 ++++++++++++++ parm/jcb-gdas | 2 +- test/atm/global-workflow/config.yaml | 9 ++------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/parm/atm/jcb-base.yaml.j2 b/parm/atm/jcb-base.yaml.j2 index 6387fffbb..d7e1e5907 100644 --- a/parm/atm/jcb-base.yaml.j2 +++ b/parm/atm/jcb-base.yaml.j2 @@ -71,6 +71,8 @@ observations: all_observations crtm_coefficient_path: "{{ DATA }}/crtm/" # Naming conventions for observational files +atmosphere_obsdataroot_path: "{{COM_OBS}}" + atmosphere_obsdatain_path: "{{atm_obsdatain_path}}" atmosphere_obsdatain_prefix: "{{OPREFIX}}" atmosphere_obsdatain_suffix: ".tm00.nc" @@ -80,6 +82,8 @@ atmosphere_obsdataout_prefix: diag_ atmosphere_obsdataout_suffix: "_{{ current_cycle | to_YMDH }}.nc" # Naming conventions for bias correction files +atmosphere_obsbiasroot_path: "{{COM_ATMOS_ANALYSIS_PREV}}" + atmosphere_obsbiasin_path: "{{DATA}}/obs/" atmosphere_obsbiasin_prefix: "{{GPREFIX}}" atmosphere_obsbiasin_suffix: ".satbias.nc" @@ -94,6 +98,16 @@ atmosphere_obsbiasout_suffix: ".satbias.nc" atmosphere_obsbiascovout_prefix: "{{APREFIX}}" atmosphere_obsbiascovout_suffix: ".satbias_cov.nc" +bias_files: + atms_n20: rad_varbc_params.tar + atms_npp: rad_varbc_params.tar + mtiasi_metop-a: rad_varbc_params.tar + mtiasi_metop-b: rad_varbc_params.tar + amsua_n19: rad_varbc_params.tar + ssmis_f17: rad_varbc_params.tar + ssmis_f18: rad_varbc_params.tar + cris-fsr_n20: rad_varbc_params.tar + cris-fsr_npp: rad_varbc_params.tar # Local Ensemble DA (LETKF) # ------------------------- diff --git a/parm/jcb-gdas b/parm/jcb-gdas index 2b46aa19b..7717c0e74 160000 --- a/parm/jcb-gdas +++ b/parm/jcb-gdas @@ -1 +1 @@ -Subproject commit 2b46aa19b22df22f33ef0be5030fb719a8fa6298 +Subproject commit 7717c0e7401e344a6bce37a4f8ecc11399256936 diff --git a/test/atm/global-workflow/config.yaml b/test/atm/global-workflow/config.yaml index c06019628..d8bf2e4c2 100644 --- a/test/atm/global-workflow/config.yaml +++ b/test/atm/global-workflow/config.yaml @@ -10,7 +10,7 @@ base: PTMP: "@bindir@/test/atm/global-workflow/testrun" atmanl: - JCB_ALGO_YAML: "@srcdir@/test/atm/global-workflow/jcb-prototype_3dvar.yaml.j2" + JCB_ALGO_YAML_VAR: "@srcdir@/test/atm/global-workflow/jcb-prototype_3dvar.yaml.j2" STATICB_TYPE: "identity" ATMRES_ANL: "C48" LAYOUT_X_ATMANL: 1 @@ -19,11 +19,6 @@ atmanl: atmensanl: JCB_ALGO_YAML_LETKF: "@srcdir@/test/atm/global-workflow/jcb-prototype_lgetkf.yaml.j2" JCB_ALGO_YAML_OBS: "@srcdir@/test/atm/global-workflow/jcb-prototype_lgetkf_observer.yaml.j2" + JCB_ALGO_YAML_SOL: "@srcdir@/test/atm/global-workflow/jcb-prototype_lgetkf_solver.yaml.j2" LAYOUT_X_ATMENSANL: 1 LAYOUT_Y_ATMENSANL: 1 - -atmensanlobs: - JCB_ALGO_YAML: "@srcdir@/test/atm/global-workflow/jcb-prototype_lgetkf_observer.yaml.j2" - -atmensanlsol: - JCB_ALGO_YAML: "@srcdir@/test/atm/global-workflow/jcb-prototype_lgetkf_solver.yaml.j2" From e44d21e7f21f0173fcc6da743a8280e8277cf4f8 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 15 Oct 2024 13:14:53 +0000 Subject: [PATCH 05/13] Force older version of ubuntu in runners (#1332) Temporary-ish fix to get the Github actions working again --- .github/workflows/hera.yaml | 2 +- .github/workflows/norms.yaml | 2 +- .github/workflows/orion.yaml | 2 +- .github/workflows/unittests.yaml | 2 +- .github/workflows/unittests_g-w.yaml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/hera.yaml b/.github/workflows/hera.yaml index 3685ea4bd..3b4ef6245 100644 --- a/.github/workflows/hera.yaml +++ b/.github/workflows/hera.yaml @@ -5,7 +5,7 @@ on: jobs: test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 name: Passes on Hera steps: diff --git a/.github/workflows/norms.yaml b/.github/workflows/norms.yaml index 2e721e7af..36b56d554 100644 --- a/.github/workflows/norms.yaml +++ b/.github/workflows/norms.yaml @@ -3,7 +3,7 @@ on: [push] jobs: check_pynorms: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 name: Check coding norms with pycodestyle and cpplint steps: diff --git a/.github/workflows/orion.yaml b/.github/workflows/orion.yaml index f75de79c4..a0b841fe4 100644 --- a/.github/workflows/orion.yaml +++ b/.github/workflows/orion.yaml @@ -5,7 +5,7 @@ on: jobs: test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 name: Passes on Orion steps: diff --git a/.github/workflows/unittests.yaml b/.github/workflows/unittests.yaml index c103aee50..e716b0e89 100644 --- a/.github/workflows/unittests.yaml +++ b/.github/workflows/unittests.yaml @@ -3,7 +3,7 @@ on: [push, pull_request] jobs: ctests: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 name: Run Unit Tests with ctest steps: diff --git a/.github/workflows/unittests_g-w.yaml b/.github/workflows/unittests_g-w.yaml index 9abaa046a..2d6dc9602 100644 --- a/.github/workflows/unittests_g-w.yaml +++ b/.github/workflows/unittests_g-w.yaml @@ -3,7 +3,7 @@ on: [push, pull_request] jobs: ctests: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 name: Run Unit Tests inside global-workflow with ctest steps: From a1cb2ee3ef2c9f645ced641b30d8dd0c5965140d Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Wed, 16 Oct 2024 12:05:50 -0400 Subject: [PATCH 06/13] Feature/b2i tropical (#1311) Two converters added to the previous 6 bufr to ioda converters: drifters and tropical moorings. Both are taken from the dbuoy bufr input file. There is also a small bug correction in the cmake file. --- test/marine/CMakeLists.txt | 23 ++- ...insitu_profile_tropical_2019010700.yaml.in | 13 ++ ..._insitu_surface_drifter_2019010700.yaml.in | 13 ++ ...oda_insitu_profile_tropical_2019010700.ref | 25 ++++ ...ioda_insitu_surface_drifter_2019010700.ref | 20 +++ .../b2i/bufr2ioda_insitu_profile_tropical.py | 40 ++++++ .../b2i/bufr2ioda_insitu_surface_drifter.py | 38 +++++ .../marine/b2i/drifter_ioda_variables.py | 132 ++++++++++++++++++ .../marine/b2i/trkob_ioda_variables.py | 1 - .../marine/b2i/tropical_ioda_variables.py | 80 +++++++++++ 10 files changed, 378 insertions(+), 7 deletions(-) create mode 100644 test/marine/testinput/bufr2ioda_insitu_profile_tropical_2019010700.yaml.in create mode 100644 test/marine/testinput/bufr2ioda_insitu_surface_drifter_2019010700.yaml.in create mode 100644 test/marine/testref/bufr2ioda_insitu_profile_tropical_2019010700.ref create mode 100644 test/marine/testref/bufr2ioda_insitu_surface_drifter_2019010700.ref create mode 100755 ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tropical.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_drifter.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/drifter_ioda_variables.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/tropical_ioda_variables.py diff --git a/test/marine/CMakeLists.txt b/test/marine/CMakeLists.txt index 4dda602ca..92c880a58 100644 --- a/test/marine/CMakeLists.txt +++ b/test/marine/CMakeLists.txt @@ -88,7 +88,7 @@ CHECK_AND_SET_PATH( BUFR_TEST_DIR ) if (NOT BUFR_TEST_DIR_EXISTS) - message(STATUS "BUFR test file directory not found -- bufr to ioda tests not generted.") + message(WARNING "BUFR test file directory not found -- bufr to ioda tests not generated.") set(GENERATE_BUFR2IODA_TESTS FALSE) else() # message(STATUS "Found bufr test directory: ${BUFR_TEST_DIR}") @@ -105,7 +105,7 @@ else() OCEAN_BASIN_FILE ) if (NOT OCEAN_BASIN_FILE_EXISTS) - message("Ocean basin data file not found -- bufr to ioda tests not generated.") + message(WARNING "Ocean basin data file not found -- bufr to ioda tests not generated.") set(GENERATE_BUFR2IODA_TESTS FALSE) endif() # message(STATUS "Found ocean basin data in ${OCEAN_BASIN_FILE}") @@ -116,17 +116,26 @@ endif() function(ADD_INSITU_TEST testname testbufr) # set(CONFIG_TYPE "json") set(CONFIG_TYPE "yaml") - set(DATE "2021063006") + + if (testbufr STREQUAL "dbuoy") + set(DATE "2019010700") + set(CYCLE "00") + else() + set(DATE "2021063006") + set(CYCLE "06") + endif() + set(TEST "bufr2ioda_insitu_${testname}") set(TESTREF_FILE "${TEST}_${DATE}.ref") # stage the input file to directory ${BUFR_INPUT_DIR} set(BUFR_INPUT_DIR ${TEST_WORKING_DIR}) - set(BUFR_TEST_FILE "${DATE}-gdas.t06z.${testbufr}.tm00.bufr_d") + set(BUFR_TEST_FILE "${DATE}-gdas.t${CYCLE}z.${testbufr}.tm00.bufr_d") set(BUFR_FILE "${BUFR_TEST_DIR}/${BUFR_TEST_FILE}") if (NOT EXISTS ${BUFR_FILE}) - message(FATAL_ERROR "BUFR file ${BUFR_FILE} not found") + message(WARNING "BUFR file ${BUFR_FILE} not found, test not generated") + return() endif() file(COPY ${BUFR_FILE} DESTINATION ${BUFR_INPUT_DIR}) @@ -144,7 +153,7 @@ function(ADD_INSITU_TEST testname testbufr) ) add_test( - NAME test_${TEST} + NAME test_gdasapp_${TEST} COMMAND ${MARINE_BUFR2IODA_DIR}/${TEST}.py -c ${CONFIG_FILE} -t ${TESTREF_DIR}/${TESTREF_FILE} WORKING_DIRECTORY ${TEST_WORKING_DIR} ) @@ -156,6 +165,8 @@ if (GENERATE_BUFR2IODA_TESTS) ADD_INSITU_TEST("profile_bathy" "bathy") ADD_INSITU_TEST("profile_glider" "subpfl") ADD_INSITU_TEST("profile_tesac" "tesac") + ADD_INSITU_TEST("profile_tropical" "dbuoy") ADD_INSITU_TEST("profile_xbtctd" "xbtctd") + ADD_INSITU_TEST("surface_drifter" "dbuoy") ADD_INSITU_TEST("surface_trkob" "trkob") endif() diff --git a/test/marine/testinput/bufr2ioda_insitu_profile_tropical_2019010700.yaml.in b/test/marine/testinput/bufr2ioda_insitu_profile_tropical_2019010700.yaml.in new file mode 100644 index 000000000..1fa5a1856 --- /dev/null +++ b/test/marine/testinput/bufr2ioda_insitu_profile_tropical_2019010700.yaml.in @@ -0,0 +1,13 @@ +--- +data_format: dbuoy +subsets: dbuoy +source: NCEP data tank +data_type: drifter +cycle_type: gdas +cycle_datetime: '2019010700' +dump_directory: __BUFRINPUTDIR__ +ioda_directory: __IODAOUTPUTDIR__ +ocean_basin: __OCEANBASIN__ +data_description: 6-hrly in situ drifter profiles +data_provider: U.S. NOAA + diff --git a/test/marine/testinput/bufr2ioda_insitu_surface_drifter_2019010700.yaml.in b/test/marine/testinput/bufr2ioda_insitu_surface_drifter_2019010700.yaml.in new file mode 100644 index 000000000..1fa5a1856 --- /dev/null +++ b/test/marine/testinput/bufr2ioda_insitu_surface_drifter_2019010700.yaml.in @@ -0,0 +1,13 @@ +--- +data_format: dbuoy +subsets: dbuoy +source: NCEP data tank +data_type: drifter +cycle_type: gdas +cycle_datetime: '2019010700' +dump_directory: __BUFRINPUTDIR__ +ioda_directory: __IODAOUTPUTDIR__ +ocean_basin: __OCEANBASIN__ +data_description: 6-hrly in situ drifter profiles +data_provider: U.S. NOAA + diff --git a/test/marine/testref/bufr2ioda_insitu_profile_tropical_2019010700.ref b/test/marine/testref/bufr2ioda_insitu_profile_tropical_2019010700.ref new file mode 100644 index 000000000..915d09db3 --- /dev/null +++ b/test/marine/testref/bufr2ioda_insitu_profile_tropical_2019010700.ref @@ -0,0 +1,25 @@ +dateTime: 570, int64 min, max = 1546808400, 1546830000 +dateTime hash = cda368f6c8f06e883db7100f29073084ee92dc0a0021d995a6fe7ce477004da6 +rcptdateTime: 570, int64 min, max = -1, 1546871640 +rcptdateTime hash = d9545d679013eb8fcbc8fda146d184b83378faccf55c710416f4ad72d2819f68 +lon: 570, float32 min, max = -179.89999389648438, 165.10000610351562 +lon hash = c4a1e37e42a02279ec33a69b950b10327d2185adf99d5c0c6f5ffbe1f5c66292 +lat: 570, float32 min, max = -8.300000190734863, 8.0 +lat hash = d748eb8c0e55e7a2c684ee35d73a849ef945944967f8cb73ab31cf91bafdbcb2 +depth: 570, float32 min, max = 0.0, 500.0 +depth hash = 5b20e83513245f3f37e6c43a46cacd2c71d504da1ce175fbfe2eeffab487b20b +stationID: 570, Date: Wed, 16 Oct 2024 13:23:28 -0400 Subject: [PATCH 07/13] Update hercules module file to spack-stack 1.7 (#1330) In case somebody feels like testing this ... Draft because it's untested and still building. - fixes #1329 --- modulefiles/GDAS/hercules.intel.lua | 30 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/modulefiles/GDAS/hercules.intel.lua b/modulefiles/GDAS/hercules.intel.lua index 105efddee..83feccb2c 100644 --- a/modulefiles/GDAS/hercules.intel.lua +++ b/modulefiles/GDAS/hercules.intel.lua @@ -6,7 +6,7 @@ local pkgName = myModuleName() local pkgVersion = myModuleVersion() local pkgNameVer = myModuleFullName() -prepend_path("MODULEPATH", '/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-1.6.0/envs/unified-env/install/modulefiles/Core') +prepend_path("MODULEPATH", '/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-1.7.0/envs/ue-intel/install/modulefiles/Core') prepend_path("MODULEPATH", '/work2/noaa/da/python/opt/modulefiles/stack') -- below two lines get us access to the spack-stack modules @@ -14,35 +14,36 @@ load("stack-intel/2021.9.0") load("stack-intel-oneapi-mpi/2021.9.0") --load("stack-python/3.10.8") -- JCSDA has 'jedi-fv3-env/unified-dev', but we should load these manually as needed + load("cmake/3.23.1") load("curl/8.4.0") load("zlib/1.2.13") load("git/2.31.1") --load("pkg-config/0.27.1") -load("hdf5/1.14.0") -load("parallel-netcdf/1.12.2") +load("hdf5/1.14.3") +load("parallel-netcdf/1.12.3") load("netcdf-c/4.9.2") load("nccmp/1.9.0.1") load("netcdf-fortran/4.6.1") -load("nco/5.0.6") -load("parallelio/2.5.10") +load("nco/5.1.6") +load("parallelio/2.6.2") load("wget/1.21.1") -load("boost/1.83.0") +load("boost/1.84.0") load("bufr/12.0.1") load("git-lfs/3.1.2") load("ecbuild/3.7.2") -load("openjpeg/2.3.1") -load("eccodes/2.32.0") +load("openjpeg/2.4.0") +load("eccodes/2.33.0") load("eigen/3.4.0") -load("openblas/0.3.24") +load("openblas/0.3.27") load("eckit/1.24.5") load("fftw/3.3.10") load("fckit/0.11.0") load("fiat/1.2.0") load("ectrans/1.2.0") load("fms/2023.04") -load("esmf/8.6.0") -load("atlas/0.35.1") +load("esmf/8.6.1") +load("atlas/0.36.0") load("sp/2.5.0") load("gsl-lite/0.37.0") load("libjpeg/2.1.0") @@ -51,10 +52,10 @@ load("libtirpc/1.3.3") load("hdf/4.2.15") load("jedi-cmake/1.4.0") load("libpng/1.6.37") -load("libxt/1.1.5") +load("libxt/1.3.0") load("libxmu/1.1.4") -load("libxpm/4.11.0") -load("libxaw/1.0.13") +load("libxpm/3.5.17") +load("libxaw/1.0.15") load("udunits/2.2.28") load("ncview/2.1.9") load("netcdf-cxx4/4.3.1") @@ -69,7 +70,6 @@ unload("python/3.10.13") unload("py-numpy/1.22.3") load("miniconda3/4.6.14") load("gdasapp/1.0.0") - -- below is a hack because of cmake finding the wrong python... setenv("CONDA_PREFIX", "/work2/noaa/da/python/opt/core/miniconda3/4.6.14/envs/gdasapp/") From 29a80d6e4f1d932dd998b5c62ee387ce66909889 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Thu, 17 Oct 2024 11:39:07 -0400 Subject: [PATCH 08/13] add ensemble mean capability (#1335) Add ensmeanandvariance to gdas.x --- mains/gdas.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mains/gdas.cc b/mains/gdas.cc index 4a894b365..f47b82802 100755 --- a/mains/gdas.cc +++ b/mains/gdas.cc @@ -16,6 +16,7 @@ #include "oops/runs/ConvertToStructuredGrid.h" #include "oops/runs/ConvertState.h" +#include "oops/runs/EnsMeanAndVariance.h" #include "oops/runs/HofX4D.h" #include "oops/runs/LocalEnsembleDA.h" #include "oops/runs/Run.h" @@ -59,6 +60,9 @@ int runApp(int argc, char** argv, const std::string traits, const std::string ap apps["convertstate"] = []() { return std::make_unique>(); }; + apps["ensmean"] = []() { + return std::make_unique>(); + }; apps["hofx4d"] = []() { return std::make_unique>(); }; From 352b372c11e563dc80c61ead4255a29aa6ab8975 Mon Sep 17 00:00:00 2001 From: Mindo Choi <141867620+apchoiCMD@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:47:38 -0400 Subject: [PATCH 09/13] Add ABI sea-ice product to ioda converter (#1280) #### Description - Task for adding a new ioda converter for new `ABI` type sea-ice concentration - For sea-ice obs, AMSR2, MIRS, JPSSRR and ABI products will be used - For the part of conversion of metadata, the reference is [here](https://www.goes-r.gov/products/docs/PUG-L2+-vol5.pdf) Close #1182 --------- Co-authored-by: Guillaume Vernieres --- utils/obsproc/IcecAbi2Ioda.h | 177 +++++ .../applications/gdas_obsprovider2ioda.h | 4 + utils/obsproc/util.h | 65 ++ utils/test/CMakeLists.txt | 9 + utils/test/prepdata.sh | 14 + utils/test/testdata/icec_abi_g16_1.cdl | 664 ++++++++++++++++++ utils/test/testdata/icec_abi_g16_2.cdl | 653 +++++++++++++++++ utils/test/testinput/gdas_icecabi2ioda.yaml | 13 + utils/test/testref/icecabi2ioda.test | 26 + 9 files changed, 1625 insertions(+) create mode 100644 utils/obsproc/IcecAbi2Ioda.h create mode 100644 utils/test/testdata/icec_abi_g16_1.cdl create mode 100644 utils/test/testdata/icec_abi_g16_2.cdl create mode 100644 utils/test/testinput/gdas_icecabi2ioda.yaml create mode 100644 utils/test/testref/icecabi2ioda.test diff --git a/utils/obsproc/IcecAbi2Ioda.h b/utils/obsproc/IcecAbi2Ioda.h new file mode 100644 index 000000000..54515d50f --- /dev/null +++ b/utils/obsproc/IcecAbi2Ioda.h @@ -0,0 +1,177 @@ +#pragma once + +#include +#include +#include +#include +#include // NOLINT (using C API) +#include +#include + +#include "eckit/config/LocalConfiguration.h" + +#include // NOLINT + +#include "ioda/../../../../core/IodaUtils.h" // TODO(All): Use a better way in all converters +#include "ioda/Group.h" +#include "ioda/ObsGroup.h" + +#include "oops/util/dateFunctions.h" + +#include "NetCDFToIodaConverter.h" + +namespace gdasapp { + + class IcecAbi2Ioda : public NetCDFToIodaConverter { + public: + explicit IcecAbi2Ioda(const eckit::Configuration & fullConfig, const eckit::mpi::Comm & comm) + : NetCDFToIodaConverter(fullConfig, comm) { + variable_ = "seaIceFraction"; + } + + // Read netcdf file and populate iodaVars + gdasapp::obsproc::iodavars::IodaVars providerToIodaVars(const std::string fileName) final { + oops::Log::info() << "Processing files provided by the ABI" << std::endl; + + // Open the NetCDF file in read-only mode + netCDF::NcFile ncFile(fileName, netCDF::NcFile::read); + oops::Log::info() << "Reading... " << fileName << std::endl; + + // Get the number of obs in the file + int dimxSize = ncFile.getDim("x").getSize(); + int dimySize = ncFile.getDim("y").getSize(); + int nobs = dimxSize * dimySize; + + // Set the int metadata names + std::vector intMetadataNames = {"oceanBasin"}; + + // Set the float metadata name + std::vector floatMetadataNames = {}; + + // Create instance of iodaVars object + gdasapp::obsproc::iodavars::IodaVars iodaVars(nobs, floatMetadataNames, intMetadataNames); + + oops::Log::debug() << "--- iodaVars.location_: " << iodaVars.location_ << std::endl; + + // Read in GOES ABI fixed grid projection variables and constants + std::vector y_coordinate_1d(dimySize); + ncFile.getVar("y").getVar(y_coordinate_1d.data()); + float yOffSet; + ncFile.getVar("y").getAtt("add_offset").getValues(&yOffSet); + float yScaleFactor; + ncFile.getVar("y").getAtt("scale_factor").getValues(&yScaleFactor); + // Apply the scale factor and add offset to the raw data + for (auto& yval : y_coordinate_1d) { + yval = yval * yScaleFactor + yOffSet; // N-S elevation angle in radians + } + + std::vector x_coordinate_1d(dimxSize); + ncFile.getVar("x").getVar(x_coordinate_1d.data()); + float xOffSet; + ncFile.getVar("x").getAtt("add_offset").getValues(&xOffSet); + float xScaleFactor; + ncFile.getVar("x").getAtt("scale_factor").getValues(&xScaleFactor); + // Apply the scale factor and add offset to the raw data + for (auto& xval : x_coordinate_1d) { + xval = xval * xScaleFactor + xOffSet; // E-W scanning angle in radians + } + + // Create 2D arrays (meshgrid equivalent) + std::vector> x_coordinate_2d(dimySize, std::vector(dimxSize)); + std::vector> y_coordinate_2d(dimySize, std::vector(dimxSize)); + std::vector> abi_lon; + std::vector> abi_lat; + + // Create 2D coordinate matrices from 1D coordinate vectors + for (int i = 0; i < dimySize; ++i) { + for (int j = 0; j < dimxSize; ++j) { + x_coordinate_2d[i][j] = x_coordinate_1d[j]; + y_coordinate_2d[i][j] = y_coordinate_1d[i]; + } + } + + // Retrieve the attributes + double lon_origin; + ncFile.getVar("goes_imager_projection").getAtt("longitude_of_projection_origin") + .getValues(&lon_origin); + double perspective_point_height; + ncFile.getVar("goes_imager_projection").getAtt("perspective_point_height") + .getValues(&perspective_point_height); + double r_eq; + ncFile.getVar("goes_imager_projection").getAtt("semi_major_axis").getValues(&r_eq); + double r_pol; + ncFile.getVar("goes_imager_projection").getAtt("semi_minor_axis").getValues(&r_pol); + + // Calculate H = Satellite height from center of earth(m) + double H = perspective_point_height + r_eq; + + // Calculate Latitude and Longitude from GOES Imager Projection + // for details of calculations in util.h + gdasapp::obsproc::utils::abiToGeoLoc( + x_coordinate_2d, + y_coordinate_2d, + lon_origin, + H, + r_eq, + r_pol, + abi_lat, + abi_lon); + + // Store real number of lat and lon into eigen arrays + int loc(0); + for (int i = 0; i < dimySize; i++) { + for (int j = 0; j < dimxSize; j++) { + iodaVars.longitude_(loc) = std::real(abi_lon[i][j]); + iodaVars.latitude_(loc) = std::real(abi_lat[i][j]); + loc += 1; + } + } + + // Read Quality Flags as a preQc + std::vector fullQcFlagsVar(iodaVars.location_); + ncFile.getVar("DQF").getVar(fullQcFlagsVar.data()); + + // Get Ice_Concentration obs values + std::vector IcecObsVal(iodaVars.location_); + ncFile.getVar("IceConc").getVar(IcecObsVal.data()); + float IcecOffSet; + ncFile.getVar("IceConc").getAtt("add_offset").getValues(&IcecOffSet); + float IcecScaleFactor; + ncFile.getVar("IceConc").getAtt("scale_factor").getValues(&IcecScaleFactor); + + // TODO(All): Think how we will be acle to use Temp later + // Get Ice_Temp obs values + std::vector IcecTempObsVal(iodaVars.location_); + ncFile.getVar("Temp").getVar(IcecTempObsVal.data()); // Kelvin + float IcecTempOffSet; + ncFile.getVar("Temp").getAtt("add_offset").getValues(&IcecTempOffSet); + float IcecTempScaleFactor; + ncFile.getVar("Temp").getAtt("scale_factor").getValues(&IcecTempScaleFactor); + + // Read the dateTime + double TimeVal; + ncFile.getVar("t").getVar(&TimeVal); + + iodaVars.referenceDate_ = "seconds since 2000-01-01T12:00:00Z"; // 12Z + + // Update Eigen arrays + for (int i = 0; i < iodaVars.location_; i++) { + iodaVars.obsVal_(i) + = static_cast((IcecObsVal[i] * IcecScaleFactor + IcecOffSet)*0.01); + iodaVars.obsError_(i) = 0.1; // Do something for obs error + iodaVars.preQc_(i) = fullQcFlagsVar[i]; + // Store optional metadata, set ocean basins to -999 for now + iodaVars.intMetadata_.row(i) << -999; + iodaVars.datetime_(i) = TimeVal; + } + + // basic test for iodaVars.trim + Eigen::Array mask = + ((iodaVars.obsVal_ >= 0.0 && iodaVars.obsVal_ <= 1.0) && + (iodaVars.latitude_ <= -40.0 || iodaVars.latitude_ >= 40.0)); + iodaVars.trim(mask); + + return iodaVars; + }; + }; // class IcecAbi2Ioda +} // namespace gdasapp diff --git a/utils/obsproc/applications/gdas_obsprovider2ioda.h b/utils/obsproc/applications/gdas_obsprovider2ioda.h index a1a6fe6e3..fd924e4c6 100644 --- a/utils/obsproc/applications/gdas_obsprovider2ioda.h +++ b/utils/obsproc/applications/gdas_obsprovider2ioda.h @@ -7,6 +7,7 @@ #include "oops/runs/Application.h" #include "../Ghrsst2Ioda.h" +#include "../IcecAbi2Ioda.h" #include "../IcecAmsr2Ioda.h" #include "../IcecJpssrr2Ioda.h" #include "../IcecMirs2Ioda.h" @@ -49,6 +50,9 @@ namespace gdasapp { } else if (provider == "SMOS") { Smos2Ioda conv2ioda(fullConfig, this->getComm()); conv2ioda.writeToIoda(); + } else if (provider == "ABI") { + IcecAbi2Ioda conv2ioda(fullConfig, this->getComm()); + conv2ioda.writeToIoda(); } else if (provider == "AMSR2") { IcecAmsr2Ioda conv2ioda(fullConfig, this->getComm()); conv2ioda.writeToIoda(); diff --git a/utils/obsproc/util.h b/utils/obsproc/util.h index 7b2421dbb..c699f7f43 100644 --- a/utils/obsproc/util.h +++ b/utils/obsproc/util.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include // NOLINT (using C API) #include @@ -254,5 +255,69 @@ namespace gdasapp { } }; } // namespace iodavars + + // TODO(Mindo): To move below as a private method to the iceabi2ioda class + namespace utils { + + // Calculate latitude and longitude from GOES ABI fixed grid projection data + // GOES ABI fixed grid projection is a map projection relative to the GOES satellite + // Units: latitude in °N (°S < 0), longitude in °E (°W < 0) + // See GOES-R Product User Guide (PUG) Volume 5 (L2 products) Section 4.2.8 (p58) + void abiToGeoLoc( + const std::vector>& x_coordinate_2d, + const std::vector>& y_coordinate_2d, + double lon_origin, + double H, + double r_eq, + double r_pol, + std::vector>& abi_lat, + std::vector>& abi_lon + ) { + int sizeX = x_coordinate_2d[0].size(); + int sizeY = x_coordinate_2d.size(); + + double lambda_0 = (lon_origin * M_PI) / 180.0; + + abi_lat.resize(sizeY, std::vector(sizeX)); + abi_lon.resize(sizeY, std::vector(sizeX)); + + for (int i = 0; i < sizeY; ++i) { + for (int j = 0; j < sizeX; ++j) { + double x = x_coordinate_2d[i][j]; + double y = y_coordinate_2d[i][j]; + + // Cache sin(x), cos(x), sin(y), and cos(y) + double sin_x = std::sin(x); + double cos_x = std::cos(x); + double sin_y = std::sin(y); + double cos_y = std::cos(y); + + double a_var = std::pow(sin_x, 2.0) + + std::pow(cos_x, 2.0) * (std::pow(cos_y, 2.0) + + ((r_eq * r_eq) / (r_pol * r_pol)) * std::pow(sin_y, 2.0)); + double b_var = -2.0 * H * cos_x * cos_y; + double c_var = (H * H) - (r_eq * r_eq); + double discriminant = (b_var * b_var) - (4.0 * a_var * c_var); + + // Check if discriminant is strictly positive + if (discriminant > 0) { + double r_s = (-b_var - std::sqrt(discriminant)) / (2.0 * a_var); + double s_x = r_s * cos_x * cos_y; + double s_y = -r_s * sin_x; + double s_z = r_s * cos_x * sin_y; + + abi_lat[i][j] = (180.0 / M_PI) * (std::atan(((r_eq * r_eq) / (r_pol * r_pol)) + * (s_z / std::sqrt(((H - s_x) * (H - s_x)) + (s_y * s_y))))); + abi_lon[i][j] = (lambda_0 - std::atan(s_y / (H - s_x))) * (180.0 / M_PI); + } else { + // Handle invalid values + // Set latitude and longitude to NaN if discriminant <= 0) + abi_lat[i][j] = std::numeric_limits::quiet_NaN(); + abi_lon[i][j] = std::numeric_limits::quiet_NaN(); + } + } + } + } // void + } // namespace utils } // namespace obsproc }; // namespace gdasapp diff --git a/utils/test/CMakeLists.txt b/utils/test/CMakeLists.txt index 3be6cd1c4..00adbad26 100644 --- a/utils/test/CMakeLists.txt +++ b/utils/test/CMakeLists.txt @@ -7,6 +7,7 @@ list( APPEND utils_test_input testinput/gdas_rtofssal.yaml testinput/gdas_smap2ioda.yaml testinput/gdas_smos2ioda.yaml + testinput/gdas_icecabi2ioda.yaml testinput/gdas_icecamsr2ioda.yaml testinput/gdas_icecmirs2ioda.yaml testinput/gdas_icecjpssrr2ioda.yaml @@ -20,6 +21,7 @@ set( gdas_utils_test_ref testref/rads2ioda.test testref/smap2ioda.test testref/smos2ioda.test + testref/icecabi2ioda.test testref/icecamsr2ioda.test testref/icecmirs2ioda.test testref/icecjpssrr2ioda.test @@ -143,6 +145,13 @@ ecbuild_add_test( TARGET test_gdasapp_util_viirsaod2ioda LIBS gdas-utils WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/obsproc) +# Test the ABI to IODA converter +ecbuild_add_test( TARGET test_gdasapp_util_icecabi2ioda + COMMAND ${CMAKE_BINARY_DIR}/bin/gdas_obsprovider2ioda.x + ARGS "../testinput/gdas_icecabi2ioda.yaml" + LIBS gdas-utils + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/obsproc) + # Test the AMSR2 to IODA converter ecbuild_add_test( TARGET test_gdasapp_util_icecamsr2ioda COMMAND ${CMAKE_BINARY_DIR}/bin/gdas_obsprovider2ioda.x diff --git a/utils/test/prepdata.sh b/utils/test/prepdata.sh index 4cb5b31a9..7ce39ce71 100755 --- a/utils/test/prepdata.sh +++ b/utils/test/prepdata.sh @@ -2,6 +2,18 @@ # called for test_gdasapp_util_prepdata, and by # test/soca/gw/setup_obsproc.sh for test_gdasapp_soca_setup_obsproc +# TODO: It needs to point to experimental obs instead of prepdata.sh +# Get the machine hostname +MACHINE_NAME=$(hostname) + +# Check if the machine name is "hera" +if [[ "$MACHINE_NAME" =~ ^hfe0[1-9]$ || "$MACHINE_NAME" =~ ^hfe1[01]$ ]]; then + echo "Running on hera, loading anaconda modules." + module use -a /contrib/anaconda/modulefiles + module load anaconda/latest +else + echo "Not running on hera, skipping anaconda module loading." +fi set -e @@ -19,6 +31,8 @@ project_source_dir=$1 cdl2nc4 rads_adt_3a_2021181.nc4 ${project_source_dir}/testdata/rads_adt_3a_2021181.cdl cdl2nc4 rads_adt_3b_2021181.nc4 ${project_source_dir}/testdata/rads_adt_3b_2021181.cdl +cdl2nc4 icec_abi_g16_1.nc4 ${project_source_dir}/testdata/icec_abi_g16_1.cdl +cdl2nc4 icec_abi_g16_2.nc4 ${project_source_dir}/testdata/icec_abi_g16_2.cdl cdl2nc4 icec_amsr2_north_1.nc4 ${project_source_dir}/testdata/icec_amsr2_north_1.cdl cdl2nc4 icec_amsr2_north_2.nc4 ${project_source_dir}/testdata/icec_amsr2_north_2.cdl cdl2nc4 icec_amsr2_south_1.nc4 ${project_source_dir}/testdata/icec_amsr2_south_1.cdl diff --git a/utils/test/testdata/icec_abi_g16_1.cdl b/utils/test/testdata/icec_abi_g16_1.cdl new file mode 100644 index 000000000..1270f5365 --- /dev/null +++ b/utils/test/testdata/icec_abi_g16_1.cdl @@ -0,0 +1,664 @@ +netcdf icec_abi_g16_1 { +dimensions: + y = 21 ; + x = 21 ; + number_of_LZA_bounds = 2 ; + number_of_SZA_bounds = 2 ; + number_of_time_bounds = 2 ; + number_of_image_bounds = 2 ; +variables: + ushort DQF(y, x) ; + DQF:_FillValue = 65535US ; + DQF:long_name = "ABI L2 Cryosphere Ice Concentration Data Quality Flags" ; + DQF:standard_name = "status_flag" ; + DQF:valid_range = 0US, 3US ; + DQF:units = "1" ; + DQF:coordinates = "retrieval_local_zenith_angle quantitative_local_zenith_angle retrieval_solar_zenith_angle quantitative_solar_zenith_angle t y x" ; + DQF:grid_mapping = "goes_imager_projection" ; + DQF:cell_methods = "retrieval_local_zenith_angle: point quantitative_local_zenith_angle: point retrieval_solar_zenith_angle: point quantitative_solar_zenith_angle: t: point area: point" ; + DQF:flag_values = 0US, 1US, 2US, 3US ; + DQF:flag_meanings = "normal nonretrievable uncertain bad_data" ; + DQF:number_of_qf_values = 4US ; + DQF:potentially_geo_pixel_count_used_as_percent_denominator = 23046372 ; + ushort IceConc(y, x) ; + IceConc:_FillValue = 65535US ; + IceConc:long_name = "ABI L2 Cryosphere Ice Concentration" ; + IceConc:standard_name = "ice_concentration" ; + IceConc:valid_range = 0US, 65530US ; + IceConc:scale_factor = 0.00152602f ; + IceConc:add_offset = 0.f ; + IceConc:units = "percent" ; + IceConc:resolution = "y: 0.000056 rad x: 0.000056 rad" ; + IceConc:coordinates = "retrieval_local_zenith_angle quantitative_local_zenith_angle retrieval_solar_zenith_angle quantitative_solar_zenith_angle t y x" ; + IceConc:grid_mapping = "goes_imager_projection" ; + IceConc:cell_methods = "retrieval_local_zenith_angle: point (good or degraded quality pixel produced) quantitative_local_zenith_angle: point (good quality pixel produced) retrieval_solar_zenith_angle: point (good or degraded quality pixel produced) quantitative_solar_zenith_angle: point (good quality pixel produced) t: point area: point" ; + IceConc:ancillary_variables = "DQF" ; + byte Mask(y, x) ; + Mask:_FillValue = -99b ; + Mask:long_name = "ABI L2 Cryosphere Ice Mask" ; + Mask:standard_name = "ice_mask" ; + Mask:valid_range = -128b, 127b ; + Mask:units = "1" ; + Mask:resolution = "y: 0.000056 rad x: 0.000056 rad" ; + Mask:coordinates = "retrieval_local_zenith_angle quantitative_local_zenith_angle retrieval_solar_zenith_angle t y x" ; + Mask:grid_mapping = "goes_imager_projection" ; + Mask:cell_methods = "retrieval_local_zenith_angle: point (good or degraded quality pixel produced) quantitative_local_zenith_angle: point (good quality pixel produced) retrieval_solar_zenith_angle: point (good quality pixel produced) t: point area: point" ; + Mask:flag_values = -3b, -2b, -1b, 0b, 1b, 2b ; + Mask:flag_meanings = "non_retrieval water land cloud day_ice night_ice" ; + Mask:ancillary_variables = "DQF" ; + Mask:clear_pixel_definition = "no cloud detected and failed a test for high values of spatial heterogeneity" ; + Mask:probably_clear_pixel_definition = "no cloud detected but passed a test for high values of spatial heterogeneity and one or more neighboring pixels identified as cloudy. pixel is possibly cloud-contaminated" ; + Mask:probably_cloudy_pixel_definition = "cloud detected but likely contains a cloud edge, since one or more neighboring pixels are clear. pixel is probably cloud-contaminated" ; + Mask:cloudy_pixel_definition = "cloud detected and failed a test for cloud edges" ; + uint PQI(y, x) ; + PQI:_FillValue = 0U ; + PQI:long_name = "ABI L2 Cryosphere Ice Concentration product quality indicator" ; + PQI:units = "1" ; + PQI:grid_mapping = "goes_imager_projection" ; + PQI:coordinates = "y x" ; + PQI:flag_meanings = "normal nonretrievable uncertain bad_data cloud_mask_clear cloud_mask_probably_clear cloud_mask_probably_cloudy cloud_mask_cloudy day_night_qf sunglint_qf cloud_shadow_qf off_earth_qf solar_zenith_angle_qf satellite_zenith_angle_qf reflectance_band_2_qf reflectance_band_3_qf reflectance_band_5_qf brightness_temp_band_14_qf brightness_temp_band_15_qf Unused_Bit_15 surface_in-land_water surface_land surface_sea_water surface_other reflectance_test_ice_cover_detection_qf NDSI_test_ice_cover_detection_qf skin_temp_test_ice_cover_detection_qf visable_band_tie-pont_qf Unused_Bit_23 read_input_qf Unused_Bit_25 Unused_Bit_26 Unused_Bit_27 Unused_Bit_28 Unused_Bit_29 Unused_Bit_30 Unused_Bit_31" ; + PQI:number_of_qf_values = 37U ; + ushort Temp(y, x) ; + Temp:_FillValue = 65535US ; + Temp:long_name = "ABI L2 Cryosphere Ice Surface Temperature" ; + Temp:standard_name = "ice_temperature" ; + Temp:valid_range = 0US, 65530US ; + Temp:scale_factor = 0.00267053f ; + Temp:add_offset = 100.f ; + Temp:units = "kelvin" ; + Temp:resolution = "y: 0.000056 rad x: 0.000056 rad" ; + Temp:coordinates = "retrieval_local_zenith_angle quantitative_local_zenith_angle retrieval_solar_zenith_angle quantitative_solar_zenith_angle t y x" ; + Temp:grid_mapping = "goes_imager_projection" ; + Temp:cell_methods = "retrieval_local_zenith_angle: point (good or degraded quality pixel produced) quantitative_local_zenith_angle: point (good quality pixel produced) retrieval_solar_zenith_angle: point (good or degraded quality pixel produced) quantitative_solar_zenith_angle: point (good quality pixel produced) t: point area: point" ; + Temp:ancillary_variables = "DQF" ; + int algorithm_disabled_due_to_mitigation ; + algorithm_disabled_due_to_mitigation:long_name = "Status flag indicating if the algorithm was disabled due to upstream degradation" ; + algorithm_disabled_due_to_mitigation:_FillValue = -1 ; + algorithm_disabled_due_to_mitigation:flag_value = 0, 1 ; + algorithm_disabled_due_to_mitigation:flag_meanings = "unset set" ; + algorithm_disabled_due_to_mitigation:valid_range = 0, 1 ; + algorithm_disabled_due_to_mitigation:units = "1" ; + int algorithm_dynamic_input_data_container ; + algorithm_dynamic_input_data_container:long_name = "container for filenames of dynamic algorithm input data" ; + algorithm_dynamic_input_data_container:input_ABI_L2_auxiliary_solar_zenith_angle_data = "OR_I_ABI-L2-AUXF-M6_G16_s20241691800214_e20241691809522_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_auxiliary_local_zenith_angle_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_auxiliary_land_mask_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_auxiliary_lat_lon_position_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_reflectance_band_1_2km_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_reflectance_band_2_2km_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_reflectance_band_3_2km_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_reflectance_band_5_2km_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_brightness_temperature_band_14_2km_data = "OR_ABI-L2-CMIPF-M6C14_G16_s2024-06-17T18:00:21.4Z_e2024-06-17T18:09:52.2Z_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_brightness_temperature_band_15_2km_data = "OR_ABI-L2-CMIPF-M6C15_G16_s2024-06-17T18:00:21.4Z_e2024-06-17T18:09:52.2Z_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_cloud_mask_data_information_flag_data = "OR_I_ABI-L2-ACMDIFF-M6_G16_s20241691800214_e20241691809522_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_4_level_cloud_mask_data = "OR_ABI-L2-ACMF-M6_G16_s20241691800214_e20241691809522_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_cloud_mask_granule_level_quality_flag_data = "OR_ABI-L2-ACMF-M6_G16_s20241691800214_e20241691809522_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_cloud_top_cloud_shadow_flag_data = "OR_I_ABI-L2-ACHF-M6_G16_s20241691800214_e20241691809522_c*.nc" ; + int algorithm_product_version_container ; + algorithm_product_version_container:long_name = "container for algorithm package filename and product version" ; + algorithm_product_version_container:algorithm_version = "OR_ABI-L2-ALG-AICE_v02r00.zip" ; + algorithm_product_version_container:product_version = "v02r00" ; + float geospatial_lat_lon_extent ; + geospatial_lat_lon_extent:long_name = "geospatial latitude and longitude references" ; + geospatial_lat_lon_extent:geospatial_westbound_longitude = -156.2995f ; + geospatial_lat_lon_extent:geospatial_northbound_latitude = 81.3282f ; + geospatial_lat_lon_extent:geospatial_eastbound_longitude = 6.2995f ; + geospatial_lat_lon_extent:geospatial_southbound_latitude = -81.3282f ; + geospatial_lat_lon_extent:geospatial_lat_center = 0.f ; + geospatial_lat_lon_extent:geospatial_lon_center = -75.f ; + geospatial_lat_lon_extent:geospatial_lat_nadir = 0.f ; + geospatial_lat_lon_extent:geospatial_lon_nadir = -75.f ; + geospatial_lat_lon_extent:geospatial_lat_units = "degrees_north" ; + geospatial_lat_lon_extent:geospatial_lon_units = "degrees_east" ; + int goes_imager_projection ; + goes_imager_projection:long_name = "GOES-R ABI fixed grid projection" ; + goes_imager_projection:grid_mapping_name = "geostationary" ; + goes_imager_projection:perspective_point_height = 35786023. ; + goes_imager_projection:semi_major_axis = 6378137. ; + goes_imager_projection:semi_minor_axis = 6356752.31414 ; + goes_imager_projection:inverse_flattening = 298.2572221 ; + goes_imager_projection:latitude_of_projection_origin = 0. ; + goes_imager_projection:longitude_of_projection_origin = -75. ; + goes_imager_projection:sweep_angle_axis = "x" ; + int64 granule_level_quality_flag ; + granule_level_quality_flag:long_name = "Cloud Mask Granule Level Degradation Quality Flag" ; + granule_level_quality_flag:flag_masks = 0LL, 1LL, 63LL ; + granule_level_quality_flag:flag_meanings = "valid_channels channel_missing algorithm_failure" ; + granule_level_quality_flag:_FillValue = -999LL ; + granule_level_quality_flag:valid_range = 0LL, 63LL ; + granule_level_quality_flag:units = "1" ; + float maximum_ice_retrieval ; + maximum_ice_retrieval:long_name = "maximum ice concentration retrieval" ; + maximum_ice_retrieval:standard_name = "ice_concentration_retrieval" ; + maximum_ice_retrieval:_FillValue = -999.f ; + maximum_ice_retrieval:valid_range = 0.f, 20000.f ; + maximum_ice_retrieval:units = "m" ; + maximum_ice_retrieval:coordinates = "local_zenith_angle solar_zenith_angle t y_image x_image" ; + maximum_ice_retrieval:grid_mapping = "goes_imager_projection" ; + maximum_ice_retrieval:cell_methods = "local_zenith_angle: sum solar_zenith_angle: sum t: sum area: maximum (interval: variable[@name=\'x\']/values rad comment: good quality pixels only) where ice retrieval" ; + float mean_ice_retrieval ; + mean_ice_retrieval:long_name = "mean ice concentration retrieval" ; + mean_ice_retrieval:standard_name = "ice_concentration_retrieval" ; + mean_ice_retrieval:_FillValue = -999.f ; + mean_ice_retrieval:valid_range = 0.f, 20000.f ; + mean_ice_retrieval:units = "m" ; + mean_ice_retrieval:coordinates = "local_zenith_angle solar_zenith_angle t y_image x_image" ; + mean_ice_retrieval:grid_mapping = "goes_imager_projection" ; + mean_ice_retrieval:cell_methods = "local_zenith_angle: sum solar_zenith_angle: sum t: sum area: mean (interval: variable[@name=\'x\']/values rad comment: good quality pixels only) where ice retrieval" ; + float minimum_ice_retrieval ; + minimum_ice_retrieval:long_name = "minimum ice concentration retrieval" ; + minimum_ice_retrieval:standard_name = "ice_concentration_retrieval" ; + minimum_ice_retrieval:_FillValue = -999.f ; + minimum_ice_retrieval:valid_range = 0.f, 20000.f ; + minimum_ice_retrieval:units = "m" ; + minimum_ice_retrieval:coordinates = "local_zenith_angle solar_zenith_angle t y_image x_image" ; + minimum_ice_retrieval:grid_mapping = "goes_imager_projection" ; + minimum_ice_retrieval:cell_methods = "local_zenith_angle: sum solar_zenith_angle: sum t: sum area: minimum (interval: variable[@name=\'x\']/values rad comment: good quality pixels only) where ice retrieval" ; + float nominal_satellite_height ; + nominal_satellite_height:long_name = "nominal satellite height above GRS 80 ellipsoid (platform altitude)" ; + nominal_satellite_height:standard_name = "height_above_reference_ellipsoid" ; + nominal_satellite_height:_FillValue = -999.f ; + nominal_satellite_height:units = "km" ; + float nominal_satellite_subpoint_lat ; + nominal_satellite_subpoint_lat:long_name = "nominal satellite subpoint latitude (platform latitude)" ; + nominal_satellite_subpoint_lat:standard_name = "latitude" ; + nominal_satellite_subpoint_lat:_FillValue = -999.f ; + nominal_satellite_subpoint_lat:units = "degrees_north" ; + float nominal_satellite_subpoint_lon ; + nominal_satellite_subpoint_lon:long_name = "nominal satellite subpoint longitude (platform longitude)" ; + nominal_satellite_subpoint_lon:standard_name = "longitude" ; + nominal_satellite_subpoint_lon:_FillValue = -999.f ; + nominal_satellite_subpoint_lon:units = "degrees_east" ; + int number_of_bad_data_pixels ; + number_of_bad_data_pixels:long_name = "number of bad data pixels that do not exceed local zenith angle threshold" ; + number_of_bad_data_pixels:_FillValue = -1 ; + number_of_bad_data_pixels:units = "count" ; + number_of_bad_data_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_bad_data_pixels:grid_mapping = "goes_imager_projection" ; + number_of_bad_data_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where bad data" ; + int number_of_day_pixels ; + number_of_day_pixels:long_name = "number of day pixels that do not exceed local zenith angle threshold" ; + number_of_day_pixels:_FillValue = -1 ; + number_of_day_pixels:units = "count" ; + number_of_day_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_day_pixels:grid_mapping = "goes_imager_projection" ; + number_of_day_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where day" ; + int number_of_ice_retrievals ; + number_of_ice_retrievals:long_name = "number of valid ice cover and retrieval pixels that do not exceed local zenith angle threshold" ; + number_of_ice_retrievals:_FillValue = -1 ; + number_of_ice_retrievals:units = "count" ; + number_of_ice_retrievals:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_ice_retrievals:grid_mapping = "goes_imager_projection" ; + number_of_ice_retrievals:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where valid ice cover and retrieval" ; + int number_of_night_pixels ; + number_of_night_pixels:long_name = "number of night pixels that do not exceed local zenith angle threshold" ; + number_of_night_pixels:_FillValue = -1 ; + number_of_night_pixels:units = "count" ; + number_of_night_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_night_pixels:grid_mapping = "goes_imager_projection" ; + number_of_night_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where night" ; + int number_of_nonretrievable_pixels ; + number_of_nonretrievable_pixels:long_name = "number of nonretrievable pixels that do not exceed local zenith angle threshold" ; + number_of_nonretrievable_pixels:_FillValue = -1 ; + number_of_nonretrievable_pixels:units = "count" ; + number_of_nonretrievable_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_nonretrievable_pixels:grid_mapping = "goes_imager_projection" ; + number_of_nonretrievable_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where nonretrievable" ; + int number_of_normal_pixels ; + number_of_normal_pixels:long_name = "number of normal pixels that do not exceed local zenith angle threshold" ; + number_of_normal_pixels:_FillValue = -1 ; + number_of_normal_pixels:units = "count" ; + number_of_normal_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_normal_pixels:grid_mapping = "goes_imager_projection" ; + number_of_normal_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where normal" ; + int number_of_terminator_pixels ; + number_of_terminator_pixels:long_name = "number of terminator pixels that do not exceed local zenith angle threshold" ; + number_of_terminator_pixels:_FillValue = -1 ; + number_of_terminator_pixels:units = "count" ; + number_of_terminator_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_terminator_pixels:grid_mapping = "goes_imager_projection" ; + number_of_terminator_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where terminator" ; + int number_of_uncertain_pixels ; + number_of_uncertain_pixels:long_name = "number of uncertain pixels that do not exceed local zenith angle threshold" ; + number_of_uncertain_pixels:_FillValue = -1 ; + number_of_uncertain_pixels:units = "count" ; + number_of_uncertain_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_uncertain_pixels:grid_mapping = "goes_imager_projection" ; + number_of_uncertain_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where uncertain" ; + int number_of_water_pixels ; + number_of_water_pixels:long_name = "number of water pixels that do not exceed local zenith angle threshold" ; + number_of_water_pixels:_FillValue = -1 ; + number_of_water_pixels:units = "count" ; + number_of_water_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_water_pixels:grid_mapping = "goes_imager_projection" ; + number_of_water_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where water" ; + float percent_ice_retrieval_pixels ; + percent_ice_retrieval_pixels:long_name = "percent of ice retrieval pixels that do not exceed local zenith angle threshold" ; + percent_ice_retrieval_pixels:standard_name = "clear_sky_area_fraction" ; + percent_ice_retrieval_pixels:_FillValue = -999.f ; + percent_ice_retrieval_pixels:valid_range = 0.f, 1.f ; + percent_ice_retrieval_pixels:units = "percent" ; + percent_ice_retrieval_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + percent_ice_retrieval_pixels:grid_mapping = "goes_imager_projection" ; + percent_ice_retrieval_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where ice retrieval" ; + float percent_terminator_pixels ; + percent_terminator_pixels:long_name = "percent of terminator pixels that do not exceed local zenith angle threshold" ; + percent_terminator_pixels:standard_name = "clear_sky_area_fraction" ; + percent_terminator_pixels:_FillValue = -999.f ; + percent_terminator_pixels:valid_range = 0.f, 1.f ; + percent_terminator_pixels:units = "percent" ; + percent_terminator_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + percent_terminator_pixels:grid_mapping = "goes_imager_projection" ; + percent_terminator_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where terminator" ; + float percent_uncorrectable_GRB_errors ; + percent_uncorrectable_GRB_errors:long_name = "percent data lost due to uncorrectable GRB errors" ; + percent_uncorrectable_GRB_errors:_FillValue = -999.f ; + percent_uncorrectable_GRB_errors:valid_range = 0.f, 1.f ; + percent_uncorrectable_GRB_errors:units = "percent" ; + percent_uncorrectable_GRB_errors:coordinates = "t y_image x_image" ; + percent_uncorrectable_GRB_errors:grid_mapping = "goes_imager_projection" ; + percent_uncorrectable_GRB_errors:cell_methods = "t: sum area: sum (uncorrectable GRB errors only)" ; + float percent_uncorrectable_L0_errors ; + percent_uncorrectable_L0_errors:long_name = "percent data lost due to uncorrectable L0 errors" ; + percent_uncorrectable_L0_errors:_FillValue = -999.f ; + percent_uncorrectable_L0_errors:valid_range = 0.f, 1.f ; + percent_uncorrectable_L0_errors:units = "percent" ; + percent_uncorrectable_L0_errors:coordinates = "t y_image x_image" ; + percent_uncorrectable_L0_errors:grid_mapping = "goes_imager_projection" ; + percent_uncorrectable_L0_errors:cell_methods = "t: sum area: sum (uncorrectable L0 errors only)" ; + int processing_parm_version_container ; + processing_parm_version_container:long_name = "container for processing parameter filenames" ; + processing_parm_version_container:L2_processing_parm_version = "OR_ABI-L2-PARM-AICE_v02r00.zip, OR_ANC-L2-PARM-SEMISTATIC_v01r00.zip, OR_ABI-L2-PARM-AUXILIARY_v01r00.zip" ; + float quantitative_local_zenith_angle ; + quantitative_local_zenith_angle:long_name = "threshold angle between the line of sight to the satellite and the local zenith at the observation target for good quality ice concentration and extent data production" ; + quantitative_local_zenith_angle:standard_name = "platform_zenith_angle" ; + quantitative_local_zenith_angle:units = "degree" ; + quantitative_local_zenith_angle:bounds = "quantitative_local_zenith_angle_bounds" ; + float quantitative_local_zenith_angle_bounds(number_of_LZA_bounds) ; + quantitative_local_zenith_angle_bounds:long_name = "local zenith angle degree range where good quality ice concentration and extent data is produced" ; + float quantitative_solar_zenith_angle ; + quantitative_solar_zenith_angle:long_name = "threshold angle between the line of sight to the sun and the local zenith at the observation target for good quality ice concentration and extent data production" ; + quantitative_solar_zenith_angle:standard_name = "solar_zenith_angle" ; + quantitative_solar_zenith_angle:units = "degree" ; + quantitative_solar_zenith_angle:bounds = "quantitative_solar_zenith_angle_bounds" ; + float quantitative_solar_zenith_angle_bounds(number_of_SZA_bounds) ; + quantitative_solar_zenith_angle_bounds:long_name = "solar zenith angle degree range where good quality ice concentration and extent data is produced" ; + float retrieval_local_zenith_angle ; + retrieval_local_zenith_angle:long_name = "threshold angle between the line of sight to the satellite and the local zenith at the observation target for good or degraded quality ice concentration and extent data production" ; + retrieval_local_zenith_angle:standard_name = "platform_zenith_angle" ; + retrieval_local_zenith_angle:units = "degree" ; + retrieval_local_zenith_angle:bounds = "retrieval_local_zenith_angle_bounds" ; + float retrieval_local_zenith_angle_bounds(number_of_LZA_bounds) ; + retrieval_local_zenith_angle_bounds:long_name = "local zenith angle degree range where good quality ice concentration and extent data is produced" ; + float retrieval_solar_zenith_angle ; + retrieval_solar_zenith_angle:long_name = "threshold angle between the line of sight to the sun and the local zenith at the observation target for good or degraded quality ice concentration and extent data production" ; + retrieval_solar_zenith_angle:standard_name = "solar_zenith_angle" ; + retrieval_solar_zenith_angle:units = "degree" ; + retrieval_solar_zenith_angle:bounds = "retrieval_solar_zenith_angle_bounds" ; + float retrieval_solar_zenith_angle_bounds(number_of_SZA_bounds) ; + retrieval_solar_zenith_angle_bounds:long_name = "solar zenith angle degree range where good or degraded quality ice concentration and extent data is produced" ; + int size_searchwindow ; + size_searchwindow:long_name = "size of search window pixels that do not exceed local zenith angle threshold" ; + size_searchwindow:_FillValue = -1 ; + size_searchwindow:units = "count" ; + size_searchwindow:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + size_searchwindow:grid_mapping = "goes_imager_projection" ; + size_searchwindow:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where search window size" ; + float std_dev_ice_retrieval ; + std_dev_ice_retrieval:long_name = "standard deviation of ice concentration retrieval values" ; + std_dev_ice_retrieval:standard_name = "ice_concentration_retrieval" ; + std_dev_ice_retrieval:_FillValue = -999.f ; + std_dev_ice_retrieval:units = "m" ; + std_dev_ice_retrieval:coordinates = "local_zenith_angle solar_zenith_angle t y_image x_image" ; + std_dev_ice_retrieval:grid_mapping = "goes_imager_projection" ; + std_dev_ice_retrieval:cell_methods = "local_zenith_angle: sum solar_zenith_angle: sum t: sum area: standard_deviation (interval: variable[@name=\'x\']/@value rad comment: good quality pixels only) where ice retrieval" ; + double t ; + t:long_name = "J2000 epoch mid-point between the start and end image scan in seconds" ; + t:standard_name = "time" ; + t:units = "seconds since 2000-01-01 12:00:00" ; + t:axis = "T" ; + t:bounds = "time_bounds" ; + double time_bounds(number_of_time_bounds) ; + time_bounds:long_name = "Scan start and end times in seconds since epoch (2000-01-01 12:00:00)" ; + short x(x) ; + x:scale_factor = 5.6e-05f ; + x:add_offset = -0.151844f ; + x:units = "rad" ; + x:axis = "X" ; + x:long_name = "GOES fixed grid projection x-coordinate" ; + x:standard_name = "projection_x_coordinate" ; + float x_image ; + x_image:long_name = "GOES-R fixed grid projection x-coordinate center of image" ; + x_image:standard_name = "projection_x_coordinate" ; + x_image:units = "rad" ; + x_image:axis = "X" ; + float x_image_bounds(number_of_image_bounds) ; + x_image_bounds:long_name = "GOES-R fixed grid projection x-coordinate west/east extent of image" ; + x_image_bounds:units = "rad" ; + short y(y) ; + y:scale_factor = -5.6e-05f ; + y:add_offset = 0.151844f ; + y:units = "rad" ; + y:axis = "Y" ; + y:long_name = "GOES fixed grid projection y-coordinate" ; + y:standard_name = "projection_y_coordinate" ; + float y_image ; + y_image:long_name = "GOES-R fixed grid projection y-coordinate center of image" ; + y_image:standard_name = "projection_y_coordinate" ; + y_image:units = "rad" ; + y_image:axis = "Y" ; + float y_image_bounds(number_of_image_bounds) ; + y_image_bounds:long_name = "GOES-R fixed grid projection y-coordinate north/south extent of image" ; + y_image_bounds:units = "rad" ; + +// global attributes: + :naming_authority = "gov.nesdis.noaa" ; + :Conventions = "CF-1.7" ; + :Metadata_Conventions = "Unidata Dataset Discovery v1.0" ; + :standard_name_vocabulary = "CF Standard Name Table (v35, 20 July 2016)" ; + :institution = "DOC/NOAA/NESDIS > U.S. Department of Commerce, National Oceanic and Atmospheric Administration, National Environmental Satellite, Data, and Information Services" ; + :project = "GOES" ; + :production_site = "NSOF" ; + :production_environment = "OE" ; + :spatial_resolution = "2.0km at nadir" ; + :orbital_slot = "GOES-East" ; + :platform_ID = "G16" ; + :instrument_type = "GOES-R Series Advanced Baseline Imager (ABI)" ; + :scene_id = "Full Disk" ; + :instrument_ID = "FM1" ; + :dataset_name = "OR_ABI-L2-AICEF-M6_G16_s20241691800214_e20241691809522_c20241691814251.nc" ; + :iso_series_metadata_id = "e7ce8b20-b00a-11e1-afa6-0800200c9a66" ; + :title = "ABI L2 Cryosphere Ice Concentration" ; + :summary = "GOES Cryosphere Ice Concentration" ; + :keywords = "CRYOSPHERE > ICE CONCENTRATION AND EXTENT > ICE CONCENTRATION" ; + :keywords_vocabulary = "NASA Global Change Master Directory (GCMD) Earth Science Keywords, Version 7.0.0.0.0" ; + :license = "Unclassified data. Access is restricted to approved users only." ; + :processing_level = "National Aeronautics and Space Administration (NASA) L2" ; + :cdm_data_type = "Image" ; + :date_created = "2024-06-17T18:14:25.1Z" ; + :time_coverage_start = "2024-06-17T18:00:21.4Z" ; + :time_coverage_end = "2024-06-17T18:09:52.2Z" ; + :timeline_id = "ABI Mode 6" ; + :production_data_source = "Realtime" ; + :id = "077a4f5e-de4a-4bff-86f6-8ddd0ff02f61" ; + :history = "Tue Sep 17 20:20:14 2024: ncks -d x,2620,2640 -d y,80,100 OR_ABI-L2-AICEF-M6_G16_s20241691800214_e20241691809522_c20241691814251.nc icec_abi_g16_1.nc" ; + :NCO = "netCDF Operators version 5.0.6 (Homepage = http://nco.sf.net, Code = http://github.com/nco/nco)" ; +data: + + DQF = + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ; + + IceConc = + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, 58144, 57830, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + 65530, 65530, 59683, 57534, 64501, 65530, 65530, 65530, 65530, _, _, 65530, + 65530, 65530, 65530, 64031, 56789, _, _, _, _, + 65530, 65530, 65530, 65530, 65280, 65530, 65530, 65530, 64277, 57892, + 45031, 47109, 61463, 65530, 65530, 65530, 62981, 58667, 57831, 63586, + 65530, + 45147, 43501, 57901, 55554, 57166, 65530, 63760, 56221, 52192, 55591, + 50035, 48650, 48057, 45683, 51947, 57478, 62688, 65530, 65530, 65530, + 65530, + 56977, 56455, 52283, 59212, 54508, 51997, 61822, 59940, 65530, 65530, + 65530, 64347, 65530, 65530, 65530, 65530, 65530, 65530, 65530, 65530, + 65530, + 52793, 50723, 51159, 37244, 63617, 65530, 65530, 65530, 65530, 64308, + 63279, 65530, 65530, 61313, 65530, 65530, 65530, 65530, 65530, 65530, + 63967, + _, _, _, _, 64304, 63829, 60868, 62014, 51838, 52195, 46471, 51122, 59087, + 62312, 65530, 65530, 65530, 65530, 65530, 65530, 58765, + _, _, _, _, _, 50061, 50576, 57647, 53324, 63633, 65530, 65530, 65530, + 65530, 65530, 63681, 63003, 65530, 65530, 65385, 62437, + _, _, _, _, _, _, _, 56932, 54853, 63490, 62990, 63962, 65530, 61397, + 64865, 65530, 65179, 65506, 65530, 65530, 64915, + _, _, _, _, _, _, _, _, 62413, 59618, 58176, 64427, 61133, 65330, 64892, + 65530, 65530, 65530, 65530, 65132, 65530, + _, _, _, _, _, _, _, _, _, _, _, _, _, 63567, 65530, 65530, 65530, 65530, + 65530, 65437, 63195, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ ; + + Mask = + -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, 0, -2, -2, 0, 0, 0, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, -2, -2, 0, 0, 0, 0, 0, + -2, -2, 0, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -3, -1, -1, -1, -1, -1, + -1, -1, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 0, -1, -1, -1, -1, + -1, 0, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 0, 0, 0, -2, 0, 0, -2, + -2, -2, -2, -2, 1, 1, -2, -3, -2, -2, -2, -2, -2, -2, -2, 0, 0, 0, 0, 0, 0, + -2, -2, -2, -2, -2, -2, -2, -2, 0, -2, 0, -2, -2, -2, -2, -2, -2, -2, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, -2, -2, 1, 1, 1, 1, 1, 1, -2, -2, -2, -3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + -2, -2, -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + -2, -2, -2, -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, -2, -2, -2, -2, -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, -2, -2, -2, -2, -2, -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, -2, -2, 0, -2, -2, -2, -2, -2, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, -2, -2, -2, 0, -2, -2, -2, -2, -2, 0, -2, -2, -2, -2, -2, -2, -2, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, 0, -2, -2, -2, 0, -2, -2, -2, -2, -2, -2, + 0, 0, 0, 0, -2, -2, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, -2, -2, -2, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2 ; + + PQI = + 8192162, 8192230, 8192230, 8192230, 8192238, 8192238, 8192238, 8192230, + 8192238, 8192238, 8192238, 6881506, 6881514, 8192230, 6881506, 6881506, + 8192230, 8192230, 8192238, 8192230, 8257774, + 6881514, 8192230, 8192230, 8192230, 8192230, 8192230, 8192238, 8192238, + 8192230, 8192230, 6881514, 6881506, 6881506, 6881506, 6881506, 6881514, + 8192230, 8192238, 8192238, 8192238, 8192238, + 6881514, 6881514, 8192230, 6881506, 6881514, 6881514, 6881514, 6881514, + 6881506, 6881514, 6881514, 6881506, 6881506, 8192162, 8257770, 8257766, + 8257766, 8257774, 8257774, 8257774, 8257774, + 6881514, 6881514, 6881514, 6881506, 6881506, 6881506, 6881506, 6881514, + 6881506, 6881506, 6881514, 6881514, 6881514, 6881514, 8192238, 8257774, + 8257774, 8257774, 8257774, 8257774, 8192238, + 6881514, 6881506, 6881506, 6881506, 6881506, 6881506, 6881506, 6881514, + 6881506, 6881514, 6881506, 6881514, 6881514, 6881514, 8192230, 8192238, + 8192238, 6881514, 8192230, 8192230, 6881514, + 6881506, 6881506, 6881506, 6881506, 4260064, 4260064, 6881506, 8192162, + 6881506, 6881514, 6881506, 6881514, 6881514, 6881514, 6881514, 8192230, + 8192230, 8192230, 8192230, 8192238, 8192230, + 6881506, 6881506, 6881506, 6881514, 6881506, 6881506, 6881514, 6881514, + 8192230, 6881514, 8192230, 6881514, 6881514, 6881506, 6881506, 6881514, + 6881514, 6881514, 8192230, 8192238, 8192238, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 6881506, 6881506, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 6881506, 6881506, 6881506, 8192162, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, + 6881514, 6881514, 6881514, 6881514, 4260073, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, + 6881514, 6881514, 6881514, 6881514, 6881514, 4260073, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, + 8192230, 6881514, 6881514, 6881514, 6881506, 6881506, 6881506, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, + 8192230, 6881514, 6881514, 6881514, 6881514, 6881514, 6881514, 6881506, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, + 8192230, 8192230, 8192230, 8192230, 8192230, 6881514, 6881514, 8192230, + 6881514, 6881514, 6881514, 6881514, 6881514, 4260073, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, + 8192238, 8192238, 6881514, 6881514, 6881514, 8192238, 6881514, 6881514, + 6881514, 6881514, 6881514, 8192230, 6881514, 6881514, 6881514, 6881514, + 6881514, 6881514, 6881514, 6881514, 6881514, + 8192230, 8192230, 8192238, 8192238, 8192238, 8192230, 8192230, 8192238, + 6881514, 6881514, 8192230, 6881514, 6881514, 6881514, 8192230, 6881514, + 6881514, 6881514, 6881514, 6881514, 6881514, + 8192230, 8192230, 8192230, 8192230, 6881514, 6881514, 8192238, 8192238, + 8192238, 8192238, 6881514, 8192238, 8192238, 8192230, 8192230, 8192230, + 6881514, 6881514, 6881514, 6881514, 6881514, + 8192230, 8192230, 8192230, 8192230, 8192230, 8192230, 8192230, 8192230, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 6881514, 6881514, 6881514, 6881514 ; + + Temp = + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, 63221, 63150, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + 63796, 63428, 63226, 63253, 63369, 63295, 63223, 63210, 63150, _, _, 63239, + 63351, 63396, 63266, 63148, 63060, _, _, _, _, + 63709, 63707, 63764, 63707, 63616, 63750, 63766, 63691, 63647, 63648, + 63599, 63572, 63586, 63704, 63677, 63591, 63589, 63605, 63514, 63588, + 63511, + 63284, 63314, 63502, 63548, 63502, 63600, 63618, 63518, 63518, 63546, + 63370, 63223, 63210, 63313, 63383, 63513, 63658, 63804, 63894, 63832, + 63816, + 63430, 63383, 63386, 63460, 63414, 63399, 63578, 63457, 63677, 63674, + 63602, 63620, 63631, 63688, 63761, 63818, 63848, 63832, 63832, 63848, + 63834, + 63430, 63370, 63282, 63105, 63620, 63734, 63691, 63661, 63718, 63647, + 63559, 63647, 63632, 63632, 63761, 63850, 63848, 63864, 63864, 63820, + 63809, + _, _, _, _, 63524, 63629, 63695, 63616, 63502, 63473, 63386, 63462, 63502, + 63652, 63779, 63851, 63836, 63851, 63804, 63821, 63647, + _, _, _, _, _, 63393, 63383, 63457, 63460, 63634, 63779, 63807, 63747, + 63732, 63748, 63706, 63734, 63821, 63821, 63775, 63780, + _, _, _, _, _, _, _, 63466, 63500, 63616, 63645, 63734, 63732, 63616, + 63720, 63763, 63747, 63789, 63850, 63834, 63850, + _, _, _, _, _, _, _, _, 63599, 63530, 63502, 63620, 63570, 63720, 63672, + 63775, 63851, 63850, 63848, 63788, 63820, + _, _, _, _, _, _, _, _, _, _, _, _, _, 63554, 63583, 63640, 63669, 63713, + 63697, 63685, 63624, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ ; + + algorithm_disabled_due_to_mitigation = 0 ; + + algorithm_dynamic_input_data_container = _ ; + + algorithm_product_version_container = _ ; + + geospatial_lat_lon_extent = _ ; + + goes_imager_projection = _ ; + + granule_level_quality_flag = 0 ; + + maximum_ice_retrieval = 100 ; + + mean_ice_retrieval = 90.95 ; + + minimum_ice_retrieval = 0.1708984 ; + + nominal_satellite_height = 35786.02 ; + + nominal_satellite_subpoint_lat = 0 ; + + nominal_satellite_subpoint_lon = -75.2 ; + + number_of_bad_data_pixels = 1132863 ; + + number_of_day_pixels = 6732 ; + + number_of_ice_retrievals = 36882 ; + + number_of_night_pixels = 30150 ; + + number_of_nonretrievable_pixels = 21017 ; + + number_of_normal_pixels = 36882 ; + + number_of_terminator_pixels = 1153880 ; + + number_of_uncertain_pixels = 21855610 ; + + number_of_water_pixels = 4979711 ; + + percent_ice_retrieval_pixels = 0.5086401 ; + + percent_terminator_pixels = 6.229427 ; + + percent_uncorrectable_GRB_errors = 0 ; + + percent_uncorrectable_L0_errors = 0 ; + + processing_parm_version_container = _ ; + + quantitative_local_zenith_angle = 80 ; + + quantitative_local_zenith_angle_bounds = 0, 80 ; + + quantitative_solar_zenith_angle = 85 ; + + quantitative_solar_zenith_angle_bounds = 0, 85 ; + + retrieval_local_zenith_angle = 80 ; + + retrieval_local_zenith_angle_bounds = 0, 80 ; + + retrieval_solar_zenith_angle = 85 ; + + retrieval_solar_zenith_angle_bounds = 0, 85 ; + + size_searchwindow = 50 ; + + std_dev_ice_retrieval = 18.40504 ; + + t = 771919506.820459 ; + + time_bounds = 771919221.423053, 771919792.217865 ; + + x = 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, + 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 2640 ; + + x_image = 0 ; + + x_image_bounds = -0.151872, 0.151872 ; + + y = 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100 ; + + y_image = 0 ; + + y_image_bounds = 0.151872, -0.151872 ; +} diff --git a/utils/test/testdata/icec_abi_g16_2.cdl b/utils/test/testdata/icec_abi_g16_2.cdl new file mode 100644 index 000000000..a1fcac644 --- /dev/null +++ b/utils/test/testdata/icec_abi_g16_2.cdl @@ -0,0 +1,653 @@ +netcdf icec_abi_g16_2 { +dimensions: + y = 21 ; + x = 21 ; + number_of_LZA_bounds = 2 ; + number_of_SZA_bounds = 2 ; + number_of_time_bounds = 2 ; + number_of_image_bounds = 2 ; +variables: + ushort DQF(y, x) ; + DQF:_FillValue = 65535US ; + DQF:long_name = "ABI L2 Cryosphere Ice Concentration Data Quality Flags" ; + DQF:standard_name = "status_flag" ; + DQF:valid_range = 0US, 3US ; + DQF:units = "1" ; + DQF:coordinates = "retrieval_local_zenith_angle quantitative_local_zenith_angle retrieval_solar_zenith_angle quantitative_solar_zenith_angle t y x" ; + DQF:grid_mapping = "goes_imager_projection" ; + DQF:cell_methods = "retrieval_local_zenith_angle: point quantitative_local_zenith_angle: point retrieval_solar_zenith_angle: point quantitative_solar_zenith_angle: t: point area: point" ; + DQF:flag_values = 0US, 1US, 2US, 3US ; + DQF:flag_meanings = "normal nonretrievable uncertain bad_data" ; + DQF:number_of_qf_values = 4US ; + DQF:potentially_geo_pixel_count_used_as_percent_denominator = 23046372 ; + ushort IceConc(y, x) ; + IceConc:_FillValue = 65535US ; + IceConc:long_name = "ABI L2 Cryosphere Ice Concentration" ; + IceConc:standard_name = "ice_concentration" ; + IceConc:valid_range = 0US, 65530US ; + IceConc:scale_factor = 0.00152602f ; + IceConc:add_offset = 0.f ; + IceConc:units = "percent" ; + IceConc:resolution = "y: 0.000056 rad x: 0.000056 rad" ; + IceConc:coordinates = "retrieval_local_zenith_angle quantitative_local_zenith_angle retrieval_solar_zenith_angle quantitative_solar_zenith_angle t y x" ; + IceConc:grid_mapping = "goes_imager_projection" ; + IceConc:cell_methods = "retrieval_local_zenith_angle: point (good or degraded quality pixel produced) quantitative_local_zenith_angle: point (good quality pixel produced) retrieval_solar_zenith_angle: point (good or degraded quality pixel produced) quantitative_solar_zenith_angle: point (good quality pixel produced) t: point area: point" ; + IceConc:ancillary_variables = "DQF" ; + byte Mask(y, x) ; + Mask:_FillValue = -99b ; + Mask:long_name = "ABI L2 Cryosphere Ice Mask" ; + Mask:standard_name = "ice_mask" ; + Mask:valid_range = -128b, 127b ; + Mask:units = "1" ; + Mask:resolution = "y: 0.000056 rad x: 0.000056 rad" ; + Mask:coordinates = "retrieval_local_zenith_angle quantitative_local_zenith_angle retrieval_solar_zenith_angle t y x" ; + Mask:grid_mapping = "goes_imager_projection" ; + Mask:cell_methods = "retrieval_local_zenith_angle: point (good or degraded quality pixel produced) quantitative_local_zenith_angle: point (good quality pixel produced) retrieval_solar_zenith_angle: point (good quality pixel produced) t: point area: point" ; + Mask:flag_values = -3b, -2b, -1b, 0b, 1b, 2b ; + Mask:flag_meanings = "non_retrieval water land cloud day_ice night_ice" ; + Mask:ancillary_variables = "DQF" ; + Mask:clear_pixel_definition = "no cloud detected and failed a test for high values of spatial heterogeneity" ; + Mask:probably_clear_pixel_definition = "no cloud detected but passed a test for high values of spatial heterogeneity and one or more neighboring pixels identified as cloudy. pixel is possibly cloud-contaminated" ; + Mask:probably_cloudy_pixel_definition = "cloud detected but likely contains a cloud edge, since one or more neighboring pixels are clear. pixel is probably cloud-contaminated" ; + Mask:cloudy_pixel_definition = "cloud detected and failed a test for cloud edges" ; + uint PQI(y, x) ; + PQI:_FillValue = 0U ; + PQI:long_name = "ABI L2 Cryosphere Ice Concentration product quality indicator" ; + PQI:units = "1" ; + PQI:grid_mapping = "goes_imager_projection" ; + PQI:coordinates = "y x" ; + PQI:flag_meanings = "normal nonretrievable uncertain bad_data cloud_mask_clear cloud_mask_probably_clear cloud_mask_probably_cloudy cloud_mask_cloudy day_night_qf sunglint_qf cloud_shadow_qf off_earth_qf solar_zenith_angle_qf satellite_zenith_angle_qf reflectance_band_2_qf reflectance_band_3_qf reflectance_band_5_qf brightness_temp_band_14_qf brightness_temp_band_15_qf Unused_Bit_15 surface_in-land_water surface_land surface_sea_water surface_other reflectance_test_ice_cover_detection_qf NDSI_test_ice_cover_detection_qf skin_temp_test_ice_cover_detection_qf visable_band_tie-pont_qf Unused_Bit_23 read_input_qf Unused_Bit_25 Unused_Bit_26 Unused_Bit_27 Unused_Bit_28 Unused_Bit_29 Unused_Bit_30 Unused_Bit_31" ; + PQI:number_of_qf_values = 37U ; + ushort Temp(y, x) ; + Temp:_FillValue = 65535US ; + Temp:long_name = "ABI L2 Cryosphere Ice Surface Temperature" ; + Temp:standard_name = "ice_temperature" ; + Temp:valid_range = 0US, 65530US ; + Temp:scale_factor = 0.00267053f ; + Temp:add_offset = 100.f ; + Temp:units = "kelvin" ; + Temp:resolution = "y: 0.000056 rad x: 0.000056 rad" ; + Temp:coordinates = "retrieval_local_zenith_angle quantitative_local_zenith_angle retrieval_solar_zenith_angle quantitative_solar_zenith_angle t y x" ; + Temp:grid_mapping = "goes_imager_projection" ; + Temp:cell_methods = "retrieval_local_zenith_angle: point (good or degraded quality pixel produced) quantitative_local_zenith_angle: point (good quality pixel produced) retrieval_solar_zenith_angle: point (good or degraded quality pixel produced) quantitative_solar_zenith_angle: point (good quality pixel produced) t: point area: point" ; + Temp:ancillary_variables = "DQF" ; + int algorithm_disabled_due_to_mitigation ; + algorithm_disabled_due_to_mitigation:long_name = "Status flag indicating if the algorithm was disabled due to upstream degradation" ; + algorithm_disabled_due_to_mitigation:_FillValue = -1 ; + algorithm_disabled_due_to_mitigation:flag_value = 0, 1 ; + algorithm_disabled_due_to_mitigation:flag_meanings = "unset set" ; + algorithm_disabled_due_to_mitigation:valid_range = 0, 1 ; + algorithm_disabled_due_to_mitigation:units = "1" ; + int algorithm_dynamic_input_data_container ; + algorithm_dynamic_input_data_container:long_name = "container for filenames of dynamic algorithm input data" ; + algorithm_dynamic_input_data_container:input_ABI_L2_auxiliary_solar_zenith_angle_data = "OR_I_ABI-L2-AUXF-M6_G16_s20241692100214_e20241692109522_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_auxiliary_local_zenith_angle_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_auxiliary_land_mask_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_auxiliary_lat_lon_position_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_reflectance_band_1_2km_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_reflectance_band_2_2km_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_reflectance_band_3_2km_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_reflectance_band_5_2km_data = "null" ; + algorithm_dynamic_input_data_container:input_ABI_L2_brightness_temperature_band_14_2km_data = "OR_ABI-L2-CMIPF-M6C14_G16_s2024-06-17T21:00:21.4Z_e2024-06-17T21:09:52.2Z_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_brightness_temperature_band_15_2km_data = "OR_ABI-L2-CMIPF-M6C15_G16_s2024-06-17T21:00:21.4Z_e2024-06-17T21:09:52.2Z_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_cloud_mask_data_information_flag_data = "OR_I_ABI-L2-ACMDIFF-M6_G16_s20241692100214_e20241692109522_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_4_level_cloud_mask_data = "OR_ABI-L2-ACMF-M6_G16_s20241692100214_e20241692109522_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_cloud_mask_granule_level_quality_flag_data = "OR_ABI-L2-ACMF-M6_G16_s20241692100214_e20241692109522_c*.nc" ; + algorithm_dynamic_input_data_container:input_ABI_L2_intermediate_product_cloud_top_cloud_shadow_flag_data = "OR_I_ABI-L2-ACHF-M6_G16_s20241692100214_e20241692109522_c*.nc" ; + int algorithm_product_version_container ; + algorithm_product_version_container:long_name = "container for algorithm package filename and product version" ; + algorithm_product_version_container:algorithm_version = "OR_ABI-L2-ALG-AICE_v02r00.zip" ; + algorithm_product_version_container:product_version = "v02r00" ; + float geospatial_lat_lon_extent ; + geospatial_lat_lon_extent:long_name = "geospatial latitude and longitude references" ; + geospatial_lat_lon_extent:geospatial_westbound_longitude = -156.2995f ; + geospatial_lat_lon_extent:geospatial_northbound_latitude = 81.3282f ; + geospatial_lat_lon_extent:geospatial_eastbound_longitude = 6.2995f ; + geospatial_lat_lon_extent:geospatial_southbound_latitude = -81.3282f ; + geospatial_lat_lon_extent:geospatial_lat_center = 0.f ; + geospatial_lat_lon_extent:geospatial_lon_center = -75.f ; + geospatial_lat_lon_extent:geospatial_lat_nadir = 0.f ; + geospatial_lat_lon_extent:geospatial_lon_nadir = -75.f ; + geospatial_lat_lon_extent:geospatial_lat_units = "degrees_north" ; + geospatial_lat_lon_extent:geospatial_lon_units = "degrees_east" ; + int goes_imager_projection ; + goes_imager_projection:long_name = "GOES-R ABI fixed grid projection" ; + goes_imager_projection:grid_mapping_name = "geostationary" ; + goes_imager_projection:perspective_point_height = 35786023. ; + goes_imager_projection:semi_major_axis = 6378137. ; + goes_imager_projection:semi_minor_axis = 6356752.31414 ; + goes_imager_projection:inverse_flattening = 298.2572221 ; + goes_imager_projection:latitude_of_projection_origin = 0. ; + goes_imager_projection:longitude_of_projection_origin = -75. ; + goes_imager_projection:sweep_angle_axis = "x" ; + int64 granule_level_quality_flag ; + granule_level_quality_flag:long_name = "Cloud Mask Granule Level Degradation Quality Flag" ; + granule_level_quality_flag:flag_masks = 0LL, 1LL, 63LL ; + granule_level_quality_flag:flag_meanings = "valid_channels channel_missing algorithm_failure" ; + granule_level_quality_flag:_FillValue = -999LL ; + granule_level_quality_flag:valid_range = 0LL, 63LL ; + granule_level_quality_flag:units = "1" ; + float maximum_ice_retrieval ; + maximum_ice_retrieval:long_name = "maximum ice concentration retrieval" ; + maximum_ice_retrieval:standard_name = "ice_concentration_retrieval" ; + maximum_ice_retrieval:_FillValue = -999.f ; + maximum_ice_retrieval:valid_range = 0.f, 20000.f ; + maximum_ice_retrieval:units = "m" ; + maximum_ice_retrieval:coordinates = "local_zenith_angle solar_zenith_angle t y_image x_image" ; + maximum_ice_retrieval:grid_mapping = "goes_imager_projection" ; + maximum_ice_retrieval:cell_methods = "local_zenith_angle: sum solar_zenith_angle: sum t: sum area: maximum (interval: variable[@name=\'x\']/values rad comment: good quality pixels only) where ice retrieval" ; + float mean_ice_retrieval ; + mean_ice_retrieval:long_name = "mean ice concentration retrieval" ; + mean_ice_retrieval:standard_name = "ice_concentration_retrieval" ; + mean_ice_retrieval:_FillValue = -999.f ; + mean_ice_retrieval:valid_range = 0.f, 20000.f ; + mean_ice_retrieval:units = "m" ; + mean_ice_retrieval:coordinates = "local_zenith_angle solar_zenith_angle t y_image x_image" ; + mean_ice_retrieval:grid_mapping = "goes_imager_projection" ; + mean_ice_retrieval:cell_methods = "local_zenith_angle: sum solar_zenith_angle: sum t: sum area: mean (interval: variable[@name=\'x\']/values rad comment: good quality pixels only) where ice retrieval" ; + float minimum_ice_retrieval ; + minimum_ice_retrieval:long_name = "minimum ice concentration retrieval" ; + minimum_ice_retrieval:standard_name = "ice_concentration_retrieval" ; + minimum_ice_retrieval:_FillValue = -999.f ; + minimum_ice_retrieval:valid_range = 0.f, 20000.f ; + minimum_ice_retrieval:units = "m" ; + minimum_ice_retrieval:coordinates = "local_zenith_angle solar_zenith_angle t y_image x_image" ; + minimum_ice_retrieval:grid_mapping = "goes_imager_projection" ; + minimum_ice_retrieval:cell_methods = "local_zenith_angle: sum solar_zenith_angle: sum t: sum area: minimum (interval: variable[@name=\'x\']/values rad comment: good quality pixels only) where ice retrieval" ; + float nominal_satellite_height ; + nominal_satellite_height:long_name = "nominal satellite height above GRS 80 ellipsoid (platform altitude)" ; + nominal_satellite_height:standard_name = "height_above_reference_ellipsoid" ; + nominal_satellite_height:_FillValue = -999.f ; + nominal_satellite_height:units = "km" ; + float nominal_satellite_subpoint_lat ; + nominal_satellite_subpoint_lat:long_name = "nominal satellite subpoint latitude (platform latitude)" ; + nominal_satellite_subpoint_lat:standard_name = "latitude" ; + nominal_satellite_subpoint_lat:_FillValue = -999.f ; + nominal_satellite_subpoint_lat:units = "degrees_north" ; + float nominal_satellite_subpoint_lon ; + nominal_satellite_subpoint_lon:long_name = "nominal satellite subpoint longitude (platform longitude)" ; + nominal_satellite_subpoint_lon:standard_name = "longitude" ; + nominal_satellite_subpoint_lon:_FillValue = -999.f ; + nominal_satellite_subpoint_lon:units = "degrees_east" ; + int number_of_bad_data_pixels ; + number_of_bad_data_pixels:long_name = "number of bad data pixels that do not exceed local zenith angle threshold" ; + number_of_bad_data_pixels:_FillValue = -1 ; + number_of_bad_data_pixels:units = "count" ; + number_of_bad_data_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_bad_data_pixels:grid_mapping = "goes_imager_projection" ; + number_of_bad_data_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where bad data" ; + int number_of_day_pixels ; + number_of_day_pixels:long_name = "number of day pixels that do not exceed local zenith angle threshold" ; + number_of_day_pixels:_FillValue = -1 ; + number_of_day_pixels:units = "count" ; + number_of_day_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_day_pixels:grid_mapping = "goes_imager_projection" ; + number_of_day_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where day" ; + int number_of_ice_retrievals ; + number_of_ice_retrievals:long_name = "number of valid ice cover and retrieval pixels that do not exceed local zenith angle threshold" ; + number_of_ice_retrievals:_FillValue = -1 ; + number_of_ice_retrievals:units = "count" ; + number_of_ice_retrievals:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_ice_retrievals:grid_mapping = "goes_imager_projection" ; + number_of_ice_retrievals:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where valid ice cover and retrieval" ; + int number_of_night_pixels ; + number_of_night_pixels:long_name = "number of night pixels that do not exceed local zenith angle threshold" ; + number_of_night_pixels:_FillValue = -1 ; + number_of_night_pixels:units = "count" ; + number_of_night_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_night_pixels:grid_mapping = "goes_imager_projection" ; + number_of_night_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where night" ; + int number_of_nonretrievable_pixels ; + number_of_nonretrievable_pixels:long_name = "number of nonretrievable pixels that do not exceed local zenith angle threshold" ; + number_of_nonretrievable_pixels:_FillValue = -1 ; + number_of_nonretrievable_pixels:units = "count" ; + number_of_nonretrievable_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_nonretrievable_pixels:grid_mapping = "goes_imager_projection" ; + number_of_nonretrievable_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where nonretrievable" ; + int number_of_normal_pixels ; + number_of_normal_pixels:long_name = "number of normal pixels that do not exceed local zenith angle threshold" ; + number_of_normal_pixels:_FillValue = -1 ; + number_of_normal_pixels:units = "count" ; + number_of_normal_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_normal_pixels:grid_mapping = "goes_imager_projection" ; + number_of_normal_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where normal" ; + int number_of_terminator_pixels ; + number_of_terminator_pixels:long_name = "number of terminator pixels that do not exceed local zenith angle threshold" ; + number_of_terminator_pixels:_FillValue = -1 ; + number_of_terminator_pixels:units = "count" ; + number_of_terminator_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_terminator_pixels:grid_mapping = "goes_imager_projection" ; + number_of_terminator_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where terminator" ; + int number_of_uncertain_pixels ; + number_of_uncertain_pixels:long_name = "number of uncertain pixels that do not exceed local zenith angle threshold" ; + number_of_uncertain_pixels:_FillValue = -1 ; + number_of_uncertain_pixels:units = "count" ; + number_of_uncertain_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_uncertain_pixels:grid_mapping = "goes_imager_projection" ; + number_of_uncertain_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where uncertain" ; + int number_of_water_pixels ; + number_of_water_pixels:long_name = "number of water pixels that do not exceed local zenith angle threshold" ; + number_of_water_pixels:_FillValue = -1 ; + number_of_water_pixels:units = "count" ; + number_of_water_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + number_of_water_pixels:grid_mapping = "goes_imager_projection" ; + number_of_water_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where water" ; + float percent_ice_retrieval_pixels ; + percent_ice_retrieval_pixels:long_name = "percent of ice retrieval pixels that do not exceed local zenith angle threshold" ; + percent_ice_retrieval_pixels:standard_name = "clear_sky_area_fraction" ; + percent_ice_retrieval_pixels:_FillValue = -999.f ; + percent_ice_retrieval_pixels:valid_range = 0.f, 1.f ; + percent_ice_retrieval_pixels:units = "percent" ; + percent_ice_retrieval_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + percent_ice_retrieval_pixels:grid_mapping = "goes_imager_projection" ; + percent_ice_retrieval_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where ice retrieval" ; + float percent_terminator_pixels ; + percent_terminator_pixels:long_name = "percent of terminator pixels that do not exceed local zenith angle threshold" ; + percent_terminator_pixels:standard_name = "clear_sky_area_fraction" ; + percent_terminator_pixels:_FillValue = -999.f ; + percent_terminator_pixels:valid_range = 0.f, 1.f ; + percent_terminator_pixels:units = "percent" ; + percent_terminator_pixels:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + percent_terminator_pixels:grid_mapping = "goes_imager_projection" ; + percent_terminator_pixels:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where terminator" ; + float percent_uncorrectable_GRB_errors ; + percent_uncorrectable_GRB_errors:long_name = "percent data lost due to uncorrectable GRB errors" ; + percent_uncorrectable_GRB_errors:_FillValue = -999.f ; + percent_uncorrectable_GRB_errors:valid_range = 0.f, 1.f ; + percent_uncorrectable_GRB_errors:units = "percent" ; + percent_uncorrectable_GRB_errors:coordinates = "t y_image x_image" ; + percent_uncorrectable_GRB_errors:grid_mapping = "goes_imager_projection" ; + percent_uncorrectable_GRB_errors:cell_methods = "t: sum area: sum (uncorrectable GRB errors only)" ; + float percent_uncorrectable_L0_errors ; + percent_uncorrectable_L0_errors:long_name = "percent data lost due to uncorrectable L0 errors" ; + percent_uncorrectable_L0_errors:_FillValue = -999.f ; + percent_uncorrectable_L0_errors:valid_range = 0.f, 1.f ; + percent_uncorrectable_L0_errors:units = "percent" ; + percent_uncorrectable_L0_errors:coordinates = "t y_image x_image" ; + percent_uncorrectable_L0_errors:grid_mapping = "goes_imager_projection" ; + percent_uncorrectable_L0_errors:cell_methods = "t: sum area: sum (uncorrectable L0 errors only)" ; + int processing_parm_version_container ; + processing_parm_version_container:long_name = "container for processing parameter filenames" ; + processing_parm_version_container:L2_processing_parm_version = "OR_ABI-L2-PARM-AICE_v02r00.zip, OR_ANC-L2-PARM-SEMISTATIC_v01r00.zip, OR_ABI-L2-PARM-AUXILIARY_v01r00.zip" ; + float quantitative_local_zenith_angle ; + quantitative_local_zenith_angle:long_name = "threshold angle between the line of sight to the satellite and the local zenith at the observation target for good quality ice concentration and extent data production" ; + quantitative_local_zenith_angle:standard_name = "platform_zenith_angle" ; + quantitative_local_zenith_angle:units = "degree" ; + quantitative_local_zenith_angle:bounds = "quantitative_local_zenith_angle_bounds" ; + float quantitative_local_zenith_angle_bounds(number_of_LZA_bounds) ; + quantitative_local_zenith_angle_bounds:long_name = "local zenith angle degree range where good quality ice concentration and extent data is produced" ; + float quantitative_solar_zenith_angle ; + quantitative_solar_zenith_angle:long_name = "threshold angle between the line of sight to the sun and the local zenith at the observation target for good quality ice concentration and extent data production" ; + quantitative_solar_zenith_angle:standard_name = "solar_zenith_angle" ; + quantitative_solar_zenith_angle:units = "degree" ; + quantitative_solar_zenith_angle:bounds = "quantitative_solar_zenith_angle_bounds" ; + float quantitative_solar_zenith_angle_bounds(number_of_SZA_bounds) ; + quantitative_solar_zenith_angle_bounds:long_name = "solar zenith angle degree range where good quality ice concentration and extent data is produced" ; + float retrieval_local_zenith_angle ; + retrieval_local_zenith_angle:long_name = "threshold angle between the line of sight to the satellite and the local zenith at the observation target for good or degraded quality ice concentration and extent data production" ; + retrieval_local_zenith_angle:standard_name = "platform_zenith_angle" ; + retrieval_local_zenith_angle:units = "degree" ; + retrieval_local_zenith_angle:bounds = "retrieval_local_zenith_angle_bounds" ; + float retrieval_local_zenith_angle_bounds(number_of_LZA_bounds) ; + retrieval_local_zenith_angle_bounds:long_name = "local zenith angle degree range where good quality ice concentration and extent data is produced" ; + float retrieval_solar_zenith_angle ; + retrieval_solar_zenith_angle:long_name = "threshold angle between the line of sight to the sun and the local zenith at the observation target for good or degraded quality ice concentration and extent data production" ; + retrieval_solar_zenith_angle:standard_name = "solar_zenith_angle" ; + retrieval_solar_zenith_angle:units = "degree" ; + retrieval_solar_zenith_angle:bounds = "retrieval_solar_zenith_angle_bounds" ; + float retrieval_solar_zenith_angle_bounds(number_of_SZA_bounds) ; + retrieval_solar_zenith_angle_bounds:long_name = "solar zenith angle degree range where good or degraded quality ice concentration and extent data is produced" ; + int size_searchwindow ; + size_searchwindow:long_name = "size of search window pixels that do not exceed local zenith angle threshold" ; + size_searchwindow:_FillValue = -1 ; + size_searchwindow:units = "count" ; + size_searchwindow:coordinates = "quantitative_local_zenith_angle retrieval_solar_zenith_angle t y_image x_image" ; + size_searchwindow:grid_mapping = "goes_imager_projection" ; + size_searchwindow:cell_methods = "quantitative_local_zenith_angle: sum retrieval_solar_zenith_angle: sum t: sum area: sum (interval: 0.000056 rad comment: good quality pixels only) where search window size" ; + float std_dev_ice_retrieval ; + std_dev_ice_retrieval:long_name = "standard deviation of ice concentration retrieval values" ; + std_dev_ice_retrieval:standard_name = "ice_concentration_retrieval" ; + std_dev_ice_retrieval:_FillValue = -999.f ; + std_dev_ice_retrieval:units = "m" ; + std_dev_ice_retrieval:coordinates = "local_zenith_angle solar_zenith_angle t y_image x_image" ; + std_dev_ice_retrieval:grid_mapping = "goes_imager_projection" ; + std_dev_ice_retrieval:cell_methods = "local_zenith_angle: sum solar_zenith_angle: sum t: sum area: standard_deviation (interval: variable[@name=\'x\']/@value rad comment: good quality pixels only) where ice retrieval" ; + double t ; + t:long_name = "J2000 epoch mid-point between the start and end image scan in seconds" ; + t:standard_name = "time" ; + t:units = "seconds since 2000-01-01 12:00:00" ; + t:axis = "T" ; + t:bounds = "time_bounds" ; + double time_bounds(number_of_time_bounds) ; + time_bounds:long_name = "Scan start and end times in seconds since epoch (2000-01-01 12:00:00)" ; + short x(x) ; + x:scale_factor = 5.6e-05f ; + x:add_offset = -0.151844f ; + x:units = "rad" ; + x:axis = "X" ; + x:long_name = "GOES fixed grid projection x-coordinate" ; + x:standard_name = "projection_x_coordinate" ; + float x_image ; + x_image:long_name = "GOES-R fixed grid projection x-coordinate center of image" ; + x_image:standard_name = "projection_x_coordinate" ; + x_image:units = "rad" ; + x_image:axis = "X" ; + float x_image_bounds(number_of_image_bounds) ; + x_image_bounds:long_name = "GOES-R fixed grid projection x-coordinate west/east extent of image" ; + x_image_bounds:units = "rad" ; + short y(y) ; + y:scale_factor = -5.6e-05f ; + y:add_offset = 0.151844f ; + y:units = "rad" ; + y:axis = "Y" ; + y:long_name = "GOES fixed grid projection y-coordinate" ; + y:standard_name = "projection_y_coordinate" ; + float y_image ; + y_image:long_name = "GOES-R fixed grid projection y-coordinate center of image" ; + y_image:standard_name = "projection_y_coordinate" ; + y_image:units = "rad" ; + y_image:axis = "Y" ; + float y_image_bounds(number_of_image_bounds) ; + y_image_bounds:long_name = "GOES-R fixed grid projection y-coordinate north/south extent of image" ; + y_image_bounds:units = "rad" ; + +// global attributes: + :naming_authority = "gov.nesdis.noaa" ; + :Conventions = "CF-1.7" ; + :Metadata_Conventions = "Unidata Dataset Discovery v1.0" ; + :standard_name_vocabulary = "CF Standard Name Table (v35, 20 July 2016)" ; + :institution = "DOC/NOAA/NESDIS > U.S. Department of Commerce, National Oceanic and Atmospheric Administration, National Environmental Satellite, Data, and Information Services" ; + :project = "GOES" ; + :production_site = "NSOF" ; + :production_environment = "OE" ; + :spatial_resolution = "2.0km at nadir" ; + :orbital_slot = "GOES-East" ; + :platform_ID = "G16" ; + :instrument_type = "GOES-R Series Advanced Baseline Imager (ABI)" ; + :scene_id = "Full Disk" ; + :instrument_ID = "FM1" ; + :dataset_name = "OR_ABI-L2-AICEF-M6_G16_s20241692100214_e20241692109522_c20241692114339.nc" ; + :iso_series_metadata_id = "e7ce8b20-b00a-11e1-afa6-0800200c9a66" ; + :title = "ABI L2 Cryosphere Ice Concentration" ; + :summary = "GOES Cryosphere Ice Concentration" ; + :keywords = "CRYOSPHERE > ICE CONCENTRATION AND EXTENT > ICE CONCENTRATION" ; + :keywords_vocabulary = "NASA Global Change Master Directory (GCMD) Earth Science Keywords, Version 7.0.0.0.0" ; + :license = "Unclassified data. Access is restricted to approved users only." ; + :processing_level = "National Aeronautics and Space Administration (NASA) L2" ; + :cdm_data_type = "Image" ; + :date_created = "2024-06-17T21:14:33.9Z" ; + :time_coverage_start = "2024-06-17T21:00:21.4Z" ; + :time_coverage_end = "2024-06-17T21:09:52.2Z" ; + :timeline_id = "ABI Mode 6" ; + :production_data_source = "Realtime" ; + :id = "46003997-f244-4032-9fcd-90d65356d239" ; + :history = "Tue Sep 17 20:20:53 2024: ncks -d x,2940,2960 -d y,60,80 OR_ABI-L2-AICEF-M6_G16_s20241692100214_e20241692109522_c20241692114339.nc icec_abi_g16_2.nc" ; + :NCO = "netCDF Operators version 5.0.6 (Homepage = http://nco.sf.net, Code = http://github.com/nco/nco)" ; +data: + + DQF = + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ; + + IceConc = + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + 64980, 60355, 58994, 64417, 65530, 65530, 65530, 60998, _, _, _, _, _, _, + _, _, _, _, _, _, _, + 65077, 65530, 65385, 58081, 65530, 65530, 61043, 53357, 65530, 65530, + 65530, 60489, 53651, 62895, 59205, _, _, _, _, _, _, + 65530, 65530, 65530, 60727, 60484, 64039, 65530, 65530, 65530, 65530, + 60138, 65530, 59879, 46424, 56419, _, _, _, _, _, _, + 60769, 65530, 65530, 65530, 65530, 65530, 65530, 61779, 65530, 65530, + 65530, 65530, 65530, 60387, 65530, _, _, _, _, _, _, + _, _, _, 65530, 65530, 65530, 65530, 65530, 65530, 65530, 65530, 65225, + 65530, 59482, 65530, _, _, _, _, _, _, + _, _, _, _, _, _, 64718, 65530, 65530, 65530, 65128, 63451, 62976, 60843, + 65530, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, 63894, 65530, 65530, 65530, 64013, 60501, 65530, _, + _, _, _, _, _, + _, _, _, _, _, _, _, _, _, 62898, 64994, 61547, 64815, 63020, 64341, _, _, + _, _, _, _, + _, _, _, _, _, _, _, _, _, _, 60139, 61896, 65530, 65530, 65530, _, _, _, + _, _, _, + _, _, _, _, _, _, _, _, _, _, _, 60841, 65530, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ ; + + Mask = + -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, + -3, -3, + 1, 1, 1, 1, 1, 1, 1, 1, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -3, -3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -3, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -3, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -3, -3, -3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, -3, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; + + PQI = + 7405794, 7405794, 7405794, 7405794, 7405794, 7405794, 7405794, 7405794, + 7405794, 7405794, 7405794, 7405794, 7405794, 7405794, 7405794, 7405794, + 7405794, 7405794, 7405794, 7405794, 7405794, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 7405794, 7405794, 7405794, 7405794, 7405794, 7405794, 7405794, 7405794, + 7405794, 7405794, 7405794, 7405794, 7405794, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 6357218, + 6357218, 6357218, 6357218, 7405794, 7405794, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 6357218, + 6357218, 6357218, 8192230, 6357218, 6357218, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 8192238, + 8192238, 8192238, 8192238, 6357218, 6357218, + 8192238, 8192238, 8192238, 4260064, 4260064, 4260064, 4260064, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 6357218, + 6357218, 8192162, 8192162, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 4260073, 4260064, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 6357218, + 6357218, 8192162, 8192162, 8192230, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 6357218, + 6357218, 6357218, 8192162, 8192162, 8192162, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 4260064, 4260064, 4260064, 4260064, 4260064, 4260064, 6357218, + 6357218, 8192162, 8192162, 8192230, 8192230, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192230, 4260064, 4260064, 4260064, 4260064, 4260064, 6357218, + 6357218, 8192162, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 4260073, 4260064, 8192238, 8192230, 8192230, + 6357218, 8192162, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, 8192238, + 8192238, 8192238, 8192238, 8192238, 8192238 ; + + Temp = + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + 63797, 63724, 63710, 63825, 63956, 63970, 63895, 63763, _, _, _, _, _, _, + _, _, _, _, _, _, _, + 63786, 63756, 63726, 63640, 63769, 63825, 63739, 63604, 63911, 63967, + 63969, 63748, 63676, 63748, 63736, 63518, 63376, 63528, 63583, _, _, + 63713, 63787, 63699, 63507, 63536, 63713, 63710, 63707, 63837, 63748, + 63588, 63633, 63544, 63181, 62840, 62278, 61662, 61777, _, 63399, 63280, + 62097, 62699, 62965, 63397, 63289, 63340, 63364, 63418, 63532, 63427, + 63044, 63030, 63129, 62906, 62089, _, _, _, _, 62111, 62222, + _, _, _, 62321, 62459, 62400, 62748, 63090, 63124, 63297, 63226, 62857, + 62842, 62991, 62877, 62567, 62520, _, _, _, _, + _, _, _, _, _, _, 62315, 63240, 63232, 63409, 63468, 63215, 63173, 63011, + 63491, 63605, 63383, _, _, _, _, + _, _, _, _, _, _, _, _, 62719, 63372, 63544, 63587, 63424, 63314, 63510, + 63458, 63498, 63497, _, _, _, + _, _, _, _, _, _, _, _, _, 62876, 63431, 63455, 63514, 63597, 63659, 63468, + 63438, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, 61708, 62059, 62695, 62995, 62392, 61234, + 61151, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, 60245, 60776, _, _, _, 61299, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, + _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ ; + + algorithm_disabled_due_to_mitigation = 0 ; + + algorithm_dynamic_input_data_container = _ ; + + algorithm_product_version_container = _ ; + + geospatial_lat_lon_extent = _ ; + + goes_imager_projection = _ ; + + granule_level_quality_flag = 0 ; + + maximum_ice_retrieval = 100 ; + + mean_ice_retrieval = 90.79719 ; + + minimum_ice_retrieval = 0.001220703 ; + + nominal_satellite_height = 35786.02 ; + + nominal_satellite_subpoint_lat = 0 ; + + nominal_satellite_subpoint_lon = -75.2 ; + + number_of_bad_data_pixels = 5317100 ; + + number_of_day_pixels = 12507 ; + + number_of_ice_retrievals = 37443 ; + + number_of_night_pixels = 24936 ; + + number_of_nonretrievable_pixels = 13714 ; + + number_of_normal_pixels = 37443 ; + + number_of_terminator_pixels = 5330814 ; + + number_of_uncertain_pixels = 17678115 ; + + number_of_water_pixels = 4883805 ; + + percent_ice_retrieval_pixels = 0.5045139 ; + + percent_terminator_pixels = 8.059138 ; + + percent_uncorrectable_GRB_errors = 0 ; + + percent_uncorrectable_L0_errors = 0 ; + + processing_parm_version_container = _ ; + + quantitative_local_zenith_angle = 80 ; + + quantitative_local_zenith_angle_bounds = 0, 80 ; + + quantitative_solar_zenith_angle = 85 ; + + quantitative_solar_zenith_angle_bounds = 0, 85 ; + + retrieval_local_zenith_angle = 80 ; + + retrieval_local_zenith_angle_bounds = 0, 80 ; + + retrieval_solar_zenith_angle = 85 ; + + retrieval_solar_zenith_angle_bounds = 0, 85 ; + + size_searchwindow = 50 ; + + std_dev_ice_retrieval = 18.02047 ; + + t = 771930306.85195 ; + + time_bounds = 771930021.449838, 771930592.254062 ; + + x = 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, + 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960 ; + + x_image = 0 ; + + x_image_bounds = -0.151872, 0.151872 ; + + y = 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80 ; + + y_image = 0 ; + + y_image_bounds = 0.151872, -0.151872 ; +} diff --git a/utils/test/testinput/gdas_icecabi2ioda.yaml b/utils/test/testinput/gdas_icecabi2ioda.yaml new file mode 100644 index 000000000..39a893702 --- /dev/null +++ b/utils/test/testinput/gdas_icecabi2ioda.yaml @@ -0,0 +1,13 @@ +provider: ABI +window begin: 2024-06-18T15:00:00Z +window end: 2024-06-19T21:00:00Z +output file: icec_abi.ioda.nc +#ocean basin: RECCAP2_region_masks_all_v20221025.nc +input files: +- icec_abi_g16_1.nc4 +- icec_abi_g16_2.nc4 + +test: + reference filename: testref/icecabi2ioda.test + test output filename: testoutput/icecabi2ioda.test + float relative tolerance: 1e-6 diff --git a/utils/test/testref/icecabi2ioda.test b/utils/test/testref/icecabi2ioda.test new file mode 100644 index 000000000..640701827 --- /dev/null +++ b/utils/test/testref/icecabi2ioda.test @@ -0,0 +1,26 @@ +Reading: [icec_abi_g16_1.nc4,icec_abi_g16_2.nc4] +seconds since 2000-01-01T12:00:00Z +obsVal: + Min: 0.568351 + Max: 0.999635 + Sum: 122.002 +obsError: + Min: 0.1 + Max: 0.1 + Sum: 13.5 +preQc: + Min: 0 + Max: 1 + Sum: 5 +longitude: + Min: -79.8731 + Max: -59.9008 + Sum: -9898.07 +latitude: + Min: 67.1378 + Max: 70.7751 + Sum: 9242.36 +datetime: + Min: 771919506 + Max: 771930306 + Sum: 104209597710 From 936e6faad7d347df5ea52b4ee38a8ad67385b106 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Fri, 18 Oct 2024 13:33:23 -0400 Subject: [PATCH 10/13] fixing the yaml (#1338) corrected the yaml for tropical moorings --- .../bufr2ioda_insitu_profile_tropical_2019010700.yaml.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/marine/testinput/bufr2ioda_insitu_profile_tropical_2019010700.yaml.in b/test/marine/testinput/bufr2ioda_insitu_profile_tropical_2019010700.yaml.in index 1fa5a1856..5657fe263 100644 --- a/test/marine/testinput/bufr2ioda_insitu_profile_tropical_2019010700.yaml.in +++ b/test/marine/testinput/bufr2ioda_insitu_profile_tropical_2019010700.yaml.in @@ -2,12 +2,12 @@ data_format: dbuoy subsets: dbuoy source: NCEP data tank -data_type: drifter +data_type: tropical cycle_type: gdas cycle_datetime: '2019010700' dump_directory: __BUFRINPUTDIR__ ioda_directory: __IODAOUTPUTDIR__ ocean_basin: __OCEANBASIN__ -data_description: 6-hrly in situ drifter profiles +data_description: 6-hrly in situ tropical mooring profiles data_provider: U.S. NOAA From 93e7ec60bbc354a3db42d174eb59f8ed1a170f48 Mon Sep 17 00:00:00 2001 From: Guillaume Vernieres Date: Fri, 18 Oct 2024 16:53:12 -0400 Subject: [PATCH 11/13] Addition of a gnu lua file for hercules (#1341) - fixes #1340 I had to comment out `da-utils` in the bundle, but other than that the system builds. --- modulefiles/GDAS/hercules.gnu.lua | 93 +++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 modulefiles/GDAS/hercules.gnu.lua diff --git a/modulefiles/GDAS/hercules.gnu.lua b/modulefiles/GDAS/hercules.gnu.lua new file mode 100644 index 000000000..217538f6c --- /dev/null +++ b/modulefiles/GDAS/hercules.gnu.lua @@ -0,0 +1,93 @@ +help([[ +Load environment for running the GDAS application with gnu compilers and MPI. +]]) + +local pkgName = myModuleName() +local pkgVersion = myModuleVersion() +local pkgNameVer = myModuleFullName() + +prepend_path("MODULEPATH", '/work/noaa/epic/role-epic/spack-stack/hercules/modulefiles') +prepend_path("MODULEPATH", '/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-1.7.0/envs/ue-gcc/install/modulefiles/Core') +prepend_path("MODULEPATH", '/work2/noaa/da/python/opt/modulefiles/stack') + + +---- below two lines get us access to the spack-stack modules +load("stack-gcc/12.2.0") +load("stack-openmpi/4.1.6") + +load("cmake/3.23.1") +load("curl/8.4.0") +load("zlib/1.2.13") +load("git/2.31.1") +--load("pkg-config/0.27.1") +load("hdf5/1.14.3") +load("parallel-netcdf/1.12.3") +load("netcdf-c/4.9.2") +load("nccmp/1.9.0.1") +load("netcdf-fortran/4.6.1") +load("nco/5.1.6") +load("parallelio/2.6.2") +load("wget/1.21.1") +load("boost/1.84.0") +load("bufr/12.0.1") +load("git-lfs/3.1.2") +load("ecbuild/3.7.2") +load("openjpeg/2.3.1") +load("eccodes/2.33.0") +load("eigen/3.4.0") +load("openblas/0.3.24") +load("eckit/1.24.5") +load("fftw/3.3.10") +load("fckit/0.11.0") +load("fiat/1.2.0") +load("ectrans/1.2.0") +load("fms/2023.04") +load("esmf/8.6.1") +load("atlas/0.36.0") +load("sp/2.5.0") +load("gsl-lite/0.37.0") +load("libjpeg/2.1.0") +load("krb5/1.20.1") +load("libtirpc/1.3.3") +load("hdf/4.2.15") +load("jedi-cmake/1.4.0") +load("libpng/1.6.37") +load("libxt/1.3.0") +load("libxmu/1.1.4") +load("libxpm/3.5.17") +load("libxaw/1.0.15") +load("udunits/2.2.28") +load("ncview/2.1.9") +load("netcdf-cxx4/4.3.1") +load("py-pybind11/2.11.0") +--load("crtm/v2.4_jedi") +load("contrib/0.1") +load("noaatools/3.1") +load("rocoto/1.3.7") + +load("hpc/1.2.0") +unload("python/3.10.13") +unload("py-numpy/1.22.3") +load("miniconda3/4.6.14") +load("gdasapp/1.0.0") +-- below is a hack because of cmake finding the wrong python... +setenv("CONDA_PREFIX", "/work2/noaa/da/python/opt/core/miniconda3/4.6.14/envs/gdasapp/") + +setenv("CC","mpicc") +setenv("FC","mpifort") +setenv("CXX","mpicxx") +local mpiexec = '/opt/slurm/bin/srun' +local mpinproc = '-n' +setenv('MPIEXEC_EXEC', mpiexec) +setenv('MPIEXEC_NPROC', mpinproc) + +setenv("CRTM_FIX","/work2/noaa/da/role-da/GDASApp/fix/crtm/2.4.0") +setenv("GDASAPP_TESTDATA","/work2/noaa/da/role-da/GDASApp/testdata") +setenv("GDASAPP_UNIT_TEST_DATA_PATH", "/work2/noaa/da/role-da/GDASApp/unittestdata") + +execute{cmd="ulimit -s unlimited",modeA={"load"}} + +whatis("Name: ".. pkgName) +whatis("Version: ".. pkgVersion) +whatis("Category: GDASApp") +whatis("Description: Load all libraries needed for GDASApp") From f1222ec37924d567a8d935f0cad1a6a705045e4e Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Wed, 23 Oct 2024 09:47:09 -0400 Subject: [PATCH 12/13] fix CI for aerosol DA (#1344) @RussTreadon-NOAA @KateFriedman-NOAA I think including this in the GDASApp hash in G-W should fix the aero CI (hopefully) --- parm/aero/obs/config/viirs_n20_aod.yaml.j2 | 2 +- parm/aero/obs/config/viirs_n21_aod.yaml.j2 | 2 +- parm/aero/obs/config/viirs_npp_aod.yaml.j2 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/parm/aero/obs/config/viirs_n20_aod.yaml.j2 b/parm/aero/obs/config/viirs_n20_aod.yaml.j2 index 7806a4cd0..43474ef6c 100644 --- a/parm/aero/obs/config/viirs_n20_aod.yaml.j2 +++ b/parm/aero/obs/config/viirs_n20_aod.yaml.j2 @@ -3,7 +3,7 @@ obsdatain: engine: type: H5File - obsfile: "{{ DATA }}/obs/{{ OPREFIX }}viirs_n20.{{ current_cycle | to_YMDH }}.nc4" + obsfile: "{{ DATA }}/obs/{{ OPREFIX }}viirs_n20_aod.tm00.nc" obsdataout: engine: type: H5File diff --git a/parm/aero/obs/config/viirs_n21_aod.yaml.j2 b/parm/aero/obs/config/viirs_n21_aod.yaml.j2 index 6450ad9ec..46d6d0d32 100644 --- a/parm/aero/obs/config/viirs_n21_aod.yaml.j2 +++ b/parm/aero/obs/config/viirs_n21_aod.yaml.j2 @@ -3,7 +3,7 @@ obsdatain: engine: type: H5File - obsfile: "{{ DATA }}/obs/{{ OPREFIX }}viirs_n21.{{ current_cycle | to_YMDH }}.nc4" + obsfile: "{{ DATA }}/obs/{{ OPREFIX }}viirs_n21_aod.tm00.nc" obsdataout: engine: type: H5File diff --git a/parm/aero/obs/config/viirs_npp_aod.yaml.j2 b/parm/aero/obs/config/viirs_npp_aod.yaml.j2 index 72efb740d..be6149b80 100644 --- a/parm/aero/obs/config/viirs_npp_aod.yaml.j2 +++ b/parm/aero/obs/config/viirs_npp_aod.yaml.j2 @@ -3,7 +3,7 @@ obsdatain: engine: type: H5File - obsfile: "{{ DATA }}/obs/{{ OPREFIX }}viirs_npp.{{ current_cycle | to_YMDH }}.nc4" + obsfile: "{{ DATA }}/obs/{{ OPREFIX }}viirs_npp_aod.tm00.nc" obsdataout: engine: type: H5File From 34f894ffc8ff15b1a43d537a0a1043670231e5a3 Mon Sep 17 00:00:00 2001 From: DavidNew-NOAA <134300700+DavidNew-NOAA@users.noreply.github.com> Date: Mon, 28 Oct 2024 09:33:18 -0400 Subject: [PATCH 13/13] Fix jjob testing in related to change if setup_expt.py (#1348) Resolves GDASApp issue [#1347](https://github.com/NOAA-EMC/GDASApp/issues/1347) jjob tests pass with this change now, but you have to revert ```test/atm/global-workflow/config.yaml``` to https://github.com/NOAA-EMC/GDASApp/commit/6fb0a655ffe61c6dd4f2acaa4c4490121ba980fb since jjob testing will not work without modification until Global Workflow PR [#2992](https://github.com/NOAA-EMC/global-workflow/pull/2992) is merged. --- test/atm/global-workflow/setup_workflow_exp.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/atm/global-workflow/setup_workflow_exp.sh b/test/atm/global-workflow/setup_workflow_exp.sh index d793733ae..47bb0d82e 100755 --- a/test/atm/global-workflow/setup_workflow_exp.sh +++ b/test/atm/global-workflow/setup_workflow_exp.sh @@ -10,7 +10,7 @@ idate=2021032312 edate=2021032318 app=ATM starttype='warm' -gfscyc='4' +interval='6' resdetatmos='48' resensatmos='48' nens=3 @@ -37,7 +37,7 @@ $srcdir/../../workflow/setup_expt.py gfs cycled --idate $idate \ --edate $edate \ --app $app \ --start $starttype \ - --gfs_cyc $gfscyc \ + --interval $interval \ --resdetatmos $resdetatmos \ --resensatmos $resensatmos \ --nens $nens \