diff --git a/src/bufr/BufrParser/Exports/Export.cpp b/src/bufr/BufrParser/Exports/Export.cpp index c08b0bc5c..72a5c83fe 100644 --- a/src/bufr/BufrParser/Exports/Export.cpp +++ b/src/bufr/BufrParser/Exports/Export.cpp @@ -16,6 +16,7 @@ #include "Splits/CategorySplit.h" #include "Variables/QueryVariable.h" #include "Variables/DatetimeVariable.h" +#include "Variables/AircraftAltitudeVariable.h" #include "Variables/TimeoffsetVariable.h" #include "Variables/Transforms/Transform.h" #include "Variables/Transforms/TransformBuilder.h" @@ -37,6 +38,7 @@ namespace const char* Timeoffset = "timeoffset"; const char* Query = "query"; const char* GroupByField = "group_by"; // Deprecated + const char* AircraftAltitude = "aircraftAltitude"; const char* Type = "type"; } // namespace Variable @@ -133,6 +135,11 @@ namespace Ingester auto dtconf = subConf.getSubConfiguration(ConfKeys::Variable::Datetime); variable = std::make_shared(key, groupByField, dtconf); } + else if (subConf.has(ConfKeys::Variable::AircraftAltitude)) + { + auto dtconf = subConf.getSubConfiguration(ConfKeys::Variable::AircraftAltitude); + variable = std::make_shared(key, groupByField, dtconf); + } else if (subConf.has(ConfKeys::Variable::Timeoffset)) { auto dtconf = subConf.getSubConfiguration(ConfKeys::Variable::Timeoffset); diff --git a/src/bufr/BufrParser/Exports/Variables/AircraftAltitudeVariable.cpp b/src/bufr/BufrParser/Exports/Variables/AircraftAltitudeVariable.cpp new file mode 100644 index 000000000..b4b86928e --- /dev/null +++ b/src/bufr/BufrParser/Exports/Variables/AircraftAltitudeVariable.cpp @@ -0,0 +1,208 @@ +/* + * (C) Copyright 2022 NOAA/NWS/NCEP/EMC + * + * This software is licensed under the terms of the Apache Licence Version 2.0 + * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + */ + +#include + +#include +#include +#include + +#include "eckit/exception/Exceptions.h" + +#include "DataObject.h" +#include "AircraftAltitudeVariable.h" + + +namespace +{ + namespace ConfKeys + { + const char* Pressure = "pressure"; + const char* AircraftIndicatedAltitude = "aircraftIndicatedAltitude"; + const char* PressureAltitudeRelativeToMeanSeaLevel = + "pressureAltitudeRelativeToMeanSeaLevel"; + const char* FlightLevel = "flightLevel"; + const char* Height = "height"; + const char* HeightOrAltitude = "heightOrAltitude"; + const char* FlightLevelST = "flightLevelST"; + } // namespace ConfKeys + + const std::vector FieldNames = {ConfKeys::Pressure, + ConfKeys::AircraftIndicatedAltitude, + ConfKeys::PressureAltitudeRelativeToMeanSeaLevel, + ConfKeys::FlightLevel, + ConfKeys::Height, + ConfKeys::HeightOrAltitude, + ConfKeys::FlightLevelST}; +} // namespace + + +namespace Ingester +{ + AircraftAltitudeVariable::AircraftAltitudeVariable(const std::string& exportName, + const std::string& groupByField, + const eckit::LocalConfiguration &conf) : + Variable(exportName), + groupByField_(groupByField), + conf_(conf) + { + initQueryMap(); + } + + std::shared_ptr AircraftAltitudeVariable::exportData(const BufrDataMap& map) + { + checkKeys(map); + + std::unordered_map> includedFieldMap; + std::vector includedFields; + + std::shared_ptr referenceObj = nullptr; + for (const auto& fieldName : FieldNames) + { + if (conf_.has(fieldName)) + { + includedFieldMap.insert({fieldName, map.at(getExportKey(fieldName))}); + includedFields.push_back(fieldName); + } + } + + referenceObj = (*includedFieldMap.begin()).second; + + // Validation: make sure the dimensions are consistent + auto path = referenceObj->getPath(); + for (const auto& fieldName : FieldNames) + { + if (includedFieldMap.find(fieldName) != includedFieldMap.end() && + includedFieldMap[fieldName]->getPath() != path) + { + std::ostringstream errStr; + errStr << "Inconsistent dimensions found in source data."; + throw eckit::BadParameter(errStr.str()); + } + } + + std::vector aircraftAlts; + aircraftAlts.resize(referenceObj->size(), DataObject::missingValue()); + + for (size_t idx = 0; idx < referenceObj->size(); idx++) + { + std::cout << "idx = " << idx << std::endl; + for (auto nameIt = includedFields.rbegin(); nameIt != includedFields.rend(); ++nameIt) + { + const auto& fieldName = *nameIt; + const auto& fieldValues = includedFieldMap.at(fieldName); + if (fieldName == ConfKeys::Pressure) + { + if (!fieldValues->isMissing(idx)) + { + auto value = fieldValues->getAsFloat(idx); + if (value < 22630.0f) + { + aircraftAlts[idx] = + 11000.0f - (std::log1p(value / 22630.0f) / 0.0001576106f); + std::cout << "section 1" << std::endl; + } + else + { + aircraftAlts[idx] = + (1.0f - powf((value / 101325.0f), + (1.0f / 5.256f))) * (288.15f / 0.0065f); + std::cout << "section 2" << std::endl; + } + } + else if (includedFieldMap.find(ConfKeys::AircraftIndicatedAltitude) + != includedFieldMap.end()) + { + if (!includedFieldMap[ConfKeys::AircraftIndicatedAltitude]->isMissing(idx)) + { + aircraftAlts[idx] = + includedFieldMap[ConfKeys::AircraftIndicatedAltitude]->getAsFloat(idx); + std::cout << "section 3" << std::endl; + } + } + } + else if (fieldName == ConfKeys::AircraftIndicatedAltitude) + { + // This variable is only used in conjunction with pressure. + continue; + std::cout << "section 4" << std::endl; + } + else if (!fieldValues->isMissing(idx)) + { + std::cout << " fieldValues = " << fieldValues << std::endl; + aircraftAlts[idx] = fieldValues->getAsFloat(idx); + std::cout << "section 5" << std::endl; + } + } + std::cout << "AA = " << aircraftAlts[idx] << std::endl; + } + + return std::make_shared>(aircraftAlts, + getExportName(), + groupByField_, + referenceObj->getDims(), + referenceObj->getPath(), + referenceObj->getDimPaths()); + } + + void AircraftAltitudeVariable::checkKeys(const BufrDataMap& map) + { + std::vector requiredKeys; + for (const auto& fieldName : FieldNames) + { + if (conf_.has(fieldName)) + { + requiredKeys.push_back(getExportKey(fieldName)); + } + } + + std::stringstream errStr; + errStr << "Query "; + + bool isKeyMissing = false; + for (const auto& key : requiredKeys) + { + if (map.find(key) == map.end()) + { + isKeyMissing = true; + errStr << key; + break; + } + } + + errStr << " could not be found during export of AircraftAltitude object."; + + if (isKeyMissing) + { + throw eckit::BadParameter(errStr.str()); + } + } + + QueryList AircraftAltitudeVariable::makeQueryList() const + { + auto queries = QueryList(); + + for (const auto& fieldName : FieldNames) + { + if (conf_.has(fieldName)) + { + QueryInfo info; + info.name = getExportKey(fieldName); + info.query = conf_.getString(fieldName); + info.groupByField = groupByField_; + queries.push_back(info); + } + } + + return queries; + } + + std::string AircraftAltitudeVariable::getExportKey(const std::string& name) const + { + return getExportName() + "_" + name; + } +} // namespace Ingester diff --git a/src/bufr/BufrParser/Exports/Variables/AircraftAltitudeVariable.h b/src/bufr/BufrParser/Exports/Variables/AircraftAltitudeVariable.h new file mode 100644 index 000000000..cf4fb47b9 --- /dev/null +++ b/src/bufr/BufrParser/Exports/Variables/AircraftAltitudeVariable.h @@ -0,0 +1,52 @@ +/* + * (C) Copyright 2022 NOAA/NWS/NCEP/EMC + * + * This software is licensed under the terms of the Apache Licence Version 2.0 + * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. + */ + +#pragma once + +#include +#include +#include + +#include "eckit/config/LocalConfiguration.h" + +#include "Variable.h" + + +namespace Ingester +{ + /// \brief Exports parsed data as aircraftAltitudes using specified Mnemonics + class AircraftAltitudeVariable final : public Variable + { + public: + AircraftAltitudeVariable() = delete; + AircraftAltitudeVariable(const std::string& exportName, + const std::string& groupByField, + const eckit::LocalConfiguration& conf); + + ~AircraftAltitudeVariable() final = default; + + /// \brief Get the configured mnemonics and turn them into AircraftAltitude + /// \param map BufrDataMap that contains the parsed data for each mnemonic + std::shared_ptr exportData(const BufrDataMap& map) final; + + /// \brief Get a list of queries for this variable + QueryList makeQueryList() const final; + + private: + /// \brief For field + std::string groupByField_; + + /// \brief The configuration + const eckit::LocalConfiguration conf_; + + /// \brief makes sure the bufr data map has all the required keys. + void checkKeys(const BufrDataMap& map); + + /// \brief get the export key string + std::string getExportKey(const std::string& name) const; + }; +} // namespace Ingester diff --git a/src/bufr/CMakeLists.txt b/src/bufr/CMakeLists.txt index 6af627aaf..3a9ad3f8a 100644 --- a/src/bufr/CMakeLists.txt +++ b/src/bufr/CMakeLists.txt @@ -27,6 +27,8 @@ list(APPEND _ingester_srcs BufrParser/Exports/Variables/Variable.h BufrParser/Exports/Variables/DatetimeVariable.h BufrParser/Exports/Variables/DatetimeVariable.cpp + BufrParser/Exports/Variables/AircraftAltitudeVariable.h + BufrParser/Exports/Variables/AircraftAltitudeVariable.cpp BufrParser/Exports/Variables/TimeoffsetVariable.h BufrParser/Exports/Variables/TimeoffsetVariable.cpp BufrParser/Exports/Variables/QueryVariable.h diff --git a/src/bufr/DataObject.h b/src/bufr/DataObject.h index 6c575bb75..133ddbcd4 100644 --- a/src/bufr/DataObject.h +++ b/src/bufr/DataObject.h @@ -110,6 +110,10 @@ namespace Ingester /// \return Float data. virtual float getAsFloat(const Location& loc) const = 0; + /// \brief Is the element at the location the missing value. + /// \return bool data. + virtual bool isMissing(const Location& loc) const = 0; + /// \brief Get the data at the index as an int. /// \return Int data. virtual int getAsInt(size_t idx) const = 0; @@ -338,6 +342,14 @@ namespace Ingester /// \return String data. std::string getAsString(const Location& loc) const final { return _getAsString(loc); } + /// \brief Is the element at the location the missing value. + /// \param loc The coordinate for the data point (ex: if data 2d then loc {2,4} gets data + /// at that coordinate). + /// \return bool data. + bool isMissing(const Location& loc) const final + { + return get(loc) == missingValue(); + } /// \brief Get the data at the index into the internal 1d array as a int. This function /// gives you direct access to the internal data and doesn't account for dimensional diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index da0dfc5da..32f316dc3 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -185,6 +185,9 @@ if( iodaconv_bufr_ENABLED ) testinput/gdas.t12z.adpsfc.prepbufr testinput/gdas.t06z.adpsfc.tm00.bufr_d testinput/gdas.t12z.adpsfc.tm00.bufr_d + testinput/gdas.t12z.aircar.tm00.bufr_d + testinput/gdas.t12z.aircft.tm00.bufr_d + testinput/gdas.t12z.acft_profiles.prepbufr testinput/bufr_ncep_snow_adpsfc.yaml testinput/bufr_read_2_dim_blocks.yaml testinput/bufr_ncep_1bamua.yaml @@ -193,6 +196,10 @@ if( iodaconv_bufr_ENABLED ) testinput/bufr_ncep_esamua.yaml testinput/bufr_ncep_esmhs.yaml testinput/bufr_ncep_satwind_avhrr.yaml + testinput/bufr_ncep_aircar.yaml + testinput/bufr_ncep_aircft_AMDAR103.yaml + testinput/bufr_ncep_aircft_noAMDAR103.yaml + testinput/bufr_ncep_prepbufr_aircft.yaml testinput/bufr_read_wmo_radiosonde.yaml testinput/bufr_satwnd_old_format.yaml testinput/bufr_satwnd_new_format.yaml @@ -245,6 +252,10 @@ if( iodaconv_bufr_ENABLED ) testoutput/gdas.t12z.adpsfc.prepbufr.nc testoutput/gdas.t12z.adpsfc.tm00.nc testoutput/gdas.t06z.adpsfc_snow.tm00.nc + testoutput/gdas.t12z.aircar.tm00.nc + testoutput/gdas.t12z.aircft_AMDAR103.tm00.nc + testoutput/gdas.t12z.aircft_noAMDAR103.tm00.nc + testoutput/gdas.t12z.acft_profiles.prepbufr.nc testoutput/gdas.t00z.sevcsr.tm00.nc testoutput/bufr_read_2_dim_blocks.nc testoutput/bufr_read_wmo_radiosonde.nc @@ -1204,6 +1215,42 @@ if(iodaconv_bufr_ENABLED) gdas.t06z.adpsfc_snow.tm00.nc ${IODA_CONV_COMP_TOL_ZERO} DEPENDS bufr2ioda.x ) + ecbuild_add_test( TARGET test_iodaconv_bufr_ncep_aircar2ioda + TYPE SCRIPT + COMMAND bash + ARGS ${CMAKE_BINARY_DIR}/bin/iodaconv_comp.sh + netcdf + "${CMAKE_BINARY_DIR}/bin/bufr2ioda.x testinput/bufr_ncep_aircar.yaml" + gdas.t12z.aircar.tm00.nc ${IODA_CONV_COMP_TOL_ZERO} + DEPENDS bufr2ioda.x ) + + ecbuild_add_test( TARGET test_iodaconv_bufr_ncep_aircft_noamdar2ioda + TYPE SCRIPT + COMMAND bash + ARGS ${CMAKE_BINARY_DIR}/bin/iodaconv_comp.sh + netcdf + "${CMAKE_BINARY_DIR}/bin/bufr2ioda.x testinput/bufr_ncep_aircft_noAMDAR103.yaml" + gdas.t12z.aircft_noAMDAR103.tm00.nc ${IODA_CONV_COMP_TOL_ZERO} + DEPENDS bufr2ioda.x ) + + ecbuild_add_test( TARGET test_iodaconv_bufr_ncep_aircft_amdar2ioda + TYPE SCRIPT + COMMAND bash + ARGS ${CMAKE_BINARY_DIR}/bin/iodaconv_comp.sh + netcdf + "${CMAKE_BINARY_DIR}/bin/bufr2ioda.x testinput/bufr_ncep_aircft_AMDAR103.yaml" + gdas.t12z.aircft_AMDAR103.tm00.nc ${IODA_CONV_COMP_TOL_ZERO} + DEPENDS bufr2ioda.x ) + + ecbuild_add_test( TARGET test_iodaconv_prepbufr_ncep_aircftprofiles2ioda + TYPE SCRIPT + COMMAND bash + ARGS ${CMAKE_BINARY_DIR}/bin/iodaconv_comp.sh + netcdf + "${CMAKE_BINARY_DIR}/bin/bufr2ioda.x testinput/bufr_ncep_prepbufr_aircft.yaml" + gdas.t12z.acft_profiles.prepbufr.nc ${IODA_CONV_COMP_TOL_ZERO} + DEPENDS bufr2ioda.x ) + ecbuild_add_test( TARGET test_iodaconv_bufr_read_2_dim_blocks TYPE SCRIPT diff --git a/test/testinput/acft_profiles.data_thinned b/test/testinput/acft_profiles.data_thinned deleted file mode 100644 index 212cc030a..000000000 Binary files a/test/testinput/acft_profiles.data_thinned and /dev/null differ diff --git a/test/testinput/bufr_ncep_aircar.yaml b/test/testinput/bufr_ncep_aircar.yaml new file mode 100644 index 000000000..b64d6570c --- /dev/null +++ b/test/testinput/bufr_ncep_aircar.yaml @@ -0,0 +1,143 @@ +# (C) Copyright 2022 NOAA/NWS/NCEP/EMC +# # +# # This software is licensed under the terms of the Apache Licence Version 2.0 +# # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +observations: + - obs space: + name: bufr + + obsdatain: "testinput/gdas.t12z.aircar.tm00.bufr_d" + + exports: + subsets: + - NC004004 + + # MetaData + variables: + timestamp: + datetime: + year: "*/YEAR" + month: "*/MNTH" + day: "*/DAYS" + hour: "*/HOUR" + minute: "*/MINU" + second: "*/SECO" + longitude: + query: "*/CLON" + latitude: + query: "*/CLAT" + + aircraftIdentifier: + query: "*/ACRN" + aircraftFlightPhase: + query: "*/POAF" + + aircraftAltitude: + aircraftAltitude: + pressure: "*/PRLC" + aircraftIndicatedAltitude: "*/IALT" + + + #ObsValue + airTemperature: + query: "*/TMDB" + relativeHumidity: + query: "*/ACMST2/REHU" + type: float + transforms: + - scale: .01 + waterVaporMixingRatio: + query: "*/ACMST2/MIXR" + windDirection: + query: "*/WDIR" + type: float + windSpeed: + query: "*/WSPD" + + #Quality Marker + airTemperatureQM: + query: "*/QMAT" + waterVaporMixingRatioQM: + query: "*/ACMST2/QMDD" + windQM: + query: "*/QMWN" + + ioda: + backend: netcdf + obsdataout: "testrun/gdas.t12z.aircar.tm00.nc" + + variables: + #MetaData + - name: "MetaData/dateTime" + source: variables/timestamp + longName: "Datetime" + units: "seconds since 1970-01-01T00:00:00Z" + + - name: "MetaData/latitude" + source: variables/latitude + longName: "Latitude" + units: "degree_north" + range: [-90, 90] + + - name: "MetaData/longitude" + source: variables/longitude + longName: "Longitude" + units: "degree_east" + range: [-180, 180] + + - name: "MetaData/aircraftIdentifier" + source: variables/aircraftIdentifier + longName: "Aircraft Identifier" + + - name: "MetaData/aircraftFlightPhase" + source: variables/aircraftFlightPhase + longName: "Aircraft Flight Phase" + + - name: "MetaData/aircraftAltitude" + source: variables/aircraftAltitude + longName: "Aircraft Altitude" + units: "m" + + #ObsValue + - name: "ObsValue/airTemperature" + source: variables/airTemperature + longName: "Air Temperature" + units: "K" + + - name: "ObsValue/relativeHumidity" + source: variables/relativeHumidity + longName: "Relative Humidity" + units: "1" + + - name: "ObsValue/waterVaporMixingRatio" + source: variables/waterVaporMixingRatio + longName: "Water Vapor Mixing Ratio" + units: "kg kg-1" + + - name: "ObsValue/windDirection" + source: variables/windDirection + longName: "Wind Direction" + units: "degree" + + - name: "ObsValue/windSpeed" + source: variables/windSpeed + longName: "Wind Speed" + units: "m s-1" + + #QualityMarker + - name: "QualityMarker/airTemperature" + source: variables/airTemperatureQM + longName: "Quality Indicator for Atmospheric Temperature" + + - name: "QualityMarker/waterVaporMixingRatio" + source: variables/waterVaporMixingRatioQM + longName: "Quality Indicator for Water Vapor Mixing Ratio" + + - name: "QualityMarker/windSpeed" + source: variables/windQM + longName: "Quality Indicator for Wind Speed" + + - name: "QualityMarker/windDirection" + source: variables/windQM + longName: "Quality Indicator for Wind Direction" diff --git a/test/testinput/bufr_ncep_aircft_AMDAR103.yaml b/test/testinput/bufr_ncep_aircft_AMDAR103.yaml new file mode 100644 index 000000000..e48040922 --- /dev/null +++ b/test/testinput/bufr_ncep_aircft_AMDAR103.yaml @@ -0,0 +1,146 @@ +# (C) Copyright 2022 NOAA/NWS/NCEP/EMC +# # # +# # # This software is licensed under the terms of the Apache Licence Version 2.0 +# # # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +observations: + - obs space: + name: bufr + + obsdatain: "testinput/gdas.t12z.aircft.tm00.bufr_d" + + exports: + subsets: + - NC004103 + + group_by_variable: latitudeSeq + #MetaData + variables: + timestamp: + datetime: + year: "*/YEAR" + month: "*/MNTH" + day: "*/DAYS" + hour: "*/HOUR" + minute: "*/MINU" + latitude: + query: "*/CLATH" + longitude: + query: "*/CLONH" + latitudeSeq: + query: "*/ADRBLSEQ/CLATH" + + aircraftFlightNumber: + query: "*/ACID" + aircraftNavigationalSystem: + query: "*/ACNS" + aircraftIdentifier: + query: "*/ACRN" + aircraftAltitude: + aircraftAltitude: + flightLevelST: "*/ADRBLSEQ/FLVLST" + + #ObsValue + airTemperature: + query: "*/ADRBLSEQ/TMDB" + dewpointTemperature: + query: "*/ADRBLSEQ/TMDP" + waterVaporMixingRatio: + query: "*/ADRBLSEQ/MIXR" + windDirection: + query: "*/ADRBLSEQ/WDIR" + type: float + windSpeed: + query: "*/ADRBLSEQ/WSPD" + + #QualityMarker + airTemperatureQM: + query: "*/QMAT" + relativeHumidityQM: + query: "*/QMDD" + windQM: + query: "*/QMWN" + + ioda: + backend: netcdf + obsdataout: "testrun/gdas.t12z.aircft_AMDAR103.tm00.nc" + + variables: + # MetaData + - name: "MetaData/dateTime" + source: variables/timestamp + longName: "Datetime" + units: "seconds since 1970-01-01T00:00:00Z" + + - name: "MetaData/latitude" + source: variables/latitude + longName: "Latitude" + units: "degree_north" + range: [-90, 90] + + - name: "MetaData/longitude" + source: variables/longitude + longName: "Longitude" + units: "degree_east" + range: [-180, 180] + + - name: "MetaData/aircraftFlightNumber" + source: variables/aircraftFlightNumber + longName: "Aircraft Flight Number" + + - name: "MetaData/aircraftNavigationalSystem" + source: variables/aircraftNavigationalSystem + longName: "Aircraft Navigational System" + + - name: "MetaData/aircraftIdentifier" + source: variables/aircraftIdentifier + longName: "Aircraft Identifier (Station Identification)" + + - name: "MetaData/aircraftAltitude" + source: variables/aircraftAltitude + longName: "Aircraft Altitude" + units: "m" + + # ObsValue + - name: "ObsValue/airTemperature" + source: variables/airTemperature + longName: "Air Temperature" + units: "K" + + - name: "ObsValue/dewpointTemperature" + source: variables/dewpointTemperature + longName: "Dewpoint Temperature" + units: "K" + + - name: "ObsValue/waterVaporMixingRatio" + source: variables/waterVaporMixingRatio + longName: "Water Vapor Mixing Ratio" + units: "kg kg-1" + + - name: "ObsValue/windDirection" + source: variables/windDirection + longName: "Wind Direction" + units: "degree" + + - name: "ObsValue/windSpeed" + source: variables/windSpeed + longName: "Wind Speed" + units: "m s-1" + + # QualityMarker + - name: "QualityMarker/airTemperature" + source: variables/airTemperatureQM + longName: "Quality Indicator for Atmospheric Temperature" + + - name: "QualityMarker/relativeHumidity" + source: variables/relativeHumidityQM + longName: "Quality Indicator for Relative Humidity" + + - name: "QualityMarker/windSpeed" + source: variables/windQM + longName: "Quality Indicator for Wind Speed" + + - name: "QualityMarker/windDirection" + source: variables/windQM + longName: "Quality Indicator for Wind Direction" + diff --git a/test/testinput/bufr_ncep_aircft_noAMDAR103.yaml b/test/testinput/bufr_ncep_aircft_noAMDAR103.yaml new file mode 100644 index 000000000..07f7075d4 --- /dev/null +++ b/test/testinput/bufr_ncep_aircft_noAMDAR103.yaml @@ -0,0 +1,239 @@ +# (C) Copyright 2022 NOAA/NWS/NCEP/EMC +# # # +# # # This software is licensed under the terms of the Apache Licence Version 2.0 +# # # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +observations: + - obs space: + name: bufr + + obsdatain: "testinput/gdas.t12z.aircft.tm00.bufr_d" + + exports: + subsets: + - NC004001 + - NC004002 + - NC004003 + - NC004006 + - NC004009 + - NC004010 + - NC004011 + + #MetaData + variables: + timestamp: + datetime: + year: "*/YEAR" + month: "*/MNTH" + day: "*/DAYS" + hour: "*/HOUR" + minute: "*/MINU" + latitude: + query: "[*/CLATH, */CLAT]" + longitude: + query: "[*/CLON, */CLONH]" + + aircraftFlightNumber: + query: "*/ACID" + aircraftNavigationalSystem: + query: "*/ACNS" + commercialAircraftType: + query: "*/ACTP" + aircraftFlightPhase: + query: "*/POAF" + aircraftIdentifier: + query: "[*/RPID, */ACRN]" + + dataProviderRestricted: + query: "*/RSRD" + dataRestrictedExpiration: + query: "*/EXPRSRD" + dataReceiptTimeHour: + query: "*/RCHR" + dataReceiptTimeMinute: + query: "*/RCMI" + dataReceiptTimeSignificance: + query: "*/RCTS" + + aircraftAltitude: + aircraftAltitude: + flightLevel: "[*/FLVL]" + flightLevelST: "[*/FLVLST]" + height: "[*/HEIT]" + heightOrAltitude: "[*/HMSL]" + pressureAltitudeRelativeToMeanSeaLevel: "[*/PSAL]" + + percentConfidenceRH: + query: "*/PCCF" + type: int + + #ObsValue + airTemperature: + query: "[*/TMDB, */TMDBST]" + relativeHumidity: + query: "[*/AFMST/REHU, */ACMST2/REHU, */RAWHU]" + type: float + transforms: + - scale: .01 + waterVaporMixingRatio: + query: "[*/ACMST2/MIXR, */MIXR]" + windDirection: + query: "*/WDIR" + type: float + windSpeed: + query: "*/WSPD" + + #QualityInformation + airTemperatureQualityInformation: + query: "*/QMRKH[2]" + windDirectionQualityInformation: + query: "*/QMRKH[3]" + windSpeedQualityInformation: + query: "*/QMRKH[4]" + + #QualityMarker + airTemperatureQM: + query: "*/QMAT" + relativeHumidityQM: + query: "[NC004010/QMDD, NC004003/AFMST/QMDD]" + waterVaporMixingRatioQM: + query: "NC004006/QMDD" + windQM: + query: "*/QMWN" + + ioda: + backend: netcdf + obsdataout: "testrun/gdas.t12z.aircft_noAMDAR103.tm00.nc" + + #MetaData + variables: + - name: "MetaData/dateTime" + source: variables/timestamp + longName: "Datetime" + units: "seconds since 1970-01-01T00:00:00Z" + + - name: "MetaData/latitude" + source: variables/latitude + longName: "Latitude" + units: "degree_north" + range: [-90, 90] + + - name: "MetaData/longitude" + source: variables/longitude + longName: "Longitude" + units: "degree_east" + range: [-180, 180] + + - name: "MetaData/aircraftFlightNumber" + source: variables/aircraftFlightNumber + longName: "Aircraft Flight Number" + + - name: "MetaData/aircraftNavigationalSystem" + source: variables/aircraftNavigationalSystem + longName: "Aircraft Navigational System" + + - name: "MetaData/commercialAircraftType" + source: variables/commercialAircraftType + longName: "Commercial Aircraft Type" + + - name: "MetaData/aircraftFlightPhase" + source: variables/aircraftFlightPhase + longName: "Aircraft Flight Phase" + + - name: "MetaData/aircraftIdentifier" + source: variables/aircraftIdentifier + longName: "Aircraft Identifier (Station Identification)" + + - name: "MetaData/dataProviderRestricted" + source: variables/dataProviderRestricted + longName: "Data Provider Restricted" + + - name: "MetaData/dataRestrictedExpiration" + source: variables/dataRestrictedExpiration + longName: "Restricted Data Expiration" + units: "Hour" + + - name: "MetaData/dataReceiptTimeHour" + source: variables/dataReceiptTimeHour + longName: "Receipt Time (Hour)" + units: "Hour" + + - name: "MetaData/dataReceiptTimeMinute" + source: variables/dataReceiptTimeMinute + longName: "Data Receipt Time (Minute)" + units: "Minute" + + - name: "MetaData/dataReceiptTimeSignificance" + source: variables/dataReceiptTimeSignificance + longName: "Data Receipt Time Significance" + + - name: "MetaData/aircraftAltitude" + source: variables/aircraftAltitude + longName: "Aircraft Altitude" + units: "m" + + - name: "MetaData/relativeHumidityPercentConfidence" + source: variables/percentConfidenceRH + longName: "Percent Confidence of Relative Humidity Quality" + units: "percent" + + # ObsValue + - name: "ObsValue/airTemperature" + source: variables/airTemperature + longName: "Air Temperature" + units: "K" + + - name: "ObsValue/relativeHumidity" + source: variables/relativeHumidity + longName: "Relative Humidity" + units: "1" + + - name: "ObsValue/waterVaporMixingRatio" + source: variables/waterVaporMixingRatio + longName: "Water Vapor Mixing Ratio" + units: "kg kg-1" + + - name: "ObsValue/windDirection" + source: variables/windDirection + longName: "Wind Direction" + units: "degree" + + - name: "ObsValue/windSpeed" + source: variables/windSpeed + longName: "Wind Speed" + units: "m s-1" + + # QualityInformation + - name: "QualityInformation/airTemperature" + source: variables/airTemperatureQualityInformation + longName: "Air Temperature Quality Information" + + - name: "QualityInformation/windDirection" + source: variables/windDirectionQualityInformation + longName: "Wind Direction Quality Information" + + - name: "QualityInformation/windSpeed" + source: variables/windSpeedQualityInformation + longName: "Wind Speed Quality Information" + + #QualityMarker + - name: "QualityMarker/airTemperature" + source: variables/airTemperatureQM + longName: "Quality Indicator for Atmospheric Temperature" + + - name: "QualityMarker/relativeHumidity" + source: variables/relativeHumidityQM + longName: "Quality Indicator for Relative Humidity" + + - name: "QualityMarker/waterVaporMixingRatio" + source: variables/waterVaporMixingRatioQM + longName: "Quality Indicator for Water Vapor Mixing Ratio" + + - name: "QualityMarker/windSpeed" + source: variables/windQM + longName: "Quality Indicator for Wind Speed" + + - name: "QualityMarker/windDirection" + source: variables/windQM + longName: "Quality Indicator for Wind Direction" + diff --git a/test/testinput/aircftpro_prepbufr.yaml b/test/testinput/bufr_ncep_prepbufr_aircft.yaml similarity index 52% rename from test/testinput/aircftpro_prepbufr.yaml rename to test/testinput/bufr_ncep_prepbufr_aircft.yaml index e83848106..eba454c48 100644 --- a/test/testinput/aircftpro_prepbufr.yaml +++ b/test/testinput/bufr_ncep_prepbufr_aircft.yaml @@ -1,19 +1,28 @@ -# (C) Copyright 2020 NOAA/NWS/NCEP/EMC -# -# This software is licensed under the terms of the Apache Licence Version 2.0 -# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# (C) Copyright 2022 NOAA/NWS/NCEP/EMC +# # +# # This software is licensed under the terms of the Apache Licence Version 2.0 +# # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. observations: - obs space: name: bufr - obsdatain: "./acft_profiles.data_thinned" + obsdatain: "./testinput/gdas.t12z.acft_profiles.prepbufr" exports: + group_by: prepbufrDataLevelCategory variables: - stationIdentification: + + #MetaData + longitude: + query: "*/PRSLEVLA/DRFTINFO/XDR" + latitude: + query: "*/PRSLEVLA/DRFTINFO/YDR" + aircraftIdentifier: query: "*/SID" - prepbufrDataLvlCat: + aircraftFlightNumber: + query: "[*/ACID, */ACID_SEQ/ACID]" + prepbufrDataLevelCategory: query: "*/PRSLEVLA/CAT" prepbufrReportType: query: "*/TYP" @@ -21,129 +30,126 @@ observations: query: "*/T29" obsTimeMinusCycleTime: query: "*/DHR" -# presentWeather: -# query: "*/PRSLEVLA/PREWXSEQ/PRWE" - longitude: - query: "*/XOB" - latitude: - query: "*/YOB" - group_by: longitude - stationElevation: - query: "*/ELV" - - latitudeProfileLevel: - query: "*/PRSLEVLA/DRFTINFO/YDR" - group_by: longitude - longitudeProfileLevel: - query: "*/PRSLEVLA/DRFTINFO/XDR" - group_by: longitude timeProfileLevel: query: "*/PRSLEVLA/DRFTINFO/HRDR" - group_by: longitude - instantaneousAltitudeRate: - query: "*/PRSLEVLA/IALR" - group_by: longitude aircraftPhase: query: "*/PRSLEVLA/ACFT_SEQ/POAF" - group_by: longitude - - height: + stationElevation: + query: "*/ELV" + type: float + aircraftFlightLevel: query: "*/PRSLEVLA/Z___INFO/Z__EVENT/ZOB" - group_by: longitude + instantaneousAltitudeRate: + query: "*/PRSLEVLA/IALR" + + + #ObsValue pressure: query: "*/PRSLEVLA/P___INFO/P__EVENT/POB" transforms: - scale: 100 - group_by: longitude - pressureError: - query: "*/PRSLEVLA/P___INFO/P__BACKG/POE" - transforms: - - scale: 100 - group_by: longitude airTemperature: query: "*/PRSLEVLA/T___INFO/T__EVENT/TOB" transforms: - offset: 273.15 - group_by: longitude - airTemperatureError: - query: "*/PRSLEVLA/T___INFO/T__BACKG/TOE" - group_by: longitude dewpointTemperature: query: "*/PRSLEVLA/Q___INFO/TDO" - transforms: + transforms: - offset: 273.15 - group_by: longitude specificHumidity: query: "*/PRSLEVLA/Q___INFO/Q__EVENT/QOB" + type: float transforms: - scale: 0.000001 - group_by: longitude -# relativeHumidityError: -# query: "*/PRSLEVLA/Q___INFO/Q__EVENT/QOE" - -# cloudAmount: -# query: "*/PRSLEVLA/CLOUDSEQ/CLAM" -# heightOfBaseOfCloud: -# query: "*/PRSLEVLA/CLOUDSEQ/HOCB" - windEastward: query: "*/PRSLEVLA/W___INFO/W__EVENT/UOB" - group_by: longitude windNorthward: query: "*/PRSLEVLA/W___INFO/W__EVENT/VOB" - group_by: longitude - windError: - query: "*/PRSLEVLA/W___INFO/W__BACKG/WOE" - group_by: longitude + #QualityMarker heightQM: query: "*/PRSLEVLA/Z___INFO/Z__EVENT/ZQM" - group_by: longitude pressureQM: query: "*/PRSLEVLA/P___INFO/P__EVENT/PQM" - group_by: longitude airTemperatureQM: query: "*/PRSLEVLA/T___INFO/T__EVENT/TQM" - group_by: longitude specificHumidityQM: query: "*/PRSLEVLA/Q___INFO/Q__EVENT/QQM" - group_by: longitude -# verticalSignificanceSurfaceObservations: -# query: "*/PRSLEVLA/CLOUDSEQ/VSSO" -# group_by: longitude windQM: query: "*/PRSLEVLA/W___INFO/W__EVENT/WQM" - group_by: longitude + + #ObsError + pressureError: + query: "*/PRSLEVLA/P___INFO/P__BACKG/POE" + transforms: + - scale: 100 + airTemperatureError: + query: "*/PRSLEVLA/T___INFO/T__BACKG/TOE" + relativeHumidityError: + query: "*/PRSLEVLA/Q___INFO/Q__BACKG/QOE" + type: float + transforms: + - scale: 0.1 + windError: + query: "*/PRSLEVLA/W___INFO/W__BACKG/WOE" ioda: backend: netcdf - obsdataout: "../testoutput/aircraft_prepbufr_acftprofiles.nc" + obsdataout: "testrun/gdas.t12z.acft_profiles.prepbufr.nc" + + dimensions: + - name: PressureEvent + path: "*/PRSLEVLA/P___INFO/P__EVENT" + - name: TemperatureEvent + path: "*/PRSLEVLA/T___INFO/T__EVENT" + - name: HumidityEvent + path: "*/PRSLEVLA/Q___INFO/Q__EVENT" + - name: HeightEvent + path: "*/PRSLEVLA/Z___INFO/Z__EVENT" + - name: WindEvent + path: "*/PRSLEVLA/W___INFO/W__EVENT" + variables: + #MetaData + - name: "MetaData/latitude" + coordinates: "longitude latitude" + source: variables/latitude + longName: "Latitude" + units: "degree_north" + range: [-90, 90] + + - name: "MetaData/longitude" + coordinates: "longitude latitude" + source: variables/longitude + longName: "Longitude" + units: "degree_east" + range: [0, 360] - - name: "MetaData/stationIdentification" + - name: "MetaData/aircraftIdentifier" coordinates: "longitude latitude" - source: variables/stationIdentification + source: variables/aircraftIdentifier longName: "Station ID" - units: "(8)CCITT IA5" - - name: "MetaData/prepbufrDataLvlCat" + - name: "MetaData/aircraftFlightNumber" + coordinates: "longitude latitude" + source: variables/aircraftFlightNumber + longName: "Aircraft Flight Number" + + - name: "MetaData/prepbufrDataLevelCategory" coordinates: "longitude latitude" - source: variables/prepbufrDataLvlCat + source: variables/prepbufrDataLevelCategory longName: "Prepbufr Data Level Category" - units: "CODE TABLE" - name: "MetaData/prepbufrReportType" coordinates: "longitude latitude" source: variables/prepbufrReportType longName: "Prepbufr Report Type" - units: "CODE TABLE" - name: "MetaData/dumpReportType" coordinates: "longitude latitude" source: variables/dumpReportType longName: "Data Dump Report Type" - units: "CODE TABLE" - name: "MetaData/obsTimeMinusCycleTime" coordinates: "longitude latitude" @@ -151,177 +157,131 @@ observations: longName: "Observation Time Minus Cycle Time" units: "Hour" -# - name: "ObsValue/presentWeather" -# coordinates: "longitude latitude" -# source: variables/presentWeather -# longName: "Present weather" -# units: "CODE TABLE" - - - name: "MetaData/latitude" + - name: "MetaData/timeProfileLevel" coordinates: "longitude latitude" - source: variables/latitude - longName: "Latitude" - units: "degrees_north" - range: [-90, 90] + source: variables/timeProfileLevel + longName: "Time Profile Level" + units: "Hour" - - name: "MetaData/longitude" + - name: "MetaData/aircraftFlightPhase" coordinates: "longitude latitude" - source: variables/longitude - longName: "Longitude" - units: "degrees_east" - range: [0, 360] -# range: [-180, 180] + source: variables/aircraftPhase + longName: "Aircraft Flight Phase" - - name: "ObsValue/stationElevation" + - name: "MetaData/stationElevation" coordinates: "longitude latitude" source: variables/stationElevation longName: "Height of Station" - units: "Meter" + units: "m" - - name: "MetaData/latitudeProfileLevel" + - name: "MetaData/aircraftFlightLevel" coordinates: "longitude latitude" - source: variables/latitudeProfileLevel - longName: "Profile Level Latitude (for ROAB/PIBAL) based on balloon drift" - units: "degrees_north" + source: variables/aircraftFlightLevel + longName: "Aircraft Flight Level" + units: "m" - - name: "MetaData/longitudeProfileLevel" - coordinates: "longitude latitude" - source: variables/longitudeProfileLevel - longName: "Profile Level Longitude (for ROAB/PIBAL) based on balloon drift" - units: "degrees_east" - - - name: "MetaData/timeProfileLevel" - coordinates: "longitude latitude" - source: variables/timeProfileLevel - longName: "Time Profile Level" - units: "Hour" - - - name: "ObsValue/instantaneousAltitudeRate" + - name: "MetaData/instantaneousAltitudeRate" coordinates: "longitude latitude" source: variables/instantaneousAltitudeRate longName: "Instantaneous Rate Altitue" - units: "Meter Second-1" - - - name: "MetaData/aircraftPhase" - coordinates: "longitude latitude" - source: variables/aircraftPhase - longName: "Phase of Aircraft Flight" - units: "CODE TABLE" - - - name: "ObsValue/height" - coordinates: "longitude latitude" - source: variables/height - longName: "Height of Observation" - units: "Meter" + units: "m s-1" + #ObsValue - name: "ObsValue/pressure" coordinates: "longitude latitude" source: variables/pressure longName: "Pressure" - units: "Pascals" - range: [20000, 110000] - - - name: "ObsValue/pressureError" - coordinates: "longitude latitude" - source: variables/pressureError - longName: "Pressure Error" - units: "Pascals" + units: "Pa" - name: "ObsValue/airTemperature" coordinates: "longitude latitude" source: variables/airTemperature longName: "Temperature" - units: "Kelvin" - range: [193, 325] - - - name: "ObsValue/airTemperatureError" - coordinates: "longitude latitude" - source: variables/airTemperatureError - longName: "Temperature Error" - units: "Kelvin" + units: "K" - name: "ObsValue/dewpointTemperature" coordinates: "longitude latitude" source: variables/dewpointTemperature longName: "Dew Point Temperature" - units: "Kelvin" - range: [193, 325] + units: "K" - name: "ObsValue/specificHumidity" coordinates: "longitude latitude" source: variables/specificHumidity longName: "Specific Humidity" - units: "Kilogram Kilogram-1" - -# - name: "ObsValue/relativeHumidityError" -# coordinates: "longitude latitude" -# source: variables/relativeHumidityError -# longName: "Relative Humidity Error" -# units: "Percent divided by 10" - -# - name: "ObsValue/cloudAmount" -# coordinates: "longitude latitude" -# source: variables/cloudAmount -# longName: "Cloud Amount" -# units: "CODE TABLE" - -# - name: "ObsValue/heightOfBaseOfCloud" -# coordinates: "longitude latitude" -# source: variables/heightOfBaseOfCloud -# longName: "Height of base of cloud" -# units: "Meter" + units: "kg kg-1" - name: "ObsValue/windEastward" coordinates: "longitude latitude" source: variables/windEastward longName: "U component of Wind" - units: "Meter Second-1" + units: "m s-1" - name: "ObsValue/windNorthward" coordinates: "longitude latitude" source: variables/windNorthward longName: "V component of Wind" - units: "Meter Second-1" + units: "m s-1" - - name: "ObsValue/windError" - coordinates: "longitude latitude" - source: variables/windError - longName: "U, V component of wind error" - units: "Meter Second-1" - - - name: "QualityMarker/heightQM" + #QualityMarker + - name: "QualityMarker/height" coordinates: "longitude latitude" source: variables/heightQM - longName: "Height QM" - units: "CODE TABLE" + longName: "Height Quality Marker" - - name: "QualityMarker/pressureQM" + - name: "QualityMarker/pressure" coordinates: "longitude latitude" source: variables/pressureQM - longName: "Pressure QM" - units: "CODE TABLE" + longName: "Pressure Quality Marker" - - name: "QualityMarker/airTemperatureQM" + - name: "QualityMarker/airTemperature" coordinates: "longitude latitude" source: variables/airTemperatureQM - longName: "Temperature QM" - units: "CODE TABLE" + longName: "Temperature Quality Marker" - - name: "QualityMarker/specificHumidityQM" + - name: "QualityMarker/specificHumidity" coordinates: "longitude latitude" source: variables/specificHumidityQM - longName: "specific Humidity QM" - units: "CODE TABLE" + longName: "specific Humidity Quality Marker" -# - name: "QualityMarker/verticalSignificanceSurfaceObservations" -# coordinates: "longitude latitude" -# source: variables/verticalSignificanceSurfaceObservations -# longName: "Vertical Significance (Surface Observations)" -# units: "CODE TABLE" + - name: "QualityMarker/windEastward" + coordinates: "longitude latitude" + source: variables/windQM + longName: "U Component of Wind Quality Marker" - - name: "QualityMarker/windQM" + - name: "QualityMarker/windNorthward" coordinates: "longitude latitude" source: variables/windQM - longName: "U, V Component of Wind QM" - units: "CODE TABLE" + longName: "V Component of Wind Quality Marker" + + #ObsError + - name: "ObsError/pressure" + coordinates: "longitude latitude" + source: variables/pressureError + longName: "Pressure Error" + units: "Pa" + + - name: "ObsError/airTemperature" + coordinates: "longitude latitude" + source: variables/airTemperatureError + longName: "Temperature Error" + units: "K" + + - name: "ObsError/relativeHumidity" + coordinates: "longitude latitude" + source: variables/relativeHumidityError + longName: "Relative Humidity Error" + units: "1" + + - name: "ObsError/windEastward" + coordinates: "longitude latitude" + source: variables/windError + longName: "U component of wind error" + units: "m s-1" + + - name: "ObsError/windNorthward" + coordinates: "longitude latitude" + source: variables/windError + longName: "V component of wind error" + units: "m s-1" diff --git a/test/testinput/gdas.t12z.acft_profiles.prepbufr b/test/testinput/gdas.t12z.acft_profiles.prepbufr new file mode 100644 index 000000000..585017597 --- /dev/null +++ b/test/testinput/gdas.t12z.acft_profiles.prepbufr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5475b67e6b161c6dd49514bde91e6de9087435c5063ea4783663272f06ea55e6 +size 197576 diff --git a/test/testinput/gdas.t12z.aircar.tm00.bufr_d b/test/testinput/gdas.t12z.aircar.tm00.bufr_d new file mode 100644 index 000000000..60d854f61 --- /dev/null +++ b/test/testinput/gdas.t12z.aircar.tm00.bufr_d @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:999d96cb991791c38bd64786377385721993b380280c3e4fa52d3e2d5438b706 +size 60944 diff --git a/test/testinput/gdas.t12z.aircft.tm00.bufr_d b/test/testinput/gdas.t12z.aircft.tm00.bufr_d index 704f6fa51..e1a2a7e89 100644 --- a/test/testinput/gdas.t12z.aircft.tm00.bufr_d +++ b/test/testinput/gdas.t12z.aircft.tm00.bufr_d @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:41b1ee8552c02f8015a32fe3eea1708fa3fd39c8bf02bd5cd4a7a42d50c2adf9 -size 123088 +oid sha256:f6d73827ee889642bb30366eade2a4dfbee134ff2f2c6d93bcd9d123071419bb +size 331688 diff --git a/test/testoutput/aircraft_prepbufr_acftprofiles.nc b/test/testoutput/aircraft_prepbufr_acftprofiles.nc deleted file mode 100644 index 678968025..000000000 --- a/test/testoutput/aircraft_prepbufr_acftprofiles.nc +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66486f8d8abe5350794db0ddab4b2e0cd10f4a1c031e326e76311ada41bea2c2 -size 217400 diff --git a/test/testoutput/bufr_specifying_subsets.nc b/test/testoutput/bufr_specifying_subsets.nc index ecb61585f..334a2e4dd 100644 --- a/test/testoutput/bufr_specifying_subsets.nc +++ b/test/testoutput/bufr_specifying_subsets.nc @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f3b86786b014bf39de2abaa815688ee982a32aadebe50149ea016acadf5646f -size 24062 +oid sha256:d097d617b383fa7c7f8aaf7a16ddc7afea98019eca836f59fa42c854541ea998 +size 29690 diff --git a/test/testoutput/gdas.t12z.acft_profiles.prepbufr.nc b/test/testoutput/gdas.t12z.acft_profiles.prepbufr.nc new file mode 100644 index 000000000..d1d1d791a --- /dev/null +++ b/test/testoutput/gdas.t12z.acft_profiles.prepbufr.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02fb47265b6da319d7c41d601ea8b248de7e1433c325037d1a4f2166e35ac069 +size 249330 diff --git a/test/testoutput/gdas.t12z.aircar.tm00.nc b/test/testoutput/gdas.t12z.aircar.tm00.nc new file mode 100644 index 000000000..402847679 --- /dev/null +++ b/test/testoutput/gdas.t12z.aircar.tm00.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6190a9736ade137e9532acc60e080297f18c8c7deebeb5d513bea603c6005d24 +size 71881 diff --git a/test/testoutput/gdas.t12z.aircft_AMDAR103.tm00.nc b/test/testoutput/gdas.t12z.aircft_AMDAR103.tm00.nc new file mode 100644 index 000000000..707fd2ea9 --- /dev/null +++ b/test/testoutput/gdas.t12z.aircft_AMDAR103.tm00.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31e39bcbb8e5c96c6945e1e2052dacddf584eba852e45f9bfcee7dd438ded811 +size 72503 diff --git a/test/testoutput/gdas.t12z.aircft_noAMDAR103.tm00.nc b/test/testoutput/gdas.t12z.aircft_noAMDAR103.tm00.nc new file mode 100644 index 000000000..b821462c4 --- /dev/null +++ b/test/testoutput/gdas.t12z.aircft_noAMDAR103.tm00.nc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2bad9ec8fbc0102eee629e1335e1ab130cecdaab6536f781353dffcb56f9661f +size 252208