diff --git a/config/obs_kind_mod.f90 b/config/obs_kind_mod.f90 new file mode 100644 index 0000000000000000000000000000000000000000..9fa9f32dbdbb9fa2de4aff7663a5ee2be485b31b --- /dev/null +++ b/config/obs_kind_mod.f90 @@ -0,0 +1,2700 @@ +! DART software - Copyright UCAR. This open source software is provided +! by UCAR, "as is", without charge, subject to all terms of use at +! http://www.image.ucar.edu/DAReS/DART/DART_download + +!---------------------------------------------------------------------- +! WARNING!! The file obs_kind_mod.f90 is AUTOGENERATED by the +! 'preprocess' program. Any changes made to this file will be +! overwritten when it is regenerated. To make permanent changes in +! the code, edit DEFAULT_obs_kind_mod.F90, edit the observation +! specific obs_def_xxx_mod.f90 files, or edit the xxx_quantity.f90 files. +!---------------------------------------------------------------------- + +! FIXME: this should change to obs_qty_mod - but that is a large footprint, +! non-backwards compatible change. almost every other module in the system +! has a use statement for this module + +! module obs_qty_mod +module obs_kind_mod + +use types_mod, only : obstypelength, r8, MISSING_R8 +use utilities_mod, only : error_handler, E_ERR, E_WARN, & + logfileunit, find_namelist_in_file, log_it, & + check_namelist_read, do_output, ascii_file_format, & + string_to_real + +implicit none +private + +public :: get_name_for_type_of_obs, & + assimilate_this_type_of_obs, & + evaluate_this_type_of_obs, & + get_quantity_for_type_of_obs, & + get_index_for_type_of_obs, & + write_type_of_obs_table, & + read_type_of_obs_table, & + get_type_of_obs_from_menu, & + map_type_of_obs_table, & + use_ext_prior_this_type_of_obs, & + get_name_for_quantity, & + get_index_for_quantity, & + set_namevalue_for_quantity, & + get_num_items_for_quantity, & + get_itemname_for_quantity, & + get_itemvalue_for_quantity, & + has_bounds_for_quantity + +public :: get_num_types_of_obs, get_num_quantities + +!---------------------------------------------------------------------------- +! These lists are autogenerated by the 'preprocess' program. +! +! To add new observation types (e.g. AIRS_U_WIND_COMPONENT), edit the +! obs_def_xxx_mod.f90 files and add the filename to the 'obs_type_files' variable +! in the &preprocess_nml namelist of the model-specific work/input.nml file. +! There can be multiple filenames listed for 'obs_type_files'. +! +! To add a new fundamental quantity (e.g. QTY_TEMPERATURE), first examine +! all the xxx_quantities_mod.f90 files to be sure it does not already exist. +! If it really does not, add QTY_xxx to the most appropriate file and +! add xxx_quantities_mod.f90 to the 'quantity_files' variable in the &preprocess_nml +! namelist. There can be multiple filenames listed for 'quantity_files'. +! +! Add a descriptive comment along with expected units and any other +! helpful information. These quantities should be useable by any +! model of the same system to allow interoperability and comparisons +! between model results. +! + +!--------------------------------------------------------------------------- + +! Integer definitions for DART QUANTITIES + +integer, parameter, public :: QTY_STATE_VARIABLE = 0 +integer, parameter, public :: QTY_U_WIND_COMPONENT = 1 +integer, parameter, public :: QTY_V_WIND_COMPONENT = 2 +integer, parameter, public :: QTY_SURFACE_PRESSURE = 3 +integer, parameter, public :: QTY_TEMPERATURE = 4 +integer, parameter, public :: QTY_SPECIFIC_HUMIDITY = 5 +integer, parameter, public :: QTY_PRESSURE = 6 +integer, parameter, public :: QTY_VERTICAL_VELOCITY = 7 +integer, parameter, public :: QTY_RAINWATER_MIXING_RATIO = 8 +integer, parameter, public :: QTY_DEWPOINT = 9 +integer, parameter, public :: QTY_DENSITY = 10 +integer, parameter, public :: QTY_MEAN_SOURCE = 11 +integer, parameter, public :: QTY_VELOCITY = 12 +integer, parameter, public :: QTY_RADAR_REFLECTIVITY = 13 +integer, parameter, public :: QTY_GRAUPEL_MIXING_RATIO = 14 +integer, parameter, public :: QTY_SNOW_MIXING_RATIO = 15 +integer, parameter, public :: QTY_GPSRO = 16 +integer, parameter, public :: QTY_CLOUD_LIQUID_WATER = 17 +integer, parameter, public :: QTY_CLOUD_ICE = 18 +integer, parameter, public :: QTY_CONDENSATIONAL_HEATING = 19 +integer, parameter, public :: QTY_VAPOR_MIXING_RATIO = 20 +integer, parameter, public :: QTY_ICE_NUMBER_CONCENTRATION = 21 +integer, parameter, public :: QTY_GEOPOTENTIAL_HEIGHT = 22 +integer, parameter, public :: QTY_POTENTIAL_TEMPERATURE = 23 +integer, parameter, public :: QTY_SOIL_MOISTURE = 24 +integer, parameter, public :: QTY_SOURCE_PHASE = 25 +integer, parameter, public :: QTY_SURFACE_ELEVATION = 26 +integer, parameter, public :: QTY_GRAV_WAVE_DRAG_EFFIC = 27 +integer, parameter, public :: QTY_GRAV_WAVE_STRESS_FRACTION = 28 +integer, parameter, public :: QTY_POWER_WEIGHTED_FALL_SPEED = 29 +integer, parameter, public :: QTY_CLOUDWATER_MIXING_RATIO = 30 +integer, parameter, public :: QTY_ICE_MIXING_RATIO = 31 +integer, parameter, public :: QTY_DROPLET_NUMBER_CONCENTR = 32 +integer, parameter, public :: QTY_SNOW_NUMBER_CONCENTR = 33 +integer, parameter, public :: QTY_RAIN_NUMBER_CONCENTR = 34 +integer, parameter, public :: QTY_GRAUPEL_NUMBER_CONCENTR = 35 +integer, parameter, public :: QTY_CLOUD_FRACTION = 36 +integer, parameter, public :: QTY_ICE_FRACTION = 37 +integer, parameter, public :: QTY_RELATIVE_HUMIDITY = 38 +integer, parameter, public :: QTY_1D_PARAMETER = 39 +integer, parameter, public :: QTY_2D_PARAMETER = 40 +integer, parameter, public :: QTY_3D_PARAMETER = 41 +integer, parameter, public :: QTY_ALTIMETER_TENDENCY = 42 +integer, parameter, public :: QTY_PRECIPITABLE_WATER = 43 +integer, parameter, public :: QTY_OCCULTATION_REFRACTIVITY = 44 +integer, parameter, public :: QTY_OCCULTATION_EXCESSPHASE = 45 +integer, parameter, public :: QTY_GEOMETRIC_HEIGHT = 46 +integer, parameter, public :: QTY_INFRARED_RADIANCE = 47 +integer, parameter, public :: QTY_INFRARED_BRIGHT_TEMP = 48 +integer, parameter, public :: QTY_LANDMASK = 49 +integer, parameter, public :: QTY_EDGE_NORMAL_SPEED = 50 +integer, parameter, public :: QTY_CLW_PATH = 51 +integer, parameter, public :: QTY_CWP_PATH = 52 +integer, parameter, public :: QTY_CWP_PATH_ZERO = 53 +integer, parameter, public :: QTY_WIND_TURBINE_POWER = 54 +integer, parameter, public :: QTY_2M_SPECIFIC_HUMIDITY = 55 +integer, parameter, public :: QTY_2M_TEMPERATURE = 56 +integer, parameter, public :: QTY_10M_U_WIND_COMPONENT = 57 +integer, parameter, public :: QTY_10M_V_WIND_COMPONENT = 58 +integer, parameter, public :: QTY_SKIN_TEMPERATURE = 59 +integer, parameter, public :: QTY_NADIR_RADIANCE = 60 +integer, parameter, public :: QTY_TRACER_1_MIXING_RATIO = 61 +integer, parameter, public :: QTY_TRACER_2_MIXING_RATIO = 62 +integer, parameter, public :: QTY_TRACER_CONCENTRATION = 63 +integer, parameter, public :: QTY_TRACER_SOURCE = 64 +integer, parameter, public :: QTY_SOIL_TEMPERATURE = 65 +integer, parameter, public :: QTY_SOIL_LIQUID_WATER = 66 +integer, parameter, public :: QTY_VERTICAL_VORTICITY = 67 +integer, parameter, public :: QTY_SURFACE_ALBEDO = 68 +integer, parameter, public :: QTY_SURFACE_EMISSIVITY = 69 +integer, parameter, public :: QTY_DUST_OPACITY_7MB = 70 +integer, parameter, public :: QTY_THC = 71 +integer, parameter, public :: QTY_VORTEX_LON = 72 +integer, parameter, public :: QTY_VORTEX_LAT = 73 +integer, parameter, public :: QTY_VORTEX_PMIN = 74 +integer, parameter, public :: QTY_VORTEX_WMAX = 75 +integer, parameter, public :: QTY_EXNER_FUNCTION = 76 +integer, parameter, public :: QTY_TURBULENT_KINETIC_ENERGY = 77 +integer, parameter, public :: QTY_TOTAL_PRECIPITABLE_WATER = 78 +integer, parameter, public :: QTY_VERTLEVEL = 79 +integer, parameter, public :: QTY_MICROWAVE_BRIGHT_TEMP = 80 +integer, parameter, public :: QTY_INTEGRATED_SULFATE = 81 +integer, parameter, public :: QTY_INTEGRATED_DUST = 82 +integer, parameter, public :: QTY_INTEGRATED_SMOKE = 83 +integer, parameter, public :: QTY_INTEGRATED_SEASALT = 84 +integer, parameter, public :: QTY_INTEGRATED_AOD = 85 +integer, parameter, public :: QTY_SO2 = 86 +integer, parameter, public :: QTY_SULFATE = 87 +integer, parameter, public :: QTY_DUST = 88 +integer, parameter, public :: QTY_SMOKE = 89 +integer, parameter, public :: QTY_SEASALT = 90 +integer, parameter, public :: QTY_HAIL_MIXING_RATIO = 91 +integer, parameter, public :: QTY_HAIL_NUMBER_CONCENTR = 92 +integer, parameter, public :: QTY_GRAUPEL_VOLUME = 93 +integer, parameter, public :: QTY_HAIL_VOLUME = 94 +integer, parameter, public :: QTY_DIFFERENTIAL_REFLECTIVITY = 95 +integer, parameter, public :: QTY_SPECIFIC_DIFFERENTIAL_PHASE = 96 +integer, parameter, public :: QTY_FLASH_RATE_2D = 97 +integer, parameter, public :: QTY_RADIANCE = 98 +integer, parameter, public :: QTY_BRIGHTNESS_TEMPERATURE = 99 +integer, parameter, public :: QTY_BI_DIRECTIONAL_REFLECTANCE = 100 +integer, parameter, public :: QTY_SURFACE_TYPE = 101 +integer, parameter, public :: QTY_WIND_FETCH = 102 +integer, parameter, public :: QTY_WATER_TYPE = 103 +integer, parameter, public :: QTY_FOAM_FRAC = 104 +integer, parameter, public :: QTY_INSOLUBLE_AER = 105 +integer, parameter, public :: QTY_H2O_SOLUBLE_AER = 106 +integer, parameter, public :: QTY_SOOT = 107 +integer, parameter, public :: QTY_SEASALT_ACCUM = 108 +integer, parameter, public :: QTY_SEASALT_COARSE = 109 +integer, parameter, public :: QTY_MINERAL_NUCLEUS = 110 +integer, parameter, public :: QTY_MINERAL_ACCUM = 111 +integer, parameter, public :: QTY_MINERAL_COARSE = 112 +integer, parameter, public :: QTY_MINERAL_TRANSPORTED = 113 +integer, parameter, public :: QTY_SULPHATED_DROPS = 114 +integer, parameter, public :: QTY_VOLCANIC_ASH = 115 +integer, parameter, public :: QTY_NEW_VOLCANIC_ASH = 116 +integer, parameter, public :: QTY_ASIAN_DUST = 117 +integer, parameter, public :: QTY_BLACK_CARBON = 118 +integer, parameter, public :: QTY_DUST_BIN1 = 119 +integer, parameter, public :: QTY_DUST_BIN2 = 120 +integer, parameter, public :: QTY_DUST_BIN3 = 121 +integer, parameter, public :: QTY_AMMONIUM_SULPHATE = 122 +integer, parameter, public :: QTY_SEA_SALT_BIN1 = 123 +integer, parameter, public :: QTY_SEA_SALT_BIN2 = 124 +integer, parameter, public :: QTY_SEA_SALT_BIN3 = 125 +integer, parameter, public :: QTY_HYDROPHILIC_ORGANIC_MATTER = 126 +integer, parameter, public :: QTY_CLOUDWATER_DE = 127 +integer, parameter, public :: QTY_CLOUD_ICE_DE = 128 +integer, parameter, public :: QTY_COLUMN_CLOUD_FRAC = 129 +integer, parameter, public :: QTY_CLOUD_TOP_PRESSURE = 130 +integer, parameter, public :: QTY_ABSOLUTE_HUMIDITY = 131 +integer, parameter, public :: QTY_O3 = 132 +integer, parameter, public :: QTY_CO2 = 133 +integer, parameter, public :: QTY_N2O = 134 +integer, parameter, public :: QTY_CH4 = 135 +integer, parameter, public :: QTY_CO = 136 +integer, parameter, public :: QTY_SALINITY = 137 +integer, parameter, public :: QTY_SNOWCOVER_FRAC = 138 + + +integer, parameter, public :: MAX_DEFINED_QUANTITIES = 138 + +!--------------------------------------------------------------------------- +!--------------------------------------------------------------------------- + +! Integer definitions for DART OBS TYPES + +integer, parameter, public :: RADIOSONDE_U_WIND_COMPONENT = 1 +integer, parameter, public :: RADIOSONDE_V_WIND_COMPONENT = 2 +integer, parameter, public :: RADIOSONDE_GEOPOTENTIAL_HGT = 3 +integer, parameter, public :: RADIOSONDE_SURFACE_PRESSURE = 4 +integer, parameter, public :: RADIOSONDE_TEMPERATURE = 5 +integer, parameter, public :: RADIOSONDE_SPECIFIC_HUMIDITY = 6 +integer, parameter, public :: DROPSONDE_U_WIND_COMPONENT = 7 +integer, parameter, public :: DROPSONDE_V_WIND_COMPONENT = 8 +integer, parameter, public :: DROPSONDE_SURFACE_PRESSURE = 9 +integer, parameter, public :: DROPSONDE_TEMPERATURE = 10 +integer, parameter, public :: DROPSONDE_SPECIFIC_HUMIDITY = 11 +integer, parameter, public :: AIRCRAFT_U_WIND_COMPONENT = 12 +integer, parameter, public :: AIRCRAFT_V_WIND_COMPONENT = 13 +integer, parameter, public :: AIRCRAFT_TEMPERATURE = 14 +integer, parameter, public :: AIRCRAFT_SPECIFIC_HUMIDITY = 15 +integer, parameter, public :: ACARS_U_WIND_COMPONENT = 16 +integer, parameter, public :: ACARS_V_WIND_COMPONENT = 17 +integer, parameter, public :: ACARS_TEMPERATURE = 18 +integer, parameter, public :: ACARS_SPECIFIC_HUMIDITY = 19 +integer, parameter, public :: MARINE_SFC_U_WIND_COMPONENT = 20 +integer, parameter, public :: MARINE_SFC_V_WIND_COMPONENT = 21 +integer, parameter, public :: MARINE_SFC_TEMPERATURE = 22 +integer, parameter, public :: MARINE_SFC_SPECIFIC_HUMIDITY = 23 +integer, parameter, public :: MARINE_SFC_PRESSURE = 24 +integer, parameter, public :: LAND_SFC_U_WIND_COMPONENT = 25 +integer, parameter, public :: LAND_SFC_V_WIND_COMPONENT = 26 +integer, parameter, public :: LAND_SFC_TEMPERATURE = 27 +integer, parameter, public :: LAND_SFC_SPECIFIC_HUMIDITY = 28 +integer, parameter, public :: LAND_SFC_PRESSURE = 29 +integer, parameter, public :: SAT_U_WIND_COMPONENT = 30 +integer, parameter, public :: SAT_V_WIND_COMPONENT = 31 +integer, parameter, public :: ATOV_TEMPERATURE = 32 +integer, parameter, public :: AIRS_TEMPERATURE = 33 +integer, parameter, public :: AIRS_SPECIFIC_HUMIDITY = 34 +integer, parameter, public :: GPS_PRECIPITABLE_WATER = 35 +integer, parameter, public :: VADWND_U_WIND_COMPONENT = 36 +integer, parameter, public :: VADWND_V_WIND_COMPONENT = 37 +integer, parameter, public :: CIMMS_AMV_U_WIND_COMPONENT = 38 +integer, parameter, public :: CIMMS_AMV_V_WIND_COMPONENT = 39 +integer, parameter, public :: DOPPLER_RADIAL_VELOCITY = 40 +integer, parameter, public :: RADAR_REFLECTIVITY = 41 +integer, parameter, public :: RADAR_CLEARAIR_REFLECTIVITY = 42 +integer, parameter, public :: PRECIPITATION_FALL_SPEED = 43 +integer, parameter, public :: METAR_U_10_METER_WIND = 44 +integer, parameter, public :: METAR_V_10_METER_WIND = 45 +integer, parameter, public :: METAR_TEMPERATURE_2_METER = 46 +integer, parameter, public :: METAR_SPECIFIC_HUMIDITY_2_METER = 47 +integer, parameter, public :: METAR_SURFACE_PRESSURE = 48 +integer, parameter, public :: METAR_POT_TEMP_2_METER = 49 +integer, parameter, public :: DEWPOINT = 50 +integer, parameter, public :: DEWPOINT_2_METER = 51 +integer, parameter, public :: BUOY_DEWPOINT = 52 +integer, parameter, public :: SHIP_DEWPOINT = 53 +integer, parameter, public :: SYNOP_DEWPOINT = 54 +integer, parameter, public :: AIREP_DEWPOINT = 55 +integer, parameter, public :: AMDAR_DEWPOINT = 56 +integer, parameter, public :: PILOT_DEWPOINT = 57 +integer, parameter, public :: BOGUS_DEWPOINT = 58 +integer, parameter, public :: AIRS_DEWPOINT = 59 +integer, parameter, public :: METAR_DEWPOINT_2_METER = 60 +integer, parameter, public :: RADIOSONDE_DEWPOINT = 61 +integer, parameter, public :: DROPSONDE_DEWPOINT = 62 +integer, parameter, public :: AIRCRAFT_DEWPOINT = 63 +integer, parameter, public :: ACARS_DEWPOINT = 64 +integer, parameter, public :: MARINE_SFC_DEWPOINT = 65 +integer, parameter, public :: LAND_SFC_DEWPOINT = 66 +integer, parameter, public :: RADIOSONDE_RELATIVE_HUMIDITY = 67 +integer, parameter, public :: DROPSONDE_RELATIVE_HUMIDITY = 68 +integer, parameter, public :: AIRCRAFT_RELATIVE_HUMIDITY = 69 +integer, parameter, public :: ACARS_RELATIVE_HUMIDITY = 70 +integer, parameter, public :: MARINE_SFC_RELATIVE_HUMIDITY = 71 +integer, parameter, public :: LAND_SFC_RELATIVE_HUMIDITY = 72 +integer, parameter, public :: METAR_RELATIVE_HUMIDITY_2_METER = 73 +integer, parameter, public :: AIRS_RELATIVE_HUMIDITY = 74 +integer, parameter, public :: MESONET_RELATIVE_HUMIDITY = 75 +integer, parameter, public :: RADIOSONDE_SURFACE_ALTIMETER = 76 +integer, parameter, public :: DROPSONDE_SURFACE_ALTIMETER = 77 +integer, parameter, public :: MARINE_SFC_ALTIMETER = 78 +integer, parameter, public :: LAND_SFC_ALTIMETER = 79 +integer, parameter, public :: METAR_ALTIMETER = 80 +integer, parameter, public :: MESONET_SURFACE_ALTIMETER = 81 +integer, parameter, public :: TEMPERATURE = 82 +integer, parameter, public :: SPECIFIC_HUMIDITY = 83 +integer, parameter, public :: PRESSURE = 84 +integer, parameter, public :: GPSRO_REFRACTIVITY = 85 +integer, parameter, public :: VORTEX_LAT = 86 +integer, parameter, public :: VORTEX_LON = 87 +integer, parameter, public :: VORTEX_PMIN = 88 +integer, parameter, public :: VORTEX_WMAX = 89 +integer, parameter, public :: BUOY_U_WIND_COMPONENT = 90 +integer, parameter, public :: BUOY_V_WIND_COMPONENT = 91 +integer, parameter, public :: BUOY_SURFACE_PRESSURE = 92 +integer, parameter, public :: BUOY_TEMPERATURE = 93 +integer, parameter, public :: SHIP_U_WIND_COMPONENT = 94 +integer, parameter, public :: SHIP_V_WIND_COMPONENT = 95 +integer, parameter, public :: SHIP_SURFACE_PRESSURE = 96 +integer, parameter, public :: SHIP_TEMPERATURE = 97 +integer, parameter, public :: SYNOP_U_WIND_COMPONENT = 98 +integer, parameter, public :: SYNOP_V_WIND_COMPONENT = 99 +integer, parameter, public :: SYNOP_SURFACE_PRESSURE = 100 +integer, parameter, public :: SYNOP_SPECIFIC_HUMIDITY = 101 +integer, parameter, public :: SYNOP_TEMPERATURE = 102 +integer, parameter, public :: AIREP_U_WIND_COMPONENT = 103 +integer, parameter, public :: AIREP_V_WIND_COMPONENT = 104 +integer, parameter, public :: AIREP_PRESSURE = 105 +integer, parameter, public :: AIREP_TEMPERATURE = 106 +integer, parameter, public :: AMDAR_U_WIND_COMPONENT = 107 +integer, parameter, public :: AMDAR_V_WIND_COMPONENT = 108 +integer, parameter, public :: AMDAR_PRESSURE = 109 +integer, parameter, public :: AMDAR_TEMPERATURE = 110 +integer, parameter, public :: PILOT_U_WIND_COMPONENT = 111 +integer, parameter, public :: PILOT_V_WIND_COMPONENT = 112 +integer, parameter, public :: PILOT_PRESSURE = 113 +integer, parameter, public :: PILOT_TEMPERATURE = 114 +integer, parameter, public :: BOGUS_U_WIND_COMPONENT = 115 +integer, parameter, public :: BOGUS_V_WIND_COMPONENT = 116 +integer, parameter, public :: BOGUS_PRESSURE = 117 +integer, parameter, public :: BOGUS_TEMPERATURE = 118 +integer, parameter, public :: PROFILER_U_WIND_COMPONENT = 119 +integer, parameter, public :: PROFILER_V_WIND_COMPONENT = 120 +integer, parameter, public :: PROFILER_PRESSURE = 121 +integer, parameter, public :: SATEM_THICKNESS = 122 +integer, parameter, public :: NOAA_1_VTPR1_RADIANCE = 123 +integer, parameter, public :: NOAA_2_VTPR1_RADIANCE = 124 +integer, parameter, public :: NOAA_3_VTPR1_RADIANCE = 125 +integer, parameter, public :: NOAA_4_VTPR1_RADIANCE = 126 +integer, parameter, public :: NOAA_5_HIRS_RADIANCE = 127 +integer, parameter, public :: NOAA_5_MSU_TB = 128 +integer, parameter, public :: NOAA_5_AVHRR_RADIANCE = 129 +integer, parameter, public :: NOAA_6_HIRS_RADIANCE = 130 +integer, parameter, public :: NOAA_6_MSU_TB = 131 +integer, parameter, public :: NOAA_6_AVHRR_RADIANCE = 132 +integer, parameter, public :: NOAA_7_HIRS_RADIANCE = 133 +integer, parameter, public :: NOAA_7_MSU_TB = 134 +integer, parameter, public :: NOAA_7_AVHRR_RADIANCE = 135 +integer, parameter, public :: NOAA_8_HIRS_RADIANCE = 136 +integer, parameter, public :: NOAA_8_MSU_TB = 137 +integer, parameter, public :: NOAA_8_AVHRR_RADIANCE = 138 +integer, parameter, public :: NOAA_9_HIRS_RADIANCE = 139 +integer, parameter, public :: NOAA_9_MSU_TB = 140 +integer, parameter, public :: NOAA_9_AVHRR_RADIANCE = 141 +integer, parameter, public :: NOAA_10_HIRS_RADIANCE = 142 +integer, parameter, public :: NOAA_10_MSU_TB = 143 +integer, parameter, public :: NOAA_10_AVHRR_RADIANCE = 144 +integer, parameter, public :: NOAA_11_HIRS_RADIANCE = 145 +integer, parameter, public :: NOAA_11_MSU_TB = 146 +integer, parameter, public :: NOAA_11_AVHRR_RADIANCE = 147 +integer, parameter, public :: NOAA_12_HIRS_RADIANCE = 148 +integer, parameter, public :: NOAA_12_MSU_TB = 149 +integer, parameter, public :: NOAA_12_AVHRR_RADIANCE = 150 +integer, parameter, public :: NOAA_13_AVHRR_RADIANCE = 151 +integer, parameter, public :: NOAA_14_HIRS_RADIANCE = 152 +integer, parameter, public :: NOAA_14_MSU_TB = 153 +integer, parameter, public :: NOAA_14_AVHRR_RADIANCE = 154 +integer, parameter, public :: NOAA_15_HIRS_RADIANCE = 155 +integer, parameter, public :: NOAA_15_AMSUA_TB = 156 +integer, parameter, public :: NOAA_15_AMSUB_TB = 157 +integer, parameter, public :: NOAA_15_AVHRR_RADIANCE = 158 +integer, parameter, public :: NOAA_16_HIRS_RADIANCE = 159 +integer, parameter, public :: NOAA_16_AMSUA_TB = 160 +integer, parameter, public :: NOAA_16_AMSUB_TB = 161 +integer, parameter, public :: NOAA_16_AVHRR_RADIANCE = 162 +integer, parameter, public :: NOAA_17_HIRS_RADIANCE = 163 +integer, parameter, public :: NOAA_17_AMSUA_TB = 164 +integer, parameter, public :: NOAA_17_AMSUB_TB = 165 +integer, parameter, public :: NOAA_17_AVHRR_RADIANCE = 166 +integer, parameter, public :: NOAA_18_HIRS_RADIANCE = 167 +integer, parameter, public :: NOAA_18_AMSUA_TB = 168 +integer, parameter, public :: NOAA_18_AVHRR_RADIANCE = 169 +integer, parameter, public :: NOAA_18_MHS_TB = 170 +integer, parameter, public :: NOAA_19_HIRS_RADIANCE = 171 +integer, parameter, public :: NOAA_19_AMSUA_TB = 172 +integer, parameter, public :: NOAA_19_AVHRR_RADIANCE = 173 +integer, parameter, public :: NOAA_19_MHS_TB = 174 +integer, parameter, public :: NOAA_20_ATMS_TB = 175 +integer, parameter, public :: NOAA_20_VIIRS_RADIANCE = 176 +integer, parameter, public :: DMSP_8_SSMI_TB = 177 +integer, parameter, public :: DMSP_9_SSMI_TB = 178 +integer, parameter, public :: DMSP_10_SSMI_TB = 179 +integer, parameter, public :: DMSP_11_SSMI_TB = 180 +integer, parameter, public :: DMSP_11_SSMT2_TB = 181 +integer, parameter, public :: DMSP_12_SSMI_TB = 182 +integer, parameter, public :: DMSP_12_SSMT2_TB = 183 +integer, parameter, public :: DMSP_13_SSMI_TB = 184 +integer, parameter, public :: DMSP_14_SSMI_TB = 185 +integer, parameter, public :: DMSP_14_SSMT2_TB = 186 +integer, parameter, public :: DMSP_15_SSMI_TB = 187 +integer, parameter, public :: DMSP_15_SSMT2_TB = 188 +integer, parameter, public :: DMSP_16_SSMIS_TB = 189 +integer, parameter, public :: DMSP_17_SSMIS_TB = 190 +integer, parameter, public :: DMSP_18_SSMIS_TB = 191 +integer, parameter, public :: DMSP_19_SSMIS_TB = 192 +integer, parameter, public :: METEOSAT_1_MVIRI_RADIANCE = 193 +integer, parameter, public :: METEOSAT_2_MVIRI_RADIANCE = 194 +integer, parameter, public :: METEOSAT_3_MVIRI_RADIANCE = 195 +integer, parameter, public :: METEOSAT_4_MVIRI_RADIANCE = 196 +integer, parameter, public :: METEOSAT_5_MVIRI_RADIANCE = 197 +integer, parameter, public :: METEOSAT_6_MVIRI_RADIANCE = 198 +integer, parameter, public :: METEOSAT_7_MVIRI_RADIANCE = 199 +integer, parameter, public :: GOES_4_SOUNDER_RADIANCE = 200 +integer, parameter, public :: GOES_5_SOUNDER_RADIANCE = 201 +integer, parameter, public :: GOES_6_SOUNDER_RADIANCE = 202 +integer, parameter, public :: GOES_7_SOUNDER_RADIANCE = 203 +integer, parameter, public :: GOES_8_IMAGER_RADIANCE = 204 +integer, parameter, public :: GOES_8_SOUNDER_RADIANCE = 205 +integer, parameter, public :: GOES_9_IMAGER_RADIANCE = 206 +integer, parameter, public :: GOES_9_SOUNDER_RADIANCE = 207 +integer, parameter, public :: GOES_10_IMAGER_RADIANCE = 208 +integer, parameter, public :: GOES_10_SOUNDER_RADIANCE = 209 +integer, parameter, public :: GOES_11_IMAGER_RADIANCE = 210 +integer, parameter, public :: GOES_11_SOUNDER_RADIANCE = 211 +integer, parameter, public :: GOES_12_IMAGER_RADIANCE = 212 +integer, parameter, public :: GOES_12_SOUNDER_RADIANCE = 213 +integer, parameter, public :: GOES_13_IMAGER_RADIANCE = 214 +integer, parameter, public :: GOES_13_SOUNDER_RADIANCE = 215 +integer, parameter, public :: GOES_14_IMAGER_RADIANCE = 216 +integer, parameter, public :: GOES_14_SOUNDER_RADIANCE = 217 +integer, parameter, public :: GOES_15_IMAGER_RADIANCE = 218 +integer, parameter, public :: GOES_15_SOUNDER_RADIANCE = 219 +integer, parameter, public :: GOES_16_ABI_RADIANCE = 220 +integer, parameter, public :: GOES_17_ABI_RADIANCE = 221 +integer, parameter, public :: GOES_18_ABI_RADIANCE = 222 +integer, parameter, public :: GOES_19_ABI_RADIANCE = 223 +integer, parameter, public :: GMS_1_IMAGER_RADIANCE = 224 +integer, parameter, public :: GMS_2_IMAGER_RADIANCE = 225 +integer, parameter, public :: GMS_3_IMAGER_RADIANCE = 226 +integer, parameter, public :: GMS_4_IMAGER_RADIANCE = 227 +integer, parameter, public :: GMS_5_IMAGER_RADIANCE = 228 +integer, parameter, public :: FY2_2_VISSR_RADIANCE = 229 +integer, parameter, public :: FY2_3_VISSR_RADIANCE = 230 +integer, parameter, public :: FY2_4_VISSR_RADIANCE = 231 +integer, parameter, public :: FY2_5_VISSR_RADIANCE = 232 +integer, parameter, public :: FY2_7_VISSR_RADIANCE = 233 +integer, parameter, public :: TRMM_1_TMI_TB = 234 +integer, parameter, public :: ERS_1_ATSR_RADIANCE = 235 +integer, parameter, public :: ERS_1_MWR_TB = 236 +integer, parameter, public :: ERS_2_ATSR_RADIANCE = 237 +integer, parameter, public :: ERS_2_MWR_TB = 238 +integer, parameter, public :: EOS_1_MODIS_RADIANCE = 239 +integer, parameter, public :: EOS_1_ASTER_RADIANCE = 240 +integer, parameter, public :: EOS_2_AMSUA_TB = 241 +integer, parameter, public :: EOS_2_AIRS_RADIANCE = 242 +integer, parameter, public :: EOS_2_HSB_TB = 243 +integer, parameter, public :: EOS_2_MODIS_RADIANCE = 244 +integer, parameter, public :: EOS_2_AMSRE_TB = 245 +integer, parameter, public :: METOP_1_HIRS_RADIANCE = 246 +integer, parameter, public :: METOP_1_AMSUA_TB = 247 +integer, parameter, public :: METOP_1_AVHRR_RADIANCE = 248 +integer, parameter, public :: METOP_1_MHS_TB = 249 +integer, parameter, public :: METOP_2_HIRS_RADIANCE = 250 +integer, parameter, public :: METOP_2_AMSUA_TB = 251 +integer, parameter, public :: METOP_2_AVHRR_RADIANCE = 252 +integer, parameter, public :: METOP_2_MHS_TB = 253 +integer, parameter, public :: METOP_3_AVHRR_RADIANCE = 254 +integer, parameter, public :: ENVISAT_1_ATSR_RADIANCE = 255 +integer, parameter, public :: ENVISAT_1_MWR_TB = 256 +integer, parameter, public :: MSG_1_SEVIRI_RADIANCE = 257 +integer, parameter, public :: MSG_2_SEVIRI_RADIANCE = 258 +integer, parameter, public :: MSG_3_SEVIRI_RADIANCE = 259 +integer, parameter, public :: MSG_4_SEVIRI_RADIANCE = 260 +integer, parameter, public :: MSG_4_SEVIRI_TB = 261 +integer, parameter, public :: MSG_4_SEVIRI_BDRF = 262 +integer, parameter, public :: FY1_3_MVISR_RADIANCE = 263 +integer, parameter, public :: FY1_4_MVISR_RADIANCE = 264 +integer, parameter, public :: MTSAT_1_IMAGER_RADIANCE = 265 +integer, parameter, public :: MTSAT_2_IMAGER_RADIANCE = 266 +integer, parameter, public :: CORIOLIS_1_WINDSAT_TB = 267 +integer, parameter, public :: JPSS_0_ATMS_TB = 268 +integer, parameter, public :: JPSS_0_VIIRS_RADIANCE = 269 +integer, parameter, public :: SENTINEL3_1_SLSTR_RADIANCE = 270 +integer, parameter, public :: SENTINEL3_2_SLSTR_RADIANCE = 271 +integer, parameter, public :: MEGHATR_1_SAPHIR_TB = 272 +integer, parameter, public :: MEGHATR_1_MADRAS_TB = 273 +integer, parameter, public :: FY3_1_MWTS_TB = 274 +integer, parameter, public :: FY3_1_MWHS_TB = 275 +integer, parameter, public :: FY3_1_IRAS_RADIANCE = 276 +integer, parameter, public :: FY3_1_MWRI_TB = 277 +integer, parameter, public :: FY3_2_MWTS_TB = 278 +integer, parameter, public :: FY3_2_MWHS_TB = 279 +integer, parameter, public :: FY3_2_MWRI_TB = 280 +integer, parameter, public :: FY3_3_MWRI_TB = 281 +integer, parameter, public :: FY3_3_MWTS2_TB = 282 +integer, parameter, public :: FY3_3_MWHS2_TB = 283 +integer, parameter, public :: FY3_3_MERSI1_RADIANCE = 284 +integer, parameter, public :: FY3_4_MWRI_TB = 285 +integer, parameter, public :: FY3_4_MWTS2_TB = 286 +integer, parameter, public :: FY3_4_MWHS2_TB = 287 +integer, parameter, public :: FY3_4_MERSI2_RADIANCE = 288 +integer, parameter, public :: COMS_1_MI_RADIANCE = 289 +integer, parameter, public :: METEOR_M_1_MSUMR_RADIANCE = 290 +integer, parameter, public :: METEOR_M_2_MSUMR_RADIANCE = 291 +integer, parameter, public :: METEOR_M_2_MTVZAGY_TB = 292 +integer, parameter, public :: CALIPSO_1_IIR_RADIANCE = 293 +integer, parameter, public :: GCOM_W_1_AMSR2_TB = 294 +integer, parameter, public :: NIMBUS_3_MRIR_RADIANCE = 295 +integer, parameter, public :: NIMBUS_4_THIR_RADIANCE = 296 +integer, parameter, public :: NIMBUS_5_THIR_RADIANCE = 297 +integer, parameter, public :: NIMBUS_6_HIRS_RADIANCE = 298 +integer, parameter, public :: NIMBUS_6_SCAMS_TB = 299 +integer, parameter, public :: NIMBUS_6_THIR_RADIANCE = 300 +integer, parameter, public :: NIMBUS_7_SMMR_TB = 301 +integer, parameter, public :: NIMBUS_7_THIR_RADIANCE = 302 +integer, parameter, public :: HIMAWARI_8_AHI_RADIANCE = 303 +integer, parameter, public :: HIMAWARI_9_AHI_RADIANCE = 304 +integer, parameter, public :: MTG_1_FCI_RADIANCE = 305 +integer, parameter, public :: SARAL_1_ALTIKA_TB = 306 +integer, parameter, public :: METOPSG_1_ICI_TB = 307 +integer, parameter, public :: METOPSG_1_METIMAGE_RADIANCE = 308 +integer, parameter, public :: METOPSG_1_MWS_TB = 309 +integer, parameter, public :: METOPSG_1_MWI_TB = 310 +integer, parameter, public :: LANDSAT_4_TM_RADIANCE = 311 +integer, parameter, public :: LANDSAT_5_TM_RADIANCE = 312 +integer, parameter, public :: LANDSAT_7_TM_RADIANCE = 313 +integer, parameter, public :: LANDSAT_8_TIRS_RADIANCE = 314 +integer, parameter, public :: JASON_2_AMR_TB = 315 +integer, parameter, public :: GPM_1_GMI_TB = 316 +integer, parameter, public :: GPM_1_DPR_TB = 317 +integer, parameter, public :: INSAT3_4_IMAGER_RADIANCE = 318 +integer, parameter, public :: INSAT3_4_SOUNDER_RADIANCE = 319 +integer, parameter, public :: INSAT3_5_IMAGER_RADIANCE = 320 +integer, parameter, public :: INSAT3_5_SOUNDER_RADIANCE = 321 +integer, parameter, public :: TICFIRE_1_MBFIRI_RADIANCE = 322 +integer, parameter, public :: ISS_1_ECOSTRES_RADIANCE = 323 +integer, parameter, public :: HJ1_2_IRMSS_RADIANCE = 324 +integer, parameter, public :: GKOMPSAT2_1_AMI_RADIANCE = 325 +integer, parameter, public :: GCOM_C_1_SGLI_RADIANCE = 326 +integer, parameter, public :: SMOS_1_MIRAS_TB = 327 +integer, parameter, public :: ORS_6_COWVR_TB = 328 +integer, parameter, public :: FY4_1_AGRI_RADIANCE = 329 +integer, parameter, public :: TROPICS_0_TROPICS_TB = 330 +integer, parameter, public :: GF5_1_VIMS_RADIANCE = 331 +integer, parameter, public :: HY2_1_MWRI_TB = 332 +integer, parameter, public :: CLOUDSAT_1_CPR_TB = 333 + + +integer, parameter, public :: MAX_DEFINED_TYPES_OF_OBS = 333 + +!--------------------------------------------------------------------------- + +!---------------------------------------------------------------------------- + +character(len=*), parameter :: source = 'DEFAULT_obs_def_mod.F90' + +! integer, parameters: max_defined_types_of_obs, max_defined_quantities +! generated and inserted by preprocess. + +logical, save :: module_initialized = .false. + +character(len=512) :: msg_string, msg_string1 + +! @todo FIXME: what is the right len for a units and +! other name/value pair strings? +integer, parameter :: namelen = 256 +integer, parameter :: valuelen = 256 + +integer :: num_types_assimilate, num_types_evaluate +integer :: num_types_use_precomputed_FOs + +! Map from values of type in a TOC (e.g. the start of an obs_seq file) +! to the type index in this module. +! Initially, these are undefined and have values -1. +! In each entry, the toc_type_index value is the index in the table of +! contents (usually an input obs_sequence file), and the mod_type_index +! is the current type value in this module. + +type toc_mod_type_map_type + integer :: toc_type_index(max_defined_types_of_obs) = -1 + integer :: mod_type_index(max_defined_types_of_obs) = -1 +end type toc_mod_type_map_type + +type(toc_mod_type_map_type) :: toc_mod_type_map + +! old: +!integer :: map(2, max_defined_types_of_obs) = -1 + +! An observation type links together a unique integer index, +! a character string which matches the integer parameter name, +! what quantity this type is associated with, +! and whether observations of this type should be assimilated, +! evaluated, or neither. +! +! Name lengths are limited to 32 characters by compiler +! restrictions on the length of parameter identifiers. +type obs_type_type + integer :: index = -1 + character(len=obstypelength) :: name = '' + integer :: quantity = -1 + logical :: assimilate = .false. + logical :: evaluate = .false. + logical :: use_precomputed_FO = .false. +end type obs_type_type + +type(obs_type_type) :: obs_type_info(max_defined_types_of_obs) + +! An observation quantity type stores a unique integer index, +! a character string which matches the integer parameter name, +! and name/value pairs of metadata for this quantity. + +integer, parameter :: MAX_ITEMS = 50 + +type obs_qty_type + integer :: index = -1 + character(len=obstypelength) :: name = '' + integer :: nitems = 0 + character(len=namelen) :: itemname(MAX_ITEMS) = '' + character(len=valuelen) :: itemvalue(MAX_ITEMS) = '' +end type obs_qty_type + +! the raw quantity uses index 0, so this needs to match. +type(obs_qty_type) :: obs_qty_info(0:max_defined_quantities) + + +! Namelist array to turn on any requested observation types +character(len=obstypelength) :: assimilate_these_obs_types(max_defined_types_of_obs) = 'null' +character(len=obstypelength) :: evaluate_these_obs_types(max_defined_types_of_obs) = 'null' +character(len=obstypelength) :: use_precomputed_FOs_these_obs_types(max_defined_types_of_obs) = 'null' + + +! namelist /obs_qty_nml/ ... +namelist /obs_kind_nml/ assimilate_these_obs_types, & + evaluate_these_obs_types, & + use_precomputed_FOs_these_obs_types + +contains + +!---------------------------------------------------------------------------- + +subroutine initialize_module() + +integer :: iunit, io, i, j +character(len = 169) :: err_string +character(len=*), parameter :: routine = 'initialize_module' + +module_initialized = .true. + +! Read the namelist entry +call find_namelist_in_file("input.nml", "obs_kind_nml", iunit) +read(iunit, nml = obs_kind_nml, iostat = io) +call check_namelist_read(iunit, io, "obs_kind_nml") + + +!---------------------------------------------------------------------------- + +! These lists are autogenerated by the 'preprocess' program. +! +! To add quantities, edit the appropriate xxx_quantity_mod.f90 files +! and then add them to the 'quantity_files' variable in the +! &preprocess_nml namelist in the input.nml file in the current directory. +! +! To add types, edit the obs_def_xxx_mod.f90 files and then add them +! to the 'obs_type_files' variable of the &preprocess_nml namelist +! in the input.nml file in the current directory. +! +! Associate integer parameter names with a string of the same name. +! Also associate types of obs with the quantity. + + obs_qty_info( 0 )%index = 0 + obs_qty_info( 0 )%name = "QTY_STATE_VARIABLE" + obs_qty_info( 0 )%nitems = 1 + obs_qty_info( 0 )%itemname( 1 ) = "desc" + obs_qty_info( 0 )%itemvalue( 1 ) = "basic item in a state" + + obs_qty_info( 1 )%index = 1 + obs_qty_info( 1 )%name = "QTY_U_WIND_COMPONENT" + obs_qty_info( 1 )%nitems = 0 + + obs_qty_info( 2 )%index = 2 + obs_qty_info( 2 )%name = "QTY_V_WIND_COMPONENT" + obs_qty_info( 2 )%nitems = 0 + + obs_qty_info( 3 )%index = 3 + obs_qty_info( 3 )%name = "QTY_SURFACE_PRESSURE" + obs_qty_info( 3 )%nitems = 0 + + obs_qty_info( 4 )%index = 4 + obs_qty_info( 4 )%name = "QTY_TEMPERATURE" + obs_qty_info( 4 )%nitems = 0 + + obs_qty_info( 5 )%index = 5 + obs_qty_info( 5 )%name = "QTY_SPECIFIC_HUMIDITY" + obs_qty_info( 5 )%nitems = 0 + + obs_qty_info( 6 )%index = 6 + obs_qty_info( 6 )%name = "QTY_PRESSURE" + obs_qty_info( 6 )%nitems = 0 + + obs_qty_info( 7 )%index = 7 + obs_qty_info( 7 )%name = "QTY_VERTICAL_VELOCITY" + obs_qty_info( 7 )%nitems = 0 + + obs_qty_info( 8 )%index = 8 + obs_qty_info( 8 )%name = "QTY_RAINWATER_MIXING_RATIO" + obs_qty_info( 8 )%nitems = 0 + + obs_qty_info( 9 )%index = 9 + obs_qty_info( 9 )%name = "QTY_DEWPOINT" + obs_qty_info( 9 )%nitems = 0 + + obs_qty_info( 10 )%index = 10 + obs_qty_info( 10 )%name = "QTY_DENSITY" + obs_qty_info( 10 )%nitems = 0 + + obs_qty_info( 11 )%index = 11 + obs_qty_info( 11 )%name = "QTY_MEAN_SOURCE" + obs_qty_info( 11 )%nitems = 0 + + obs_qty_info( 12 )%index = 12 + obs_qty_info( 12 )%name = "QTY_VELOCITY" + obs_qty_info( 12 )%nitems = 0 + + obs_qty_info( 13 )%index = 13 + obs_qty_info( 13 )%name = "QTY_RADAR_REFLECTIVITY" + obs_qty_info( 13 )%nitems = 0 + + obs_qty_info( 14 )%index = 14 + obs_qty_info( 14 )%name = "QTY_GRAUPEL_MIXING_RATIO" + obs_qty_info( 14 )%nitems = 0 + + obs_qty_info( 15 )%index = 15 + obs_qty_info( 15 )%name = "QTY_SNOW_MIXING_RATIO" + obs_qty_info( 15 )%nitems = 0 + + obs_qty_info( 16 )%index = 16 + obs_qty_info( 16 )%name = "QTY_GPSRO" + obs_qty_info( 16 )%nitems = 0 + + obs_qty_info( 17 )%index = 17 + obs_qty_info( 17 )%name = "QTY_CLOUD_LIQUID_WATER" + obs_qty_info( 17 )%nitems = 0 + + obs_qty_info( 18 )%index = 18 + obs_qty_info( 18 )%name = "QTY_CLOUD_ICE" + obs_qty_info( 18 )%nitems = 0 + + obs_qty_info( 19 )%index = 19 + obs_qty_info( 19 )%name = "QTY_CONDENSATIONAL_HEATING" + obs_qty_info( 19 )%nitems = 0 + + obs_qty_info( 20 )%index = 20 + obs_qty_info( 20 )%name = "QTY_VAPOR_MIXING_RATIO" + obs_qty_info( 20 )%nitems = 0 + + obs_qty_info( 21 )%index = 21 + obs_qty_info( 21 )%name = "QTY_ICE_NUMBER_CONCENTRATION" + obs_qty_info( 21 )%nitems = 0 + + obs_qty_info( 22 )%index = 22 + obs_qty_info( 22 )%name = "QTY_GEOPOTENTIAL_HEIGHT" + obs_qty_info( 22 )%nitems = 0 + + obs_qty_info( 23 )%index = 23 + obs_qty_info( 23 )%name = "QTY_POTENTIAL_TEMPERATURE" + obs_qty_info( 23 )%nitems = 0 + + obs_qty_info( 24 )%index = 24 + obs_qty_info( 24 )%name = "QTY_SOIL_MOISTURE" + obs_qty_info( 24 )%nitems = 0 + + obs_qty_info( 25 )%index = 25 + obs_qty_info( 25 )%name = "QTY_SOURCE_PHASE" + obs_qty_info( 25 )%nitems = 0 + + obs_qty_info( 26 )%index = 26 + obs_qty_info( 26 )%name = "QTY_SURFACE_ELEVATION" + obs_qty_info( 26 )%nitems = 0 + + obs_qty_info( 27 )%index = 27 + obs_qty_info( 27 )%name = "QTY_GRAV_WAVE_DRAG_EFFIC" + obs_qty_info( 27 )%nitems = 0 + + obs_qty_info( 28 )%index = 28 + obs_qty_info( 28 )%name = "QTY_GRAV_WAVE_STRESS_FRACTION" + obs_qty_info( 28 )%nitems = 0 + + obs_qty_info( 29 )%index = 29 + obs_qty_info( 29 )%name = "QTY_POWER_WEIGHTED_FALL_SPEED" + obs_qty_info( 29 )%nitems = 0 + + obs_qty_info( 30 )%index = 30 + obs_qty_info( 30 )%name = "QTY_CLOUDWATER_MIXING_RATIO" + obs_qty_info( 30 )%nitems = 0 + + obs_qty_info( 31 )%index = 31 + obs_qty_info( 31 )%name = "QTY_ICE_MIXING_RATIO" + obs_qty_info( 31 )%nitems = 0 + + obs_qty_info( 32 )%index = 32 + obs_qty_info( 32 )%name = "QTY_DROPLET_NUMBER_CONCENTR" + obs_qty_info( 32 )%nitems = 0 + + obs_qty_info( 33 )%index = 33 + obs_qty_info( 33 )%name = "QTY_SNOW_NUMBER_CONCENTR" + obs_qty_info( 33 )%nitems = 0 + + obs_qty_info( 34 )%index = 34 + obs_qty_info( 34 )%name = "QTY_RAIN_NUMBER_CONCENTR" + obs_qty_info( 34 )%nitems = 0 + + obs_qty_info( 35 )%index = 35 + obs_qty_info( 35 )%name = "QTY_GRAUPEL_NUMBER_CONCENTR" + obs_qty_info( 35 )%nitems = 0 + + obs_qty_info( 36 )%index = 36 + obs_qty_info( 36 )%name = "QTY_CLOUD_FRACTION" + obs_qty_info( 36 )%nitems = 0 + + obs_qty_info( 37 )%index = 37 + obs_qty_info( 37 )%name = "QTY_ICE_FRACTION" + obs_qty_info( 37 )%nitems = 0 + + obs_qty_info( 38 )%index = 38 + obs_qty_info( 38 )%name = "QTY_RELATIVE_HUMIDITY" + obs_qty_info( 38 )%nitems = 0 + + obs_qty_info( 39 )%index = 39 + obs_qty_info( 39 )%name = "QTY_1D_PARAMETER" + obs_qty_info( 39 )%nitems = 0 + + obs_qty_info( 40 )%index = 40 + obs_qty_info( 40 )%name = "QTY_2D_PARAMETER" + obs_qty_info( 40 )%nitems = 0 + + obs_qty_info( 41 )%index = 41 + obs_qty_info( 41 )%name = "QTY_3D_PARAMETER" + obs_qty_info( 41 )%nitems = 0 + + obs_qty_info( 42 )%index = 42 + obs_qty_info( 42 )%name = "QTY_ALTIMETER_TENDENCY" + obs_qty_info( 42 )%nitems = 0 + + obs_qty_info( 43 )%index = 43 + obs_qty_info( 43 )%name = "QTY_PRECIPITABLE_WATER" + obs_qty_info( 43 )%nitems = 0 + + obs_qty_info( 44 )%index = 44 + obs_qty_info( 44 )%name = "QTY_OCCULTATION_REFRACTIVITY" + obs_qty_info( 44 )%nitems = 0 + + obs_qty_info( 45 )%index = 45 + obs_qty_info( 45 )%name = "QTY_OCCULTATION_EXCESSPHASE" + obs_qty_info( 45 )%nitems = 0 + + obs_qty_info( 46 )%index = 46 + obs_qty_info( 46 )%name = "QTY_GEOMETRIC_HEIGHT" + obs_qty_info( 46 )%nitems = 0 + + obs_qty_info( 47 )%index = 47 + obs_qty_info( 47 )%name = "QTY_INFRARED_RADIANCE" + obs_qty_info( 47 )%nitems = 0 + + obs_qty_info( 48 )%index = 48 + obs_qty_info( 48 )%name = "QTY_INFRARED_BRIGHT_TEMP" + obs_qty_info( 48 )%nitems = 0 + + obs_qty_info( 49 )%index = 49 + obs_qty_info( 49 )%name = "QTY_LANDMASK" + obs_qty_info( 49 )%nitems = 0 + + obs_qty_info( 50 )%index = 50 + obs_qty_info( 50 )%name = "QTY_EDGE_NORMAL_SPEED" + obs_qty_info( 50 )%nitems = 0 + + obs_qty_info( 51 )%index = 51 + obs_qty_info( 51 )%name = "QTY_CLW_PATH" + obs_qty_info( 51 )%nitems = 0 + + obs_qty_info( 52 )%index = 52 + obs_qty_info( 52 )%name = "QTY_CWP_PATH" + obs_qty_info( 52 )%nitems = 0 + + obs_qty_info( 53 )%index = 53 + obs_qty_info( 53 )%name = "QTY_CWP_PATH_ZERO" + obs_qty_info( 53 )%nitems = 0 + + obs_qty_info( 54 )%index = 54 + obs_qty_info( 54 )%name = "QTY_WIND_TURBINE_POWER" + obs_qty_info( 54 )%nitems = 0 + + obs_qty_info( 55 )%index = 55 + obs_qty_info( 55 )%name = "QTY_2M_SPECIFIC_HUMIDITY" + obs_qty_info( 55 )%nitems = 0 + + obs_qty_info( 56 )%index = 56 + obs_qty_info( 56 )%name = "QTY_2M_TEMPERATURE" + obs_qty_info( 56 )%nitems = 0 + + obs_qty_info( 57 )%index = 57 + obs_qty_info( 57 )%name = "QTY_10M_U_WIND_COMPONENT" + obs_qty_info( 57 )%nitems = 0 + + obs_qty_info( 58 )%index = 58 + obs_qty_info( 58 )%name = "QTY_10M_V_WIND_COMPONENT" + obs_qty_info( 58 )%nitems = 0 + + obs_qty_info( 59 )%index = 59 + obs_qty_info( 59 )%name = "QTY_SKIN_TEMPERATURE" + obs_qty_info( 59 )%nitems = 0 + + obs_qty_info( 60 )%index = 60 + obs_qty_info( 60 )%name = "QTY_NADIR_RADIANCE" + obs_qty_info( 60 )%nitems = 0 + + obs_qty_info( 61 )%index = 61 + obs_qty_info( 61 )%name = "QTY_TRACER_1_MIXING_RATIO" + obs_qty_info( 61 )%nitems = 0 + + obs_qty_info( 62 )%index = 62 + obs_qty_info( 62 )%name = "QTY_TRACER_2_MIXING_RATIO" + obs_qty_info( 62 )%nitems = 0 + + obs_qty_info( 63 )%index = 63 + obs_qty_info( 63 )%name = "QTY_TRACER_CONCENTRATION" + obs_qty_info( 63 )%nitems = 0 + + obs_qty_info( 64 )%index = 64 + obs_qty_info( 64 )%name = "QTY_TRACER_SOURCE" + obs_qty_info( 64 )%nitems = 0 + + obs_qty_info( 65 )%index = 65 + obs_qty_info( 65 )%name = "QTY_SOIL_TEMPERATURE" + obs_qty_info( 65 )%nitems = 0 + + obs_qty_info( 66 )%index = 66 + obs_qty_info( 66 )%name = "QTY_SOIL_LIQUID_WATER" + obs_qty_info( 66 )%nitems = 0 + + obs_qty_info( 67 )%index = 67 + obs_qty_info( 67 )%name = "QTY_VERTICAL_VORTICITY" + obs_qty_info( 67 )%nitems = 0 + + obs_qty_info( 68 )%index = 68 + obs_qty_info( 68 )%name = "QTY_SURFACE_ALBEDO" + obs_qty_info( 68 )%nitems = 0 + + obs_qty_info( 69 )%index = 69 + obs_qty_info( 69 )%name = "QTY_SURFACE_EMISSIVITY" + obs_qty_info( 69 )%nitems = 0 + + obs_qty_info( 70 )%index = 70 + obs_qty_info( 70 )%name = "QTY_DUST_OPACITY_7MB" + obs_qty_info( 70 )%nitems = 0 + + obs_qty_info( 71 )%index = 71 + obs_qty_info( 71 )%name = "QTY_THC" + obs_qty_info( 71 )%nitems = 0 + + obs_qty_info( 72 )%index = 72 + obs_qty_info( 72 )%name = "QTY_VORTEX_LON" + obs_qty_info( 72 )%nitems = 0 + + obs_qty_info( 73 )%index = 73 + obs_qty_info( 73 )%name = "QTY_VORTEX_LAT" + obs_qty_info( 73 )%nitems = 0 + + obs_qty_info( 74 )%index = 74 + obs_qty_info( 74 )%name = "QTY_VORTEX_PMIN" + obs_qty_info( 74 )%nitems = 0 + + obs_qty_info( 75 )%index = 75 + obs_qty_info( 75 )%name = "QTY_VORTEX_WMAX" + obs_qty_info( 75 )%nitems = 0 + + obs_qty_info( 76 )%index = 76 + obs_qty_info( 76 )%name = "QTY_EXNER_FUNCTION" + obs_qty_info( 76 )%nitems = 0 + + obs_qty_info( 77 )%index = 77 + obs_qty_info( 77 )%name = "QTY_TURBULENT_KINETIC_ENERGY" + obs_qty_info( 77 )%nitems = 0 + + obs_qty_info( 78 )%index = 78 + obs_qty_info( 78 )%name = "QTY_TOTAL_PRECIPITABLE_WATER" + obs_qty_info( 78 )%nitems = 0 + + obs_qty_info( 79 )%index = 79 + obs_qty_info( 79 )%name = "QTY_VERTLEVEL" + obs_qty_info( 79 )%nitems = 0 + + obs_qty_info( 80 )%index = 80 + obs_qty_info( 80 )%name = "QTY_MICROWAVE_BRIGHT_TEMP" + obs_qty_info( 80 )%nitems = 0 + + obs_qty_info( 81 )%index = 81 + obs_qty_info( 81 )%name = "QTY_INTEGRATED_SULFATE" + obs_qty_info( 81 )%nitems = 0 + + obs_qty_info( 82 )%index = 82 + obs_qty_info( 82 )%name = "QTY_INTEGRATED_DUST" + obs_qty_info( 82 )%nitems = 0 + + obs_qty_info( 83 )%index = 83 + obs_qty_info( 83 )%name = "QTY_INTEGRATED_SMOKE" + obs_qty_info( 83 )%nitems = 0 + + obs_qty_info( 84 )%index = 84 + obs_qty_info( 84 )%name = "QTY_INTEGRATED_SEASALT" + obs_qty_info( 84 )%nitems = 0 + + obs_qty_info( 85 )%index = 85 + obs_qty_info( 85 )%name = "QTY_INTEGRATED_AOD" + obs_qty_info( 85 )%nitems = 0 + + obs_qty_info( 86 )%index = 86 + obs_qty_info( 86 )%name = "QTY_SO2" + obs_qty_info( 86 )%nitems = 0 + + obs_qty_info( 87 )%index = 87 + obs_qty_info( 87 )%name = "QTY_SULFATE" + obs_qty_info( 87 )%nitems = 0 + + obs_qty_info( 88 )%index = 88 + obs_qty_info( 88 )%name = "QTY_DUST" + obs_qty_info( 88 )%nitems = 0 + + obs_qty_info( 89 )%index = 89 + obs_qty_info( 89 )%name = "QTY_SMOKE" + obs_qty_info( 89 )%nitems = 0 + + obs_qty_info( 90 )%index = 90 + obs_qty_info( 90 )%name = "QTY_SEASALT" + obs_qty_info( 90 )%nitems = 0 + + obs_qty_info( 91 )%index = 91 + obs_qty_info( 91 )%name = "QTY_HAIL_MIXING_RATIO" + obs_qty_info( 91 )%nitems = 0 + + obs_qty_info( 92 )%index = 92 + obs_qty_info( 92 )%name = "QTY_HAIL_NUMBER_CONCENTR" + obs_qty_info( 92 )%nitems = 0 + + obs_qty_info( 93 )%index = 93 + obs_qty_info( 93 )%name = "QTY_GRAUPEL_VOLUME" + obs_qty_info( 93 )%nitems = 0 + + obs_qty_info( 94 )%index = 94 + obs_qty_info( 94 )%name = "QTY_HAIL_VOLUME" + obs_qty_info( 94 )%nitems = 0 + + obs_qty_info( 95 )%index = 95 + obs_qty_info( 95 )%name = "QTY_DIFFERENTIAL_REFLECTIVITY" + obs_qty_info( 95 )%nitems = 0 + + obs_qty_info( 96 )%index = 96 + obs_qty_info( 96 )%name = "QTY_SPECIFIC_DIFFERENTIAL_PHASE" + obs_qty_info( 96 )%nitems = 0 + + obs_qty_info( 97 )%index = 97 + obs_qty_info( 97 )%name = "QTY_FLASH_RATE_2D" + obs_qty_info( 97 )%nitems = 0 + + obs_qty_info( 98 )%index = 98 + obs_qty_info( 98 )%name = "QTY_RADIANCE" + obs_qty_info( 98 )%nitems = 0 + + obs_qty_info( 99 )%index = 99 + obs_qty_info( 99 )%name = "QTY_BRIGHTNESS_TEMPERATURE" + obs_qty_info( 99 )%nitems = 0 + + obs_qty_info( 100 )%index = 100 + obs_qty_info( 100 )%name = "QTY_BI_DIRECTIONAL_REFLECTANCE" + obs_qty_info( 100 )%nitems = 0 + + obs_qty_info( 101 )%index = 101 + obs_qty_info( 101 )%name = "QTY_SURFACE_TYPE" + obs_qty_info( 101 )%nitems = 0 + + obs_qty_info( 102 )%index = 102 + obs_qty_info( 102 )%name = "QTY_WIND_FETCH" + obs_qty_info( 102 )%nitems = 0 + + obs_qty_info( 103 )%index = 103 + obs_qty_info( 103 )%name = "QTY_WATER_TYPE" + obs_qty_info( 103 )%nitems = 0 + + obs_qty_info( 104 )%index = 104 + obs_qty_info( 104 )%name = "QTY_FOAM_FRAC" + obs_qty_info( 104 )%nitems = 0 + + obs_qty_info( 105 )%index = 105 + obs_qty_info( 105 )%name = "QTY_INSOLUBLE_AER" + obs_qty_info( 105 )%nitems = 0 + + obs_qty_info( 106 )%index = 106 + obs_qty_info( 106 )%name = "QTY_H2O_SOLUBLE_AER" + obs_qty_info( 106 )%nitems = 0 + + obs_qty_info( 107 )%index = 107 + obs_qty_info( 107 )%name = "QTY_SOOT" + obs_qty_info( 107 )%nitems = 0 + + obs_qty_info( 108 )%index = 108 + obs_qty_info( 108 )%name = "QTY_SEASALT_ACCUM" + obs_qty_info( 108 )%nitems = 0 + + obs_qty_info( 109 )%index = 109 + obs_qty_info( 109 )%name = "QTY_SEASALT_COARSE" + obs_qty_info( 109 )%nitems = 0 + + obs_qty_info( 110 )%index = 110 + obs_qty_info( 110 )%name = "QTY_MINERAL_NUCLEUS" + obs_qty_info( 110 )%nitems = 0 + + obs_qty_info( 111 )%index = 111 + obs_qty_info( 111 )%name = "QTY_MINERAL_ACCUM" + obs_qty_info( 111 )%nitems = 0 + + obs_qty_info( 112 )%index = 112 + obs_qty_info( 112 )%name = "QTY_MINERAL_COARSE" + obs_qty_info( 112 )%nitems = 0 + + obs_qty_info( 113 )%index = 113 + obs_qty_info( 113 )%name = "QTY_MINERAL_TRANSPORTED" + obs_qty_info( 113 )%nitems = 0 + + obs_qty_info( 114 )%index = 114 + obs_qty_info( 114 )%name = "QTY_SULPHATED_DROPS" + obs_qty_info( 114 )%nitems = 0 + + obs_qty_info( 115 )%index = 115 + obs_qty_info( 115 )%name = "QTY_VOLCANIC_ASH" + obs_qty_info( 115 )%nitems = 0 + + obs_qty_info( 116 )%index = 116 + obs_qty_info( 116 )%name = "QTY_NEW_VOLCANIC_ASH" + obs_qty_info( 116 )%nitems = 0 + + obs_qty_info( 117 )%index = 117 + obs_qty_info( 117 )%name = "QTY_ASIAN_DUST" + obs_qty_info( 117 )%nitems = 0 + + obs_qty_info( 118 )%index = 118 + obs_qty_info( 118 )%name = "QTY_BLACK_CARBON" + obs_qty_info( 118 )%nitems = 0 + + obs_qty_info( 119 )%index = 119 + obs_qty_info( 119 )%name = "QTY_DUST_BIN1" + obs_qty_info( 119 )%nitems = 0 + + obs_qty_info( 120 )%index = 120 + obs_qty_info( 120 )%name = "QTY_DUST_BIN2" + obs_qty_info( 120 )%nitems = 0 + + obs_qty_info( 121 )%index = 121 + obs_qty_info( 121 )%name = "QTY_DUST_BIN3" + obs_qty_info( 121 )%nitems = 0 + + obs_qty_info( 122 )%index = 122 + obs_qty_info( 122 )%name = "QTY_AMMONIUM_SULPHATE" + obs_qty_info( 122 )%nitems = 0 + + obs_qty_info( 123 )%index = 123 + obs_qty_info( 123 )%name = "QTY_SEA_SALT_BIN1" + obs_qty_info( 123 )%nitems = 0 + + obs_qty_info( 124 )%index = 124 + obs_qty_info( 124 )%name = "QTY_SEA_SALT_BIN2" + obs_qty_info( 124 )%nitems = 0 + + obs_qty_info( 125 )%index = 125 + obs_qty_info( 125 )%name = "QTY_SEA_SALT_BIN3" + obs_qty_info( 125 )%nitems = 0 + + obs_qty_info( 126 )%index = 126 + obs_qty_info( 126 )%name = "QTY_HYDROPHILIC_ORGANIC_MATTER" + obs_qty_info( 126 )%nitems = 0 + + obs_qty_info( 127 )%index = 127 + obs_qty_info( 127 )%name = "QTY_CLOUDWATER_DE" + obs_qty_info( 127 )%nitems = 0 + + obs_qty_info( 128 )%index = 128 + obs_qty_info( 128 )%name = "QTY_CLOUD_ICE_DE" + obs_qty_info( 128 )%nitems = 0 + + obs_qty_info( 129 )%index = 129 + obs_qty_info( 129 )%name = "QTY_COLUMN_CLOUD_FRAC" + obs_qty_info( 129 )%nitems = 0 + + obs_qty_info( 130 )%index = 130 + obs_qty_info( 130 )%name = "QTY_CLOUD_TOP_PRESSURE" + obs_qty_info( 130 )%nitems = 0 + + obs_qty_info( 131 )%index = 131 + obs_qty_info( 131 )%name = "QTY_ABSOLUTE_HUMIDITY" + obs_qty_info( 131 )%nitems = 0 + + obs_qty_info( 132 )%index = 132 + obs_qty_info( 132 )%name = "QTY_O3" + obs_qty_info( 132 )%nitems = 0 + + obs_qty_info( 133 )%index = 133 + obs_qty_info( 133 )%name = "QTY_CO2" + obs_qty_info( 133 )%nitems = 0 + + obs_qty_info( 134 )%index = 134 + obs_qty_info( 134 )%name = "QTY_N2O" + obs_qty_info( 134 )%nitems = 0 + + obs_qty_info( 135 )%index = 135 + obs_qty_info( 135 )%name = "QTY_CH4" + obs_qty_info( 135 )%nitems = 0 + + obs_qty_info( 136 )%index = 136 + obs_qty_info( 136 )%name = "QTY_CO" + obs_qty_info( 136 )%nitems = 0 + + obs_qty_info( 137 )%index = 137 + obs_qty_info( 137 )%name = "QTY_SALINITY" + obs_qty_info( 137 )%nitems = 0 + + obs_qty_info( 138 )%index = 138 + obs_qty_info( 138 )%name = "QTY_SNOWCOVER_FRAC" + obs_qty_info( 138 )%nitems = 0 + + +obs_type_info( 1) = obs_type_type(RADIOSONDE_U_WIND_COMPONENT, & + 'RADIOSONDE_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 2) = obs_type_type(RADIOSONDE_V_WIND_COMPONENT, & + 'RADIOSONDE_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 3) = obs_type_type(RADIOSONDE_GEOPOTENTIAL_HGT, & + 'RADIOSONDE_GEOPOTENTIAL_HGT', QTY_GEOPOTENTIAL_HEIGHT, .false., .false., .false.) +obs_type_info( 4) = obs_type_type(RADIOSONDE_SURFACE_PRESSURE, & + 'RADIOSONDE_SURFACE_PRESSURE', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 5) = obs_type_type(RADIOSONDE_TEMPERATURE, & + 'RADIOSONDE_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 6) = obs_type_type(RADIOSONDE_SPECIFIC_HUMIDITY, & + 'RADIOSONDE_SPECIFIC_HUMIDITY', QTY_SPECIFIC_HUMIDITY, .false., .false., .false.) +obs_type_info( 7) = obs_type_type(DROPSONDE_U_WIND_COMPONENT, & + 'DROPSONDE_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 8) = obs_type_type(DROPSONDE_V_WIND_COMPONENT, & + 'DROPSONDE_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 9) = obs_type_type(DROPSONDE_SURFACE_PRESSURE, & + 'DROPSONDE_SURFACE_PRESSURE', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 10) = obs_type_type(DROPSONDE_TEMPERATURE, & + 'DROPSONDE_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 11) = obs_type_type(DROPSONDE_SPECIFIC_HUMIDITY, & + 'DROPSONDE_SPECIFIC_HUMIDITY', QTY_SPECIFIC_HUMIDITY, .false., .false., .false.) +obs_type_info( 12) = obs_type_type(AIRCRAFT_U_WIND_COMPONENT, & + 'AIRCRAFT_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 13) = obs_type_type(AIRCRAFT_V_WIND_COMPONENT, & + 'AIRCRAFT_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 14) = obs_type_type(AIRCRAFT_TEMPERATURE, & + 'AIRCRAFT_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 15) = obs_type_type(AIRCRAFT_SPECIFIC_HUMIDITY, & + 'AIRCRAFT_SPECIFIC_HUMIDITY', QTY_SPECIFIC_HUMIDITY, .false., .false., .false.) +obs_type_info( 16) = obs_type_type(ACARS_U_WIND_COMPONENT, & + 'ACARS_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 17) = obs_type_type(ACARS_V_WIND_COMPONENT, & + 'ACARS_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 18) = obs_type_type(ACARS_TEMPERATURE, & + 'ACARS_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 19) = obs_type_type(ACARS_SPECIFIC_HUMIDITY, & + 'ACARS_SPECIFIC_HUMIDITY', QTY_SPECIFIC_HUMIDITY, .false., .false., .false.) +obs_type_info( 20) = obs_type_type(MARINE_SFC_U_WIND_COMPONENT, & + 'MARINE_SFC_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 21) = obs_type_type(MARINE_SFC_V_WIND_COMPONENT, & + 'MARINE_SFC_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 22) = obs_type_type(MARINE_SFC_TEMPERATURE, & + 'MARINE_SFC_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 23) = obs_type_type(MARINE_SFC_SPECIFIC_HUMIDITY, & + 'MARINE_SFC_SPECIFIC_HUMIDITY', QTY_SPECIFIC_HUMIDITY, .false., .false., .false.) +obs_type_info( 24) = obs_type_type(MARINE_SFC_PRESSURE, & + 'MARINE_SFC_PRESSURE', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 25) = obs_type_type(LAND_SFC_U_WIND_COMPONENT, & + 'LAND_SFC_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 26) = obs_type_type(LAND_SFC_V_WIND_COMPONENT, & + 'LAND_SFC_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 27) = obs_type_type(LAND_SFC_TEMPERATURE, & + 'LAND_SFC_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 28) = obs_type_type(LAND_SFC_SPECIFIC_HUMIDITY, & + 'LAND_SFC_SPECIFIC_HUMIDITY', QTY_SPECIFIC_HUMIDITY, .false., .false., .false.) +obs_type_info( 29) = obs_type_type(LAND_SFC_PRESSURE, & + 'LAND_SFC_PRESSURE', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 30) = obs_type_type(SAT_U_WIND_COMPONENT, & + 'SAT_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 31) = obs_type_type(SAT_V_WIND_COMPONENT, & + 'SAT_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 32) = obs_type_type(ATOV_TEMPERATURE, & + 'ATOV_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 33) = obs_type_type(AIRS_TEMPERATURE, & + 'AIRS_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 34) = obs_type_type(AIRS_SPECIFIC_HUMIDITY, & + 'AIRS_SPECIFIC_HUMIDITY', QTY_SPECIFIC_HUMIDITY, .false., .false., .false.) +obs_type_info( 35) = obs_type_type(GPS_PRECIPITABLE_WATER, & + 'GPS_PRECIPITABLE_WATER', QTY_PRECIPITABLE_WATER, .false., .false., .false.) +obs_type_info( 36) = obs_type_type(VADWND_U_WIND_COMPONENT, & + 'VADWND_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 37) = obs_type_type(VADWND_V_WIND_COMPONENT, & + 'VADWND_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 38) = obs_type_type(CIMMS_AMV_U_WIND_COMPONENT, & + 'CIMMS_AMV_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 39) = obs_type_type(CIMMS_AMV_V_WIND_COMPONENT, & + 'CIMMS_AMV_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 40) = obs_type_type(DOPPLER_RADIAL_VELOCITY, & + 'DOPPLER_RADIAL_VELOCITY', QTY_VELOCITY, .false., .false., .false.) +obs_type_info( 41) = obs_type_type(RADAR_REFLECTIVITY, & + 'RADAR_REFLECTIVITY', QTY_RADAR_REFLECTIVITY, .false., .false., .false.) +obs_type_info( 42) = obs_type_type(RADAR_CLEARAIR_REFLECTIVITY, & + 'RADAR_CLEARAIR_REFLECTIVITY', QTY_RADAR_REFLECTIVITY, .false., .false., .false.) +obs_type_info( 43) = obs_type_type(PRECIPITATION_FALL_SPEED, & + 'PRECIPITATION_FALL_SPEED', QTY_POWER_WEIGHTED_FALL_SPEED, .false., .false., .false.) +obs_type_info( 44) = obs_type_type(METAR_U_10_METER_WIND, & + 'METAR_U_10_METER_WIND', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 45) = obs_type_type(METAR_V_10_METER_WIND, & + 'METAR_V_10_METER_WIND', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 46) = obs_type_type(METAR_TEMPERATURE_2_METER, & + 'METAR_TEMPERATURE_2_METER', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 47) = obs_type_type(METAR_SPECIFIC_HUMIDITY_2_METER, & + 'METAR_SPECIFIC_HUMIDITY_2_METER', QTY_SPECIFIC_HUMIDITY, .false., .false., .false.) +obs_type_info( 48) = obs_type_type(METAR_SURFACE_PRESSURE, & + 'METAR_SURFACE_PRESSURE', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 49) = obs_type_type(METAR_POT_TEMP_2_METER, & + 'METAR_POT_TEMP_2_METER', QTY_POTENTIAL_TEMPERATURE, .false., .false., .false.) +obs_type_info( 50) = obs_type_type(DEWPOINT, & + 'DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 51) = obs_type_type(DEWPOINT_2_METER, & + 'DEWPOINT_2_METER', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 52) = obs_type_type(BUOY_DEWPOINT, & + 'BUOY_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 53) = obs_type_type(SHIP_DEWPOINT, & + 'SHIP_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 54) = obs_type_type(SYNOP_DEWPOINT, & + 'SYNOP_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 55) = obs_type_type(AIREP_DEWPOINT, & + 'AIREP_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 56) = obs_type_type(AMDAR_DEWPOINT, & + 'AMDAR_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 57) = obs_type_type(PILOT_DEWPOINT, & + 'PILOT_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 58) = obs_type_type(BOGUS_DEWPOINT, & + 'BOGUS_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 59) = obs_type_type(AIRS_DEWPOINT, & + 'AIRS_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 60) = obs_type_type(METAR_DEWPOINT_2_METER, & + 'METAR_DEWPOINT_2_METER', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 61) = obs_type_type(RADIOSONDE_DEWPOINT, & + 'RADIOSONDE_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 62) = obs_type_type(DROPSONDE_DEWPOINT, & + 'DROPSONDE_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 63) = obs_type_type(AIRCRAFT_DEWPOINT, & + 'AIRCRAFT_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 64) = obs_type_type(ACARS_DEWPOINT, & + 'ACARS_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 65) = obs_type_type(MARINE_SFC_DEWPOINT, & + 'MARINE_SFC_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 66) = obs_type_type(LAND_SFC_DEWPOINT, & + 'LAND_SFC_DEWPOINT', QTY_DEWPOINT, .false., .false., .false.) +obs_type_info( 67) = obs_type_type(RADIOSONDE_RELATIVE_HUMIDITY, & + 'RADIOSONDE_RELATIVE_HUMIDITY', QTY_RELATIVE_HUMIDITY, .false., .false., .false.) +obs_type_info( 68) = obs_type_type(DROPSONDE_RELATIVE_HUMIDITY, & + 'DROPSONDE_RELATIVE_HUMIDITY', QTY_RELATIVE_HUMIDITY, .false., .false., .false.) +obs_type_info( 69) = obs_type_type(AIRCRAFT_RELATIVE_HUMIDITY, & + 'AIRCRAFT_RELATIVE_HUMIDITY', QTY_RELATIVE_HUMIDITY, .false., .false., .false.) +obs_type_info( 70) = obs_type_type(ACARS_RELATIVE_HUMIDITY, & + 'ACARS_RELATIVE_HUMIDITY', QTY_RELATIVE_HUMIDITY, .false., .false., .false.) +obs_type_info( 71) = obs_type_type(MARINE_SFC_RELATIVE_HUMIDITY, & + 'MARINE_SFC_RELATIVE_HUMIDITY', QTY_RELATIVE_HUMIDITY, .false., .false., .false.) +obs_type_info( 72) = obs_type_type(LAND_SFC_RELATIVE_HUMIDITY, & + 'LAND_SFC_RELATIVE_HUMIDITY', QTY_RELATIVE_HUMIDITY, .false., .false., .false.) +obs_type_info( 73) = obs_type_type(METAR_RELATIVE_HUMIDITY_2_METER, & + 'METAR_RELATIVE_HUMIDITY_2_METER', QTY_RELATIVE_HUMIDITY, .false., .false., .false.) +obs_type_info( 74) = obs_type_type(AIRS_RELATIVE_HUMIDITY, & + 'AIRS_RELATIVE_HUMIDITY', QTY_RELATIVE_HUMIDITY, .false., .false., .false.) +obs_type_info( 75) = obs_type_type(MESONET_RELATIVE_HUMIDITY, & + 'MESONET_RELATIVE_HUMIDITY', QTY_RELATIVE_HUMIDITY, .false., .false., .false.) +obs_type_info( 76) = obs_type_type(RADIOSONDE_SURFACE_ALTIMETER, & + 'RADIOSONDE_SURFACE_ALTIMETER', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 77) = obs_type_type(DROPSONDE_SURFACE_ALTIMETER, & + 'DROPSONDE_SURFACE_ALTIMETER', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 78) = obs_type_type(MARINE_SFC_ALTIMETER, & + 'MARINE_SFC_ALTIMETER', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 79) = obs_type_type(LAND_SFC_ALTIMETER, & + 'LAND_SFC_ALTIMETER', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 80) = obs_type_type(METAR_ALTIMETER, & + 'METAR_ALTIMETER', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 81) = obs_type_type(MESONET_SURFACE_ALTIMETER, & + 'MESONET_SURFACE_ALTIMETER', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 82) = obs_type_type(TEMPERATURE, & + 'TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 83) = obs_type_type(SPECIFIC_HUMIDITY, & + 'SPECIFIC_HUMIDITY', QTY_SPECIFIC_HUMIDITY, .false., .false., .false.) +obs_type_info( 84) = obs_type_type(PRESSURE, & + 'PRESSURE', QTY_PRESSURE, .false., .false., .false.) +obs_type_info( 85) = obs_type_type(GPSRO_REFRACTIVITY, & + 'GPSRO_REFRACTIVITY', QTY_GPSRO, .false., .false., .false.) +obs_type_info( 86) = obs_type_type(VORTEX_LAT, & + 'VORTEX_LAT', QTY_VORTEX_LAT, .false., .false., .false.) +obs_type_info( 87) = obs_type_type(VORTEX_LON, & + 'VORTEX_LON', QTY_VORTEX_LON, .false., .false., .false.) +obs_type_info( 88) = obs_type_type(VORTEX_PMIN, & + 'VORTEX_PMIN', QTY_VORTEX_PMIN, .false., .false., .false.) +obs_type_info( 89) = obs_type_type(VORTEX_WMAX, & + 'VORTEX_WMAX', QTY_VORTEX_WMAX, .false., .false., .false.) +obs_type_info( 90) = obs_type_type(BUOY_U_WIND_COMPONENT, & + 'BUOY_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 91) = obs_type_type(BUOY_V_WIND_COMPONENT, & + 'BUOY_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 92) = obs_type_type(BUOY_SURFACE_PRESSURE, & + 'BUOY_SURFACE_PRESSURE', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 93) = obs_type_type(BUOY_TEMPERATURE, & + 'BUOY_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 94) = obs_type_type(SHIP_U_WIND_COMPONENT, & + 'SHIP_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 95) = obs_type_type(SHIP_V_WIND_COMPONENT, & + 'SHIP_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 96) = obs_type_type(SHIP_SURFACE_PRESSURE, & + 'SHIP_SURFACE_PRESSURE', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 97) = obs_type_type(SHIP_TEMPERATURE, & + 'SHIP_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 98) = obs_type_type(SYNOP_U_WIND_COMPONENT, & + 'SYNOP_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 99) = obs_type_type(SYNOP_V_WIND_COMPONENT, & + 'SYNOP_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 100) = obs_type_type(SYNOP_SURFACE_PRESSURE, & + 'SYNOP_SURFACE_PRESSURE', QTY_SURFACE_PRESSURE, .false., .false., .false.) +obs_type_info( 101) = obs_type_type(SYNOP_SPECIFIC_HUMIDITY, & + 'SYNOP_SPECIFIC_HUMIDITY', QTY_SPECIFIC_HUMIDITY, .false., .false., .false.) +obs_type_info( 102) = obs_type_type(SYNOP_TEMPERATURE, & + 'SYNOP_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 103) = obs_type_type(AIREP_U_WIND_COMPONENT, & + 'AIREP_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 104) = obs_type_type(AIREP_V_WIND_COMPONENT, & + 'AIREP_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 105) = obs_type_type(AIREP_PRESSURE, & + 'AIREP_PRESSURE', QTY_PRESSURE, .false., .false., .false.) +obs_type_info( 106) = obs_type_type(AIREP_TEMPERATURE, & + 'AIREP_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 107) = obs_type_type(AMDAR_U_WIND_COMPONENT, & + 'AMDAR_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 108) = obs_type_type(AMDAR_V_WIND_COMPONENT, & + 'AMDAR_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 109) = obs_type_type(AMDAR_PRESSURE, & + 'AMDAR_PRESSURE', QTY_PRESSURE, .false., .false., .false.) +obs_type_info( 110) = obs_type_type(AMDAR_TEMPERATURE, & + 'AMDAR_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 111) = obs_type_type(PILOT_U_WIND_COMPONENT, & + 'PILOT_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 112) = obs_type_type(PILOT_V_WIND_COMPONENT, & + 'PILOT_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 113) = obs_type_type(PILOT_PRESSURE, & + 'PILOT_PRESSURE', QTY_PRESSURE, .false., .false., .false.) +obs_type_info( 114) = obs_type_type(PILOT_TEMPERATURE, & + 'PILOT_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 115) = obs_type_type(BOGUS_U_WIND_COMPONENT, & + 'BOGUS_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 116) = obs_type_type(BOGUS_V_WIND_COMPONENT, & + 'BOGUS_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 117) = obs_type_type(BOGUS_PRESSURE, & + 'BOGUS_PRESSURE', QTY_PRESSURE, .false., .false., .false.) +obs_type_info( 118) = obs_type_type(BOGUS_TEMPERATURE, & + 'BOGUS_TEMPERATURE', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 119) = obs_type_type(PROFILER_U_WIND_COMPONENT, & + 'PROFILER_U_WIND_COMPONENT', QTY_U_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 120) = obs_type_type(PROFILER_V_WIND_COMPONENT, & + 'PROFILER_V_WIND_COMPONENT', QTY_V_WIND_COMPONENT, .false., .false., .false.) +obs_type_info( 121) = obs_type_type(PROFILER_PRESSURE, & + 'PROFILER_PRESSURE', QTY_PRESSURE, .false., .false., .false.) +obs_type_info( 122) = obs_type_type(SATEM_THICKNESS, & + 'SATEM_THICKNESS', QTY_TEMPERATURE, .false., .false., .false.) +obs_type_info( 123) = obs_type_type(NOAA_1_VTPR1_RADIANCE, & + 'NOAA_1_VTPR1_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 124) = obs_type_type(NOAA_2_VTPR1_RADIANCE, & + 'NOAA_2_VTPR1_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 125) = obs_type_type(NOAA_3_VTPR1_RADIANCE, & + 'NOAA_3_VTPR1_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 126) = obs_type_type(NOAA_4_VTPR1_RADIANCE, & + 'NOAA_4_VTPR1_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 127) = obs_type_type(NOAA_5_HIRS_RADIANCE, & + 'NOAA_5_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 128) = obs_type_type(NOAA_5_MSU_TB, & + 'NOAA_5_MSU_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 129) = obs_type_type(NOAA_5_AVHRR_RADIANCE, & + 'NOAA_5_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 130) = obs_type_type(NOAA_6_HIRS_RADIANCE, & + 'NOAA_6_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 131) = obs_type_type(NOAA_6_MSU_TB, & + 'NOAA_6_MSU_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 132) = obs_type_type(NOAA_6_AVHRR_RADIANCE, & + 'NOAA_6_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 133) = obs_type_type(NOAA_7_HIRS_RADIANCE, & + 'NOAA_7_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 134) = obs_type_type(NOAA_7_MSU_TB, & + 'NOAA_7_MSU_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 135) = obs_type_type(NOAA_7_AVHRR_RADIANCE, & + 'NOAA_7_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 136) = obs_type_type(NOAA_8_HIRS_RADIANCE, & + 'NOAA_8_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 137) = obs_type_type(NOAA_8_MSU_TB, & + 'NOAA_8_MSU_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 138) = obs_type_type(NOAA_8_AVHRR_RADIANCE, & + 'NOAA_8_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 139) = obs_type_type(NOAA_9_HIRS_RADIANCE, & + 'NOAA_9_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 140) = obs_type_type(NOAA_9_MSU_TB, & + 'NOAA_9_MSU_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 141) = obs_type_type(NOAA_9_AVHRR_RADIANCE, & + 'NOAA_9_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 142) = obs_type_type(NOAA_10_HIRS_RADIANCE, & + 'NOAA_10_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 143) = obs_type_type(NOAA_10_MSU_TB, & + 'NOAA_10_MSU_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 144) = obs_type_type(NOAA_10_AVHRR_RADIANCE, & + 'NOAA_10_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 145) = obs_type_type(NOAA_11_HIRS_RADIANCE, & + 'NOAA_11_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 146) = obs_type_type(NOAA_11_MSU_TB, & + 'NOAA_11_MSU_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 147) = obs_type_type(NOAA_11_AVHRR_RADIANCE, & + 'NOAA_11_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 148) = obs_type_type(NOAA_12_HIRS_RADIANCE, & + 'NOAA_12_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 149) = obs_type_type(NOAA_12_MSU_TB, & + 'NOAA_12_MSU_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 150) = obs_type_type(NOAA_12_AVHRR_RADIANCE, & + 'NOAA_12_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 151) = obs_type_type(NOAA_13_AVHRR_RADIANCE, & + 'NOAA_13_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 152) = obs_type_type(NOAA_14_HIRS_RADIANCE, & + 'NOAA_14_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 153) = obs_type_type(NOAA_14_MSU_TB, & + 'NOAA_14_MSU_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 154) = obs_type_type(NOAA_14_AVHRR_RADIANCE, & + 'NOAA_14_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 155) = obs_type_type(NOAA_15_HIRS_RADIANCE, & + 'NOAA_15_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 156) = obs_type_type(NOAA_15_AMSUA_TB, & + 'NOAA_15_AMSUA_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 157) = obs_type_type(NOAA_15_AMSUB_TB, & + 'NOAA_15_AMSUB_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 158) = obs_type_type(NOAA_15_AVHRR_RADIANCE, & + 'NOAA_15_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 159) = obs_type_type(NOAA_16_HIRS_RADIANCE, & + 'NOAA_16_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 160) = obs_type_type(NOAA_16_AMSUA_TB, & + 'NOAA_16_AMSUA_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 161) = obs_type_type(NOAA_16_AMSUB_TB, & + 'NOAA_16_AMSUB_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 162) = obs_type_type(NOAA_16_AVHRR_RADIANCE, & + 'NOAA_16_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 163) = obs_type_type(NOAA_17_HIRS_RADIANCE, & + 'NOAA_17_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 164) = obs_type_type(NOAA_17_AMSUA_TB, & + 'NOAA_17_AMSUA_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 165) = obs_type_type(NOAA_17_AMSUB_TB, & + 'NOAA_17_AMSUB_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 166) = obs_type_type(NOAA_17_AVHRR_RADIANCE, & + 'NOAA_17_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 167) = obs_type_type(NOAA_18_HIRS_RADIANCE, & + 'NOAA_18_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 168) = obs_type_type(NOAA_18_AMSUA_TB, & + 'NOAA_18_AMSUA_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 169) = obs_type_type(NOAA_18_AVHRR_RADIANCE, & + 'NOAA_18_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 170) = obs_type_type(NOAA_18_MHS_TB, & + 'NOAA_18_MHS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 171) = obs_type_type(NOAA_19_HIRS_RADIANCE, & + 'NOAA_19_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 172) = obs_type_type(NOAA_19_AMSUA_TB, & + 'NOAA_19_AMSUA_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 173) = obs_type_type(NOAA_19_AVHRR_RADIANCE, & + 'NOAA_19_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 174) = obs_type_type(NOAA_19_MHS_TB, & + 'NOAA_19_MHS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 175) = obs_type_type(NOAA_20_ATMS_TB, & + 'NOAA_20_ATMS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 176) = obs_type_type(NOAA_20_VIIRS_RADIANCE, & + 'NOAA_20_VIIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 177) = obs_type_type(DMSP_8_SSMI_TB, & + 'DMSP_8_SSMI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 178) = obs_type_type(DMSP_9_SSMI_TB, & + 'DMSP_9_SSMI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 179) = obs_type_type(DMSP_10_SSMI_TB, & + 'DMSP_10_SSMI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 180) = obs_type_type(DMSP_11_SSMI_TB, & + 'DMSP_11_SSMI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 181) = obs_type_type(DMSP_11_SSMT2_TB, & + 'DMSP_11_SSMT2_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 182) = obs_type_type(DMSP_12_SSMI_TB, & + 'DMSP_12_SSMI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 183) = obs_type_type(DMSP_12_SSMT2_TB, & + 'DMSP_12_SSMT2_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 184) = obs_type_type(DMSP_13_SSMI_TB, & + 'DMSP_13_SSMI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 185) = obs_type_type(DMSP_14_SSMI_TB, & + 'DMSP_14_SSMI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 186) = obs_type_type(DMSP_14_SSMT2_TB, & + 'DMSP_14_SSMT2_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 187) = obs_type_type(DMSP_15_SSMI_TB, & + 'DMSP_15_SSMI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 188) = obs_type_type(DMSP_15_SSMT2_TB, & + 'DMSP_15_SSMT2_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 189) = obs_type_type(DMSP_16_SSMIS_TB, & + 'DMSP_16_SSMIS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 190) = obs_type_type(DMSP_17_SSMIS_TB, & + 'DMSP_17_SSMIS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 191) = obs_type_type(DMSP_18_SSMIS_TB, & + 'DMSP_18_SSMIS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 192) = obs_type_type(DMSP_19_SSMIS_TB, & + 'DMSP_19_SSMIS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 193) = obs_type_type(METEOSAT_1_MVIRI_RADIANCE, & + 'METEOSAT_1_MVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 194) = obs_type_type(METEOSAT_2_MVIRI_RADIANCE, & + 'METEOSAT_2_MVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 195) = obs_type_type(METEOSAT_3_MVIRI_RADIANCE, & + 'METEOSAT_3_MVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 196) = obs_type_type(METEOSAT_4_MVIRI_RADIANCE, & + 'METEOSAT_4_MVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 197) = obs_type_type(METEOSAT_5_MVIRI_RADIANCE, & + 'METEOSAT_5_MVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 198) = obs_type_type(METEOSAT_6_MVIRI_RADIANCE, & + 'METEOSAT_6_MVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 199) = obs_type_type(METEOSAT_7_MVIRI_RADIANCE, & + 'METEOSAT_7_MVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 200) = obs_type_type(GOES_4_SOUNDER_RADIANCE, & + 'GOES_4_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 201) = obs_type_type(GOES_5_SOUNDER_RADIANCE, & + 'GOES_5_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 202) = obs_type_type(GOES_6_SOUNDER_RADIANCE, & + 'GOES_6_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 203) = obs_type_type(GOES_7_SOUNDER_RADIANCE, & + 'GOES_7_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 204) = obs_type_type(GOES_8_IMAGER_RADIANCE, & + 'GOES_8_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 205) = obs_type_type(GOES_8_SOUNDER_RADIANCE, & + 'GOES_8_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 206) = obs_type_type(GOES_9_IMAGER_RADIANCE, & + 'GOES_9_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 207) = obs_type_type(GOES_9_SOUNDER_RADIANCE, & + 'GOES_9_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 208) = obs_type_type(GOES_10_IMAGER_RADIANCE, & + 'GOES_10_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 209) = obs_type_type(GOES_10_SOUNDER_RADIANCE, & + 'GOES_10_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 210) = obs_type_type(GOES_11_IMAGER_RADIANCE, & + 'GOES_11_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 211) = obs_type_type(GOES_11_SOUNDER_RADIANCE, & + 'GOES_11_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 212) = obs_type_type(GOES_12_IMAGER_RADIANCE, & + 'GOES_12_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 213) = obs_type_type(GOES_12_SOUNDER_RADIANCE, & + 'GOES_12_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 214) = obs_type_type(GOES_13_IMAGER_RADIANCE, & + 'GOES_13_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 215) = obs_type_type(GOES_13_SOUNDER_RADIANCE, & + 'GOES_13_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 216) = obs_type_type(GOES_14_IMAGER_RADIANCE, & + 'GOES_14_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 217) = obs_type_type(GOES_14_SOUNDER_RADIANCE, & + 'GOES_14_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 218) = obs_type_type(GOES_15_IMAGER_RADIANCE, & + 'GOES_15_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 219) = obs_type_type(GOES_15_SOUNDER_RADIANCE, & + 'GOES_15_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 220) = obs_type_type(GOES_16_ABI_RADIANCE, & + 'GOES_16_ABI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 221) = obs_type_type(GOES_17_ABI_RADIANCE, & + 'GOES_17_ABI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 222) = obs_type_type(GOES_18_ABI_RADIANCE, & + 'GOES_18_ABI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 223) = obs_type_type(GOES_19_ABI_RADIANCE, & + 'GOES_19_ABI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 224) = obs_type_type(GMS_1_IMAGER_RADIANCE, & + 'GMS_1_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 225) = obs_type_type(GMS_2_IMAGER_RADIANCE, & + 'GMS_2_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 226) = obs_type_type(GMS_3_IMAGER_RADIANCE, & + 'GMS_3_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 227) = obs_type_type(GMS_4_IMAGER_RADIANCE, & + 'GMS_4_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 228) = obs_type_type(GMS_5_IMAGER_RADIANCE, & + 'GMS_5_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 229) = obs_type_type(FY2_2_VISSR_RADIANCE, & + 'FY2_2_VISSR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 230) = obs_type_type(FY2_3_VISSR_RADIANCE, & + 'FY2_3_VISSR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 231) = obs_type_type(FY2_4_VISSR_RADIANCE, & + 'FY2_4_VISSR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 232) = obs_type_type(FY2_5_VISSR_RADIANCE, & + 'FY2_5_VISSR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 233) = obs_type_type(FY2_7_VISSR_RADIANCE, & + 'FY2_7_VISSR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 234) = obs_type_type(TRMM_1_TMI_TB, & + 'TRMM_1_TMI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 235) = obs_type_type(ERS_1_ATSR_RADIANCE, & + 'ERS_1_ATSR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 236) = obs_type_type(ERS_1_MWR_TB, & + 'ERS_1_MWR_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 237) = obs_type_type(ERS_2_ATSR_RADIANCE, & + 'ERS_2_ATSR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 238) = obs_type_type(ERS_2_MWR_TB, & + 'ERS_2_MWR_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 239) = obs_type_type(EOS_1_MODIS_RADIANCE, & + 'EOS_1_MODIS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 240) = obs_type_type(EOS_1_ASTER_RADIANCE, & + 'EOS_1_ASTER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 241) = obs_type_type(EOS_2_AMSUA_TB, & + 'EOS_2_AMSUA_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 242) = obs_type_type(EOS_2_AIRS_RADIANCE, & + 'EOS_2_AIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 243) = obs_type_type(EOS_2_HSB_TB, & + 'EOS_2_HSB_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 244) = obs_type_type(EOS_2_MODIS_RADIANCE, & + 'EOS_2_MODIS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 245) = obs_type_type(EOS_2_AMSRE_TB, & + 'EOS_2_AMSRE_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 246) = obs_type_type(METOP_1_HIRS_RADIANCE, & + 'METOP_1_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 247) = obs_type_type(METOP_1_AMSUA_TB, & + 'METOP_1_AMSUA_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 248) = obs_type_type(METOP_1_AVHRR_RADIANCE, & + 'METOP_1_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 249) = obs_type_type(METOP_1_MHS_TB, & + 'METOP_1_MHS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 250) = obs_type_type(METOP_2_HIRS_RADIANCE, & + 'METOP_2_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 251) = obs_type_type(METOP_2_AMSUA_TB, & + 'METOP_2_AMSUA_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 252) = obs_type_type(METOP_2_AVHRR_RADIANCE, & + 'METOP_2_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 253) = obs_type_type(METOP_2_MHS_TB, & + 'METOP_2_MHS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 254) = obs_type_type(METOP_3_AVHRR_RADIANCE, & + 'METOP_3_AVHRR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 255) = obs_type_type(ENVISAT_1_ATSR_RADIANCE, & + 'ENVISAT_1_ATSR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 256) = obs_type_type(ENVISAT_1_MWR_TB, & + 'ENVISAT_1_MWR_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 257) = obs_type_type(MSG_1_SEVIRI_RADIANCE, & + 'MSG_1_SEVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 258) = obs_type_type(MSG_2_SEVIRI_RADIANCE, & + 'MSG_2_SEVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 259) = obs_type_type(MSG_3_SEVIRI_RADIANCE, & + 'MSG_3_SEVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 260) = obs_type_type(MSG_4_SEVIRI_RADIANCE, & + 'MSG_4_SEVIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 261) = obs_type_type(MSG_4_SEVIRI_TB, & + 'MSG_4_SEVIRI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 262) = obs_type_type(MSG_4_SEVIRI_BDRF, & + 'MSG_4_SEVIRI_BDRF', QTY_BI_DIRECTIONAL_REFLECTANCE, .false., .false., .false.) +obs_type_info( 263) = obs_type_type(FY1_3_MVISR_RADIANCE, & + 'FY1_3_MVISR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 264) = obs_type_type(FY1_4_MVISR_RADIANCE, & + 'FY1_4_MVISR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 265) = obs_type_type(MTSAT_1_IMAGER_RADIANCE, & + 'MTSAT_1_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 266) = obs_type_type(MTSAT_2_IMAGER_RADIANCE, & + 'MTSAT_2_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 267) = obs_type_type(CORIOLIS_1_WINDSAT_TB, & + 'CORIOLIS_1_WINDSAT_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 268) = obs_type_type(JPSS_0_ATMS_TB, & + 'JPSS_0_ATMS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 269) = obs_type_type(JPSS_0_VIIRS_RADIANCE, & + 'JPSS_0_VIIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 270) = obs_type_type(SENTINEL3_1_SLSTR_RADIANCE, & + 'SENTINEL3_1_SLSTR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 271) = obs_type_type(SENTINEL3_2_SLSTR_RADIANCE, & + 'SENTINEL3_2_SLSTR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 272) = obs_type_type(MEGHATR_1_SAPHIR_TB, & + 'MEGHATR_1_SAPHIR_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 273) = obs_type_type(MEGHATR_1_MADRAS_TB, & + 'MEGHATR_1_MADRAS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 274) = obs_type_type(FY3_1_MWTS_TB, & + 'FY3_1_MWTS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 275) = obs_type_type(FY3_1_MWHS_TB, & + 'FY3_1_MWHS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 276) = obs_type_type(FY3_1_IRAS_RADIANCE, & + 'FY3_1_IRAS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 277) = obs_type_type(FY3_1_MWRI_TB, & + 'FY3_1_MWRI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 278) = obs_type_type(FY3_2_MWTS_TB, & + 'FY3_2_MWTS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 279) = obs_type_type(FY3_2_MWHS_TB, & + 'FY3_2_MWHS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 280) = obs_type_type(FY3_2_MWRI_TB, & + 'FY3_2_MWRI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 281) = obs_type_type(FY3_3_MWRI_TB, & + 'FY3_3_MWRI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 282) = obs_type_type(FY3_3_MWTS2_TB, & + 'FY3_3_MWTS2_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 283) = obs_type_type(FY3_3_MWHS2_TB, & + 'FY3_3_MWHS2_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 284) = obs_type_type(FY3_3_MERSI1_RADIANCE, & + 'FY3_3_MERSI1_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 285) = obs_type_type(FY3_4_MWRI_TB, & + 'FY3_4_MWRI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 286) = obs_type_type(FY3_4_MWTS2_TB, & + 'FY3_4_MWTS2_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 287) = obs_type_type(FY3_4_MWHS2_TB, & + 'FY3_4_MWHS2_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 288) = obs_type_type(FY3_4_MERSI2_RADIANCE, & + 'FY3_4_MERSI2_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 289) = obs_type_type(COMS_1_MI_RADIANCE, & + 'COMS_1_MI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 290) = obs_type_type(METEOR_M_1_MSUMR_RADIANCE, & + 'METEOR_M_1_MSUMR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 291) = obs_type_type(METEOR_M_2_MSUMR_RADIANCE, & + 'METEOR_M_2_MSUMR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 292) = obs_type_type(METEOR_M_2_MTVZAGY_TB, & + 'METEOR_M_2_MTVZAGY_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 293) = obs_type_type(CALIPSO_1_IIR_RADIANCE, & + 'CALIPSO_1_IIR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 294) = obs_type_type(GCOM_W_1_AMSR2_TB, & + 'GCOM_W_1_AMSR2_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 295) = obs_type_type(NIMBUS_3_MRIR_RADIANCE, & + 'NIMBUS_3_MRIR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 296) = obs_type_type(NIMBUS_4_THIR_RADIANCE, & + 'NIMBUS_4_THIR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 297) = obs_type_type(NIMBUS_5_THIR_RADIANCE, & + 'NIMBUS_5_THIR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 298) = obs_type_type(NIMBUS_6_HIRS_RADIANCE, & + 'NIMBUS_6_HIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 299) = obs_type_type(NIMBUS_6_SCAMS_TB, & + 'NIMBUS_6_SCAMS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 300) = obs_type_type(NIMBUS_6_THIR_RADIANCE, & + 'NIMBUS_6_THIR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 301) = obs_type_type(NIMBUS_7_SMMR_TB, & + 'NIMBUS_7_SMMR_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 302) = obs_type_type(NIMBUS_7_THIR_RADIANCE, & + 'NIMBUS_7_THIR_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 303) = obs_type_type(HIMAWARI_8_AHI_RADIANCE, & + 'HIMAWARI_8_AHI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 304) = obs_type_type(HIMAWARI_9_AHI_RADIANCE, & + 'HIMAWARI_9_AHI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 305) = obs_type_type(MTG_1_FCI_RADIANCE, & + 'MTG_1_FCI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 306) = obs_type_type(SARAL_1_ALTIKA_TB, & + 'SARAL_1_ALTIKA_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 307) = obs_type_type(METOPSG_1_ICI_TB, & + 'METOPSG_1_ICI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 308) = obs_type_type(METOPSG_1_METIMAGE_RADIANCE, & + 'METOPSG_1_METIMAGE_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 309) = obs_type_type(METOPSG_1_MWS_TB, & + 'METOPSG_1_MWS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 310) = obs_type_type(METOPSG_1_MWI_TB, & + 'METOPSG_1_MWI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 311) = obs_type_type(LANDSAT_4_TM_RADIANCE, & + 'LANDSAT_4_TM_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 312) = obs_type_type(LANDSAT_5_TM_RADIANCE, & + 'LANDSAT_5_TM_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 313) = obs_type_type(LANDSAT_7_TM_RADIANCE, & + 'LANDSAT_7_TM_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 314) = obs_type_type(LANDSAT_8_TIRS_RADIANCE, & + 'LANDSAT_8_TIRS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 315) = obs_type_type(JASON_2_AMR_TB, & + 'JASON_2_AMR_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 316) = obs_type_type(GPM_1_GMI_TB, & + 'GPM_1_GMI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 317) = obs_type_type(GPM_1_DPR_TB, & + 'GPM_1_DPR_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 318) = obs_type_type(INSAT3_4_IMAGER_RADIANCE, & + 'INSAT3_4_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 319) = obs_type_type(INSAT3_4_SOUNDER_RADIANCE, & + 'INSAT3_4_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 320) = obs_type_type(INSAT3_5_IMAGER_RADIANCE, & + 'INSAT3_5_IMAGER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 321) = obs_type_type(INSAT3_5_SOUNDER_RADIANCE, & + 'INSAT3_5_SOUNDER_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 322) = obs_type_type(TICFIRE_1_MBFIRI_RADIANCE, & + 'TICFIRE_1_MBFIRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 323) = obs_type_type(ISS_1_ECOSTRES_RADIANCE, & + 'ISS_1_ECOSTRES_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 324) = obs_type_type(HJ1_2_IRMSS_RADIANCE, & + 'HJ1_2_IRMSS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 325) = obs_type_type(GKOMPSAT2_1_AMI_RADIANCE, & + 'GKOMPSAT2_1_AMI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 326) = obs_type_type(GCOM_C_1_SGLI_RADIANCE, & + 'GCOM_C_1_SGLI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 327) = obs_type_type(SMOS_1_MIRAS_TB, & + 'SMOS_1_MIRAS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 328) = obs_type_type(ORS_6_COWVR_TB, & + 'ORS_6_COWVR_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 329) = obs_type_type(FY4_1_AGRI_RADIANCE, & + 'FY4_1_AGRI_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 330) = obs_type_type(TROPICS_0_TROPICS_TB, & + 'TROPICS_0_TROPICS_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 331) = obs_type_type(GF5_1_VIMS_RADIANCE, & + 'GF5_1_VIMS_RADIANCE', QTY_RADIANCE, .false., .false., .false.) +obs_type_info( 332) = obs_type_type(HY2_1_MWRI_TB, & + 'HY2_1_MWRI_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) +obs_type_info( 333) = obs_type_type(CLOUDSAT_1_CPR_TB, & + 'CLOUDSAT_1_CPR_TB', QTY_BRIGHTNESS_TEMPERATURE, .false., .false., .false.) + + +! Default for all obs is to not assimilate or evaluate. +! Count up number being assimilated and evaluated here. + +num_types_assimilate = 0 +do i = 1, max_defined_types_of_obs + if(assimilate_these_obs_types(i) == 'null' .or. len_trim(assimilate_these_obs_types(i)) == 0 ) exit + num_types_assimilate = i +end do + +num_types_evaluate = 0 +do i = 1, max_defined_types_of_obs + if(evaluate_these_obs_types(i) == 'null' .or. len_trim(evaluate_these_obs_types(i)) == 0) exit + num_types_evaluate = i +end do + +! Special case when all obs_types should use precomputed_FOs +if( any(use_precomputed_FOs_these_obs_types .eq. 'all') ) then + num_types_use_precomputed_FOs = num_types_assimilate + num_types_evaluate + j = 1 + if ( num_types_assimilate > 0 ) then + use_precomputed_FOs_these_obs_types(j:num_types_assimilate) = assimilate_these_obs_types(1:num_types_assimilate) + j = j + num_types_assimilate + endif + if ( num_types_evaluate > 0 ) use_precomputed_FOs_these_obs_types(j:num_types_use_precomputed_FOs) = evaluate_these_obs_types(1:num_types_evaluate) +else + num_types_use_precomputed_FOs = 0 + do i = 1, max_defined_types_of_obs + if(use_precomputed_FOs_these_obs_types(i) == 'null' .or. len_trim(use_precomputed_FOs_these_obs_types(i)) == 0) exit + num_types_use_precomputed_FOs = i + end do +endif + +if (do_output() .and. (num_types_assimilate > 0 .or. & + num_types_evaluate > 0 .or. & + num_types_use_precomputed_FOs > 0 )) then + call log_it('') + call log_it('Assimilate_these_obs_types:') + if (num_types_assimilate < 1) then + call log_it(' none') + else + do i = 1, num_types_assimilate + call log_it(' '//trim(assimilate_these_obs_types(i))) + enddo + endif + + call log_it('Evaluate_these_obs_types:') + if (num_types_evaluate <1) then + call log_it(' none') + else + do i = 1, num_types_evaluate + call log_it(' '//trim(evaluate_these_obs_types(i))) + enddo + endif + + call log_it('Use the precomputed Prior Forward Operators for these obs types:') + if (num_types_use_precomputed_FOs <1) then + call log_it(' none') + else + do i = 1, num_types_use_precomputed_FOs + call log_it(' '//trim(use_precomputed_FOs_these_obs_types(i))) + enddo + endif + call log_it('') +endif + + +! Figure out which types are being used, look for errors +! Start by loading up types to assimilate +if (num_types_assimilate > 0) then + do i = 1, num_types_assimilate + ! Search for the matching string + do j = 1, max_defined_types_of_obs + if(assimilate_these_obs_types(i) == obs_type_info(j)%name) then + obs_type_info(j)%assimilate = .true. + goto 44 + endif + end do + ! Falling off the end is an error + write(err_string, *) '"',trim(assimilate_these_obs_types(i)), & + '" from obs_kind_nml::assimilate_these_obs_types is not a legal observation type' + call error_handler(E_ERR, routine, err_string, source) + 44 continue + end do +endif + +! Now look for types to evaluate +if (num_types_evaluate > 0) then + do i = 1, num_types_evaluate + ! Search for the matching string + do j = 1, max_defined_types_of_obs + if(evaluate_these_obs_types(i) == obs_type_info(j)%name) then + obs_type_info(j)%evaluate = .true. + goto 55 + endif + end do + ! Falling off the end is an error + write(err_string, *) '"',trim(evaluate_these_obs_types(i)), & + '" from obs_kind_nml::evaluate_these_obs_types is not a legal observation type' + call error_handler(E_ERR, routine, err_string, source) + 55 continue + end do +endif + +if (num_types_use_precomputed_FOs > 0) then + do i = 1, num_types_use_precomputed_FOs + ! Search for the matching string + do j = 1, max_defined_types_of_obs + if(use_precomputed_FOs_these_obs_types(i) == obs_type_info(j)%name) then + obs_type_info(j)%use_precomputed_FO = .true. + goto 66 + endif + end do + ! Falling off the end is an error + write(err_string, *) '"',trim(use_precomputed_FOs_these_obs_types(i)), & + '" from obs_kind_nml::use_precomputed_FOs_these_obs_types is not a legal observation type' + call error_handler(E_ERR, routine, err_string, source) + 66 continue + end do +endif + +! Make it an error to ask to assimilate AND evaluate the same obs kind +do i = 1, max_defined_types_of_obs + if(obs_type_info(i)%evaluate .and. obs_type_info(i)%assimilate) then + write(err_string, *) 'Illegal to both evaluate and assimilate same type ', & + trim(obs_type_info(i)%name) + call error_handler(E_ERR, routine, err_string, source) + endif +end do + +end subroutine initialize_module + +!--------------------------------------------------------------------------- + +function map_type_of_obs_table(obs_def_index) + +! Argument is the index from the obs_def; needs to be mapped to the appropriate +! Integer storage index +integer, intent(in) :: obs_def_index +integer :: map_type_of_obs_table + +character(len = 169) :: err_string +integer :: i +character(len=*), parameter :: routine = "map_type_of_obs_table" + +if ( .not. module_initialized ) call initialize_module + +! Need to search through the first map column to find this obs_def_index value +! Then return the index into table in this module from corresponding row in +! second column. +do i = 1, max_defined_types_of_obs + if(toc_mod_type_map%toc_type_index(i) == obs_def_index) then + map_type_of_obs_table = toc_mod_type_map%mod_type_index(i) + return + endif +end do + +! Error, didn't find this obs_def_index in the map +write(err_string, *) 'Could not find obs type index ', obs_def_index, & + ' in current type list compiled in this program' +call error_handler(E_ERR, routine, err_string, source) + +end function map_type_of_obs_table + +!---------------------------------------------------------------------------- + +function get_name_for_type_of_obs(obs_type_ind) + +! Returns observation type name + +integer, intent(in) :: obs_type_ind +character(len=obstypelength) :: get_name_for_type_of_obs +character(len=*), parameter :: routine = 'get_name_for_type_of_obs' + +if ( .not. module_initialized ) call initialize_module + +call validate_obs_type_index(obs_type_ind, routine) + +get_name_for_type_of_obs = obs_type_info(obs_type_ind)%name + +end function get_name_for_type_of_obs + +!---------------------------------------------------------------------------- +! Added by TRW to handle matching RAW variable types to their strings +! as well as the derived types - this will make the restart file +! handling more readable. + +function get_name_for_quantity(obs_qty_ind) + +! Returns observation quantity name + +integer, intent(in) :: obs_qty_ind +character(len=obstypelength) :: get_name_for_quantity + +character(len=*), parameter :: routine = 'get_name_for_quantity' + +if (.not. module_initialized) call initialize_module + +call validate_obs_qty_index(obs_qty_ind, routine) + +get_name_for_quantity = obs_qty_info(obs_qty_ind)%name + +end function get_name_for_quantity +!---------------------------------------------------------------------------- + +function get_index_for_type_of_obs(obs_type_name) + +! Returns the integer index corresponding to an observation type string name +! Returns a -1 if this string is not in list + +character(len = *), intent(in) :: obs_type_name +integer :: get_index_for_type_of_obs + +integer :: i +character(len=*), parameter :: routine = 'get_index_for_type_of_obs' + +if ( .not. module_initialized ) call initialize_module + +!>@todo FIXME binary search on a sorted list? + +do i = 1, max_defined_types_of_obs + if(obs_type_name == obs_type_info(i)%name) then + get_index_for_type_of_obs = i + return + endif +end do + +get_index_for_type_of_obs = -1 + +end function get_index_for_type_of_obs + +!---------------------------------------------------------------------------- +! Added by TRW to handle matching RAW variable types to their strings +! as well as the derived types - this will make the restart file +! handling more readable. + +function get_index_for_quantity(obs_qty_name) + +! Returns the integer index corresponding to an observation quantity string name +! Returns a -1 if this string is not in list + +character(len=*), intent(in) :: obs_qty_name +integer :: get_index_for_quantity + +integer :: i +character(len=*), parameter :: routine = 'get_index_for_quantity' + +if (.not. module_initialized) call initialize_module + +do i = 0, max_defined_quantities + if(obs_qty_name == obs_qty_info(i)%name) then + get_index_for_quantity = i + return + end if +end do + +get_index_for_quantity = -1 + +end function get_index_for_quantity + +!---------------------------------------------------------------------------- +! Add a name/value pair to this quantity. +! Error if index out of range +! +! FIXME: find a better identifier than 'item' here? meta something? + +subroutine set_namevalue_for_quantity(obs_qty_ind, itemname, itemvalue) + +integer, intent(in) :: obs_qty_ind +character(len=*), intent(in) :: itemname +character(len=*), intent(in) :: itemvalue + +integer :: i +character(len=*), parameter :: routine = 'set_namevalue_for_quantity' + +if (.not. module_initialized) call initialize_module + +call validate_obs_qty_index(obs_qty_ind, routine) + +call validate_metadata_strings(obs_qty_ind, itemname, itemvalue) + +! FIXME: are replicated names an error? +! they could replace existing value for that name; or error out. + +do i=1, obs_qty_info(obs_qty_ind)%nitems + if (obs_qty_info(obs_qty_ind)%itemname(i) == itemname) then + ! item already found - do what? replace + obs_qty_info(obs_qty_ind)%itemvalue(i) = itemvalue + ! or error out? + ! call error_handler() + return + endif +enddo + +! add new entry +i = obs_qty_info(obs_qty_ind)%nitems + 1 +obs_qty_info(obs_qty_ind)%nitems = i +obs_qty_info(obs_qty_ind)%itemname(i) = itemname +obs_qty_info(obs_qty_ind)%itemvalue(i) = itemvalue + +end subroutine set_namevalue_for_quantity + +!---------------------------------------------------------------------------- +! Get number of name/value items for quantity +! Error if qty index out of range + +! (FIXME: terminology: metadata vs item vs ??) + +function get_num_items_for_quantity(obs_qty_ind) + +integer, intent(in) :: obs_qty_ind +integer :: get_num_items_for_quantity + +integer :: i +character(len=*), parameter :: routine = 'get_num_items_for_quantity' + +if (.not. module_initialized) call initialize_module + +call validate_obs_qty_index(obs_qty_ind, routine) + +get_num_items_for_quantity = obs_qty_info(obs_qty_ind)%nitems + +end function get_num_items_for_quantity + +!---------------------------------------------------------------------------- +! Get string value for item name by index for quantity of name/value pair +! Error if qty index out of range +! Error if item index out of range + +! (FIXME: terminology: metadata vs item vs ??) + +function get_itemname_for_quantity(obs_qty_ind, item_index) + +integer, intent(in) :: obs_qty_ind +integer, intent(in) :: item_index +character(len=namelen) :: get_itemname_for_quantity + +integer :: i +character(len=*), parameter :: routine = 'get_itemname_for_quantity' + +if (.not. module_initialized) call initialize_module + +! this validates the quantity index first, then the item index. +! if it returns w/o error, both indices are safe to use. +call validate_qty_item_index(obs_qty_ind, item_index, routine) + +get_itemname_for_quantity = obs_qty_info(obs_qty_ind)%itemname(item_index) + +end function get_itemname_for_quantity + +!---------------------------------------------------------------------------- +! Get string value for quantity by (qty index, item name) of name/value pair +! Error if qty index out of range +! Returns '' if no item name match (or 'null'?) + +! (FIXME: terminology: metadata vs item vs ??) + +function get_itemvalue_for_quantity(obs_qty_ind, itemname) + +integer, intent(in) :: obs_qty_ind +character(len=*), intent(in) :: itemname +character(len=valuelen) :: get_itemvalue_for_quantity + +integer :: i +character(len=*), parameter :: routine = 'get_itemvalue_for_quantity' + +if (.not. module_initialized) call initialize_module + +call validate_obs_qty_index(obs_qty_ind, routine) + +do i=1, obs_qty_info(obs_qty_ind)%nitems + if (obs_qty_info(obs_qty_ind)%itemname(i) == itemname) then + get_itemvalue_for_quantity = obs_qty_info(obs_qty_ind)%itemvalue(i) + return + endif +enddo + +get_itemvalue_for_quantity = '' + +end function get_itemvalue_for_quantity + +!---------------------------------------------------------------------------- +! convenience routine, could also be queried using the generic name=value interface +! Get bounds values for quantity by index +! Returns .false. if both min and max are missing_r8 +! A potential code shortcut for calling code if no bounds are present + +function has_bounds_for_quantity(obs_qty_ind, minbound, maxbound) + +integer, intent(in) :: obs_qty_ind +real(r8), intent(out) :: minbound +real(r8), intent(out) :: maxbound +logical :: has_bounds_for_quantity + +integer :: i +character(len=valuelen) :: boundstring +character(len=*), parameter :: routine = 'get_bounds_for_quantity' + +if (.not. module_initialized) call initialize_module + +call validate_obs_qty_index(obs_qty_ind, routine) + +minbound = MISSING_R8 +maxbound = MISSING_R8 + +do i=1, obs_qty_info(obs_qty_ind)%nitems + if (obs_qty_info(obs_qty_ind)%itemname(i) == "minbound") then + boundstring = obs_qty_info(obs_qty_ind)%itemvalue(i) + minbound = string_to_real(boundstring) + endif + if (obs_qty_info(obs_qty_ind)%itemname(i) == "maxbound") then + boundstring = obs_qty_info(obs_qty_ind)%itemvalue(i) + maxbound = string_to_real(boundstring) + endif +enddo + +has_bounds_for_quantity = .not. (minbound == MISSING_R8 .and. maxbound == MISSING_R8) + +end function has_bounds_for_quantity + +!---------------------------------------------------------------------------- +!> Accessor function to return observation type count + +function get_num_types_of_obs() + +integer :: get_num_types_of_obs + +if ( .not. module_initialized ) call initialize_module + +get_num_types_of_obs = max_defined_types_of_obs + +end function get_num_types_of_obs + +!---------------------------------------------------------------------------- +!> Accessor function to return observation quantity count + +function get_num_quantities() + +integer :: get_num_quantities + +if (.not. module_initialized) call initialize_module + +get_num_quantities = max_defined_quantities + +end function get_num_quantities + +!---------------------------------------------------------------------------- +!> Returns true if this obs_type is being assimilated + +function assimilate_this_type_of_obs(obs_type_ind) + +logical :: assimilate_this_type_of_obs +integer, intent(in) :: obs_type_ind + +character(len=*), parameter :: routine = 'assimilate_this_type_of_obs' + +if ( .not. module_initialized ) call initialize_module + +call validate_obs_type_index(obs_type_ind, routine) + +assimilate_this_type_of_obs = obs_type_info(obs_type_ind)%assimilate + +end function assimilate_this_type_of_obs + +!---------------------------------------------------------------------------- +!> Returns true if this obs_type is being evaluated + +function evaluate_this_type_of_obs(obs_type_ind) + +logical :: evaluate_this_type_of_obs +integer, intent(in) :: obs_type_ind + +character(len=*), parameter :: routine = 'evaluate_this_type_of_obs' + +if ( .not. module_initialized ) call initialize_module + +call validate_obs_type_index(obs_type_ind, routine) + +evaluate_this_type_of_obs = obs_type_info(obs_type_ind)%evaluate + +end function evaluate_this_type_of_obs + +!---------------------------------------------------------------------------- +!> Returns true if this obs_type should use externally computed priors + +function use_ext_prior_this_type_of_obs(obs_type_ind) + +logical :: use_ext_prior_this_type_of_obs +integer, intent(in) :: obs_type_ind + +character(len=*), parameter :: routine = 'use_ext_prior_this_type_of_obs' + +if ( .not. module_initialized ) call initialize_module + +call validate_obs_type_index(obs_type_ind, routine) + +use_ext_prior_this_type_of_obs = obs_type_info(obs_type_ind)%use_precomputed_FO + +end function use_ext_prior_this_type_of_obs + +!---------------------------------------------------------------------------- +!> Returns the associated generic quantity associated with the +!> specific type of this observation + +function get_quantity_for_type_of_obs(obs_type_ind) + +integer, intent(in) :: obs_type_ind +integer :: get_quantity_for_type_of_obs + +character(len=*), parameter :: routine = 'get_quantity_for_type_of_obs' + +if ( .not. module_initialized ) call initialize_module + +call validate_obs_type_index(obs_type_ind, routine) + +get_quantity_for_type_of_obs = obs_type_info(obs_type_ind)%quantity + +end function get_quantity_for_type_of_obs + +!---------------------------------------------------------------------------- +!> Writes out the observation type strings and corresponding integer +!> indices as a header for an obs_sequence file. + +subroutine write_type_of_obs_table(ifile, fform, use_list) + +integer, intent(in) :: ifile +character(len=*), intent(in), optional :: fform +integer, intent(in), optional :: use_list(:) + +integer :: i, ntypes +logical :: is_ascii, restrict +character(len=*), parameter :: routine = 'write_type_of_obs_table' + +if ( .not. module_initialized ) call initialize_module + +is_ascii = ascii_file_format(fform) + +! Write the 20 character identifier to indicate the start of a type table. +! To maintain complete backwards compatibility with the original read +! code this string must start in column 1. +! you cannot use: write(ifile, *) 'string' because the output string +! will start in col 2. the string either has to be part of the format +! argument to write(), or you have to use a separate format statement. +! FIXME: this needs to be obs_type_definitions for write. read has to +! accept either kind (now quantity and was incorrect for this table in +! any case) or type. +if (is_ascii) then + write(ifile, "('obs_type_definitions')") ! see note above! +else + write(ifile) 'obs_type_definitions' +endif + +! If this routine is called with a list of which types are actually +! being used, restrict the table of contents to only those. +! Otherwise, write all known types. +if (present(use_list)) then + ! make sure the list is the right length + if (size(use_list) /= max_defined_types_of_obs) then + call error_handler(E_ERR, routine, & + 'use_list(:) must be the same length as number of types', source) + endif + + ntypes = count(use_list(:) > 0) + restrict = .true. +else + ntypes = max_defined_types_of_obs + restrict = .false. +endif + +if (is_ascii) then + write(ifile, *) ntypes +else + write(ifile) ntypes +endif + +do i = 1, max_defined_types_of_obs + if (restrict) then + if (use_list(i) == 0) cycle + endif + + if (is_ascii) then + write(ifile, *) obs_type_info(i)%index, obs_type_info(i)%name + else + write(ifile) obs_type_info(i)%index, obs_type_info(i)%name + endif +end do + +end subroutine write_type_of_obs_table + +!---------------------------------------------------------------------------- +!> Reads the observation type strings and corresponding integer +!> indices as a header for an obs_sequence file. + +subroutine read_type_of_obs_table(ifile, pre_I_format, fform) + +integer, intent(in) :: ifile +logical, intent(in) :: pre_I_format +character(len=*), intent(in), optional :: fform + +character(len=20) :: header +character(len=obstypelength) :: o_name +integer :: i, num_def_types, o_index, list_index, rc +logical :: is_ascii +character(len=*), parameter :: routine = 'read_type_of_obs_table' + +if ( .not. module_initialized ) call initialize_module + +! pre_I_format has been deprecated. +if(pre_I_format) then + call error_handler(E_ERR, routine, 'pre_I_format no longer supported', source) +endif + +is_ascii = ascii_file_format(fform) + +! Read the 20 character identifier which identifies the start +! of the obstype number/name table for this sequence file. +if (is_ascii) then + read(ifile, *, iostat=rc) header +else + read(ifile, iostat=rc) header +endif + +if(rc /= 0 .or. (header /= 'obs_type_definitions' .and. header /= 'obs_kind_definitions')) then + write(msg_string, *) 'Did not find expected "obs_type_definitions" or "obs_kind_definitions" string at start of obs_seq file ' + write(msg_string1, *) 'Possible causes include: not an obs_seq file format, corrupted file, or wrong-endian binary file' + call error_handler(E_ERR, routine, msg_string, source, text2=msg_string1) +endif + +! Loop through the list to read the integer indices and strings +! For all the defined observation types +! Set up the map from types in the obs_sequence file to those +! in the data structure in this module. +if (is_ascii) then + read(ifile, *) num_def_types +else + read(ifile) num_def_types +endif + +do i = 1, num_def_types + if (is_ascii) then + read(ifile, *) o_index, o_name + else + read(ifile) o_index, o_name + endif + + ! What is the integer associated with this o_name in this module? + list_index = get_index_for_type_of_obs(o_name) + + ! Check for error + if(list_index == -1) then + write(msg_string, *) 'Did not find observation type "', o_name, & + '" in current type list compiled in this program' + call error_handler(E_ERR, routine, msg_string, source) + endif + + toc_mod_type_map%toc_type_index(i) = o_index + toc_mod_type_map%mod_type_index(i) = list_index +end do + +end subroutine read_type_of_obs_table + +!---------------------------------------------------------------------------- +!> Print a menu and read an obs type number +!> (Used for example in an interactive program) + +function get_type_of_obs_from_menu() + +integer :: get_type_of_obs_from_menu + +integer :: i, ierr +character(len=obstypelength) :: in +character(len=*), parameter :: routine = 'get_type_of_obs_from_menu' + +if ( .not. module_initialized ) call initialize_module + +! Should only do types that have been selected by preprocessor +! since those are being evaluated or assimilated. +21 continue +write(*, *) ' ', 'Input the name of the observation types from table below' +write(*, *) ' ', 'OR input (-1 * state variable index) for identity observations:' +do i = 1, max_defined_types_of_obs + if(assimilate_this_type_of_obs(i) .or. evaluate_this_type_of_obs(i)) & + write(*, *) ' ', obs_type_info(i)%index, trim(obs_type_info(i)%name) +end do + +! Read the input as a string, convert to integers as appropriate +read(*, '(A)') in + +! If string is a positive or negative number, convert it to integer +read(in, *, IOSTAT = ierr) get_type_of_obs_from_menu +if(ierr /= 0) then + get_type_of_obs_from_menu = get_index_for_type_of_obs(in) + ! If string isn't found, need to reprompt + if(get_type_of_obs_from_menu == -1) then + write(*, *) trim(in) // ' is not a supported type: Please try again.' + goto 21 + endif +else + ! Make sure that number entered isn't 0 or too larg + if(get_type_of_obs_from_menu == 0 .or. get_type_of_obs_from_menu > max_defined_types_of_obs) then + write(*, *) get_type_of_obs_from_menu, 'is not a legal entry: Please try again.' + goto 21 + endif +endif + +! Make sure + +end function get_type_of_obs_from_menu + +!---------------------------------------------------------------------------- +!> call this routine only where if an index is expected to be valid. +!> (it is a fatal error if not.) don't call this routine from code where +!> an out-of-range value is handled (e.g. it returns -1 instead). + +subroutine validate_obs_type_index(test_me, calling_routine) + +integer, intent(in) :: test_me +character(len=*), intent(in) :: calling_routine + +if (test_me < 1 .or. test_me > max_defined_types_of_obs) then + write(msg_string,'(A,I6,A,I6)') 'obs type number ', test_me, & + ' must be between 1 and ', max_defined_types_of_obs + call error_handler(E_ERR, calling_routine, msg_string, source) +endif + +end subroutine validate_obs_type_index + +!---------------------------------------------------------------------------- +!> call this routine only where if an index is expected to be valid. +!> (it is a fatal error if not.) don't call this routine from code where +!> an out-of-range value is handled (e.g. it returns -1 instead). + +subroutine validate_obs_qty_index(test_me, calling_routine) + +integer, intent(in) :: test_me +character(len=*), intent(in) :: calling_routine + +if (test_me < 0 .or. test_me > max_defined_quantities) then + write(msg_string,'(A,I6,A,I6)') 'obs quantity number ', test_me, & + ' must be between 0 and ', max_defined_quantities + call error_handler(E_ERR, calling_routine, msg_string, source) +endif + +end subroutine validate_obs_qty_index + +!---------------------------------------------------------------------------- +!> call this routine only where if an index is expected to be valid. +!> (it is a fatal error if not.) don't call this routine from code where +!> an out-of-range value is handled (e.g. it returns -1 instead). + +subroutine validate_qty_item_index(qty_index, test_me, calling_routine) +integer, intent(in) :: qty_index +integer, intent(in) :: test_me +character(len=*), intent(in) :: calling_routine + +integer :: nitems + +! test before using index +call validate_obs_qty_index(qty_index, calling_routine) + +nitems = obs_qty_info(qty_index)%nitems + +if (test_me < 1 .or. test_me > nitems) then + write(msg_string,'(3(A,I6))') 'item number ', test_me, ' for obs quantity number ', qty_index, & + ' ('//trim(obs_type_info(qty_index)%name)//') must be between 1 and ', nitems + call error_handler(E_ERR, calling_routine, msg_string, source) +endif + +end subroutine validate_qty_item_index + +!---------------------------------------------------------------------------- + +subroutine validate_metadata_strings(obs_qty_ind, itemname, itemvalue) + +integer, intent(in) :: obs_qty_ind +character(len=*), intent(in) :: itemname +character(len=*), intent(in) :: itemvalue + +character(len=*), parameter :: routine = 'validate_metadata_strings' + +if (len_trim(itemname) > namelen) then + write(msg_string, *) 'quantity ', obs_qty_ind, ' metadata name "'//trim(itemname)//'" must be shorter than', namelen + write(msg_string1, *) 'quantity ', obs_qty_ind, ' is ', get_name_for_quantity(obs_qty_ind) + call error_handler(E_ERR, routine, msg_string, source, text2=msg_string1) +endif + +if (len_trim(itemvalue) > valuelen) then + write(msg_string, *) 'quantity ', obs_qty_ind, ' metadata value "'//trim(itemvalue)//'" must be shorter than', valuelen + write(msg_string1, *) 'quantity ', obs_qty_ind, ' is ', get_name_for_quantity(obs_qty_ind) + call error_handler(E_ERR, routine, msg_string, source, text2=msg_string1) +endif + +end subroutine validate_metadata_strings + +!---------------------------------------------------------------------------- + +end module obs_kind_mod +!end module obs_qty_mod