[Dart-dev] [4260] DART/trunk: Updates and bug fixes from Glen and Ryan for the MADIS converters.

nancy at ucar.edu nancy at ucar.edu
Mon Feb 8 10:30:41 MST 2010


Revision: 4260
Author:   nancy
Date:     2010-02-08 10:30:41 -0700 (Mon, 08 Feb 2010)
Log Message:
-----------
Updates and bug fixes from Glen and Ryan for the MADIS converters.
Options for moisture to be specific or relative humidity, or dewpoint.
The parameter strings are limited by the fortran standards to 32 chars,
so all existing occurrances of _DEW_POINT_TEMPERATURE have been
shortened to simply _DEWPOINT.  

Modified Paths:
--------------
    DART/trunk/ncep_obs/real_obs_mod.f90
    DART/trunk/obs_def/obs_def_dew_point_mod.f90
    DART/trunk/obs_def/obs_def_gts_mod.f90
    DART/trunk/obs_def/obs_def_reanalysis_bufr_mod.f90
    DART/trunk/obs_kind/DEFAULT_obs_kind_mod.F90
    DART/trunk/observations/MADIS/convert_madis_acars.f90
    DART/trunk/observations/MADIS/convert_madis_marine.f90
    DART/trunk/observations/MADIS/convert_madis_rawin.f90
    DART/trunk/observations/MADIS/convert_madis_surface.f90
    DART/trunk/observations/MADIS/meteor_mod.f90
    DART/trunk/observations/MADIS/work/path_names_convert_madis_acars
    DART/trunk/observations/MADIS/work/path_names_convert_madis_marine
    DART/trunk/observations/MADIS/work/path_names_convert_madis_rawin
    DART/trunk/observations/MADIS/work/path_names_convert_madis_surface
    DART/trunk/observations/obs_error/README
    DART/trunk/observations/var/gts_to_dart.f90

Added Paths:
-----------
    DART/trunk/observations/obs_error/dewpoint_obs_err_mod.f90

-------------- next part --------------
Modified: DART/trunk/ncep_obs/real_obs_mod.f90
===================================================================
--- DART/trunk/ncep_obs/real_obs_mod.f90	2010-02-08 17:22:10 UTC (rev 4259)
+++ DART/trunk/ncep_obs/real_obs_mod.f90	2010-02-08 17:30:41 UTC (rev 4260)
@@ -31,7 +31,7 @@
                              KIND_V_WIND_COMPONENT, KIND_SURFACE_PRESSURE, &
                              KIND_TEMPERATURE, KIND_SPECIFIC_HUMIDITY, KIND_PRESSURE, &
                              KIND_VERTICAL_VELOCITY, KIND_RAINWATER_MIXING_RATIO, &
-                             KIND_DEW_POINT_TEMPERATURE, KIND_DENSITY, KIND_VELOCITY, &
+                             KIND_DEWPOINT, KIND_DENSITY, KIND_VELOCITY, &
                              KIND_1D_INTEGRAL, KIND_RADAR_REFLECTIVITY 
 
 use  obs_def_altimeter_mod, only: compute_altimeter

Modified: DART/trunk/obs_def/obs_def_dew_point_mod.f90
===================================================================
--- DART/trunk/obs_def/obs_def_dew_point_mod.f90	2010-02-08 17:22:10 UTC (rev 4259)
+++ DART/trunk/obs_def/obs_def_dew_point_mod.f90	2010-02-08 17:30:41 UTC (rev 4260)
@@ -3,8 +3,8 @@
 ! http://www.image.ucar.edu/DAReS/DART/DART_download
 
 ! BEGIN DART PREPROCESS KIND LIST
-! DEW_POINT_TEMPERATURE, KIND_DEW_POINT_TEMPERATURE
-! DEW_POINT_2_METER,     KIND_DEW_POINT_TEMPERATURE
+! DEWPOINT,             KIND_DEWPOINT
+! DEWPOINT_2_METER,     KIND_DEWPOINT
 ! END DART PREPROCESS KIND LIST
 
 ! BEGIN DART PREPROCESS USE OF SPECIAL OBS_DEF MODULE
@@ -12,24 +12,24 @@
 ! END DART PREPROCESS USE OF SPECIAL OBS_DEF MODULE
 
 ! BEGIN DART PREPROCESS GET_EXPECTED_OBS_FROM_DEF
-!         case(DEW_POINT_TEMPERATURE)
+!         case(DEWPOINT)
 !            call get_expected_dew_point(state, location, 1, obs_val, istatus)
-!         case(DEW_POINT_2_METER)
+!         case(DEWPOINT_2_METER)
 !            call get_expected_dew_point(state, location, 2, obs_val, istatus)
 ! END DART PREPROCESS GET_EXPECTED_OBS_FROM_DEF
 
 ! BEGIN DART PREPROCESS READ_OBS_DEF
-!         case(DEW_POINT_TEMPERATURE, DEW_POINT_2_METER)
+!         case(DEWPOINT, DEWPOINT_2_METER)
 !            continue
 ! END DART PREPROCESS READ_OBS_DEF
 
 ! BEGIN DART PREPROCESS WRITE_OBS_DEF
-!         case(DEW_POINT_TEMPERATURE, DEW_POINT_2_METER)
+!         case(DEWPOINT, DEWPOINT_2_METER)
 !            continue
 ! END DART PREPROCESS WRITE_OBS_DEF
 
 ! BEGIN DART PREPROCESS INTERACTIVE_OBS_DEF
-!         case(DEW_POINT_TEMPERATURE, DEW_POINT_2_METER)
+!         case(DEWPOINT, DEWPOINT_2_METER)
 !            continue
 ! END DART PREPROCESS INTERACTIVE_OBS_DEF
 

Modified: DART/trunk/obs_def/obs_def_gts_mod.f90
===================================================================
--- DART/trunk/obs_def/obs_def_gts_mod.f90	2010-02-08 17:22:10 UTC (rev 4259)
+++ DART/trunk/obs_def/obs_def_gts_mod.f90	2010-02-08 17:30:41 UTC (rev 4260)
@@ -7,37 +7,37 @@
 !BUOY_V_WIND_COMPONENT,        KIND_V_WIND_COMPONENT,      COMMON_CODE
 !BUOY_SURFACE_PRESSURE,        KIND_SURFACE_PRESSURE,      COMMON_CODE
 !BUOY_TEMPERATURE,             KIND_TEMPERATURE,           COMMON_CODE
-!BUOY_DEW_POINT_TEMPERATURE,   KIND_DEW_POINT_TEMPERATURE
+!BUOY_DEWPOINT,                KIND_DEWPOINT
 !SHIP_U_WIND_COMPONENT,        KIND_U_WIND_COMPONENT,      COMMON_CODE
 !SHIP_V_WIND_COMPONENT,        KIND_V_WIND_COMPONENT,      COMMON_CODE
 !SHIP_SURFACE_PRESSURE,        KIND_SURFACE_PRESSURE,      COMMON_CODE
 !SHIP_TEMPERATURE,             KIND_TEMPERATURE,           COMMON_CODE
-!SHIP_DEW_POINT_TEMPERATURE,   KIND_DEW_POINT_TEMPERATURE
+!SHIP_DEWPOINT,                KIND_DEWPOINT
 !SYNOP_U_WIND_COMPONENT,       KIND_U_WIND_COMPONENT,      COMMON_CODE
 !SYNOP_V_WIND_COMPONENT,       KIND_V_WIND_COMPONENT,      COMMON_CODE
 !SYNOP_SURFACE_PRESSURE,       KIND_SURFACE_PRESSURE,      COMMON_CODE
 !SYNOP_TEMPERATURE,            KIND_TEMPERATURE,           COMMON_CODE
-!SYNOP_DEW_POINT_TEMPERATURE,  KIND_DEW_POINT_TEMPERATURE
+!SYNOP_DEWPOINT,               KIND_DEWPOINT
 !AIREP_U_WIND_COMPONENT,       KIND_U_WIND_COMPONENT,      COMMON_CODE
 !AIREP_V_WIND_COMPONENT,       KIND_V_WIND_COMPONENT,      COMMON_CODE
 !AIREP_PRESSURE,               KIND_PRESSURE,              COMMON_CODE
 !AIREP_TEMPERATURE,            KIND_TEMPERATURE,           COMMON_CODE
-!AIREP_DEW_POINT_TEMPERATURE,  KIND_DEW_POINT_TEMPERATURE
+!AIREP_DEWPOINT,               KIND_DEWPOINT
 !AMDAR_U_WIND_COMPONENT,       KIND_U_WIND_COMPONENT,      COMMON_CODE
 !AMDAR_V_WIND_COMPONENT,       KIND_V_WIND_COMPONENT,      COMMON_CODE
 !AMDAR_PRESSURE,               KIND_PRESSURE,              COMMON_CODE
 !AMDAR_TEMPERATURE,            KIND_TEMPERATURE,           COMMON_CODE
-!AMDAR_DEW_POINT_TEMPERATURE,  KIND_DEW_POINT_TEMPERATURE
+!AMDAR_DEWPOINT,               KIND_DEWPOINT
 !PILOT_U_WIND_COMPONENT,       KIND_U_WIND_COMPONENT,      COMMON_CODE
 !PILOT_V_WIND_COMPONENT,       KIND_V_WIND_COMPONENT,      COMMON_CODE
 !PILOT_PRESSURE,               KIND_PRESSURE,              COMMON_CODE
 !PILOT_TEMPERATURE,            KIND_TEMPERATURE,           COMMON_CODE
-!PILOT_DEW_POINT_TEMPERATURE,  KIND_DEW_POINT_TEMPERATURE
+!PILOT_DEWPOINT,               KIND_DEWPOINT
 !BOGUS_U_WIND_COMPONENT,       KIND_U_WIND_COMPONENT,      COMMON_CODE
 !BOGUS_V_WIND_COMPONENT,       KIND_V_WIND_COMPONENT,      COMMON_CODE
 !BOGUS_PRESSURE,               KIND_PRESSURE,              COMMON_CODE
 !BOGUS_TEMPERATURE,            KIND_TEMPERATURE,           COMMON_CODE
-!BOGUS_DEW_POINT_TEMPERATURE,  KIND_DEW_POINT_TEMPERATURE
+!BOGUS_DEWPOINT,               KIND_DEWPOINT
 !PROFILER_U_WIND_COMPONENT,    KIND_U_WIND_COMPONENT,      COMMON_CODE
 !PROFILER_V_WIND_COMPONENT,    KIND_V_WIND_COMPONENT,      COMMON_CODE
 !PROFILER_PRESSURE,            KIND_PRESSURE,              COMMON_CODE
@@ -50,48 +50,36 @@
 ! END DART PREPROCESS USE OF SPECIAL OBS_DEF MODULE
 
 ! BEGIN DART PREPROCESS GET_EXPECTED_OBS_FROM_DEF
-!         case(AIREP_DEW_POINT_TEMPERATURE, &
-!              AMDAR_DEW_POINT_TEMPERATURE, PILOT_DEW_POINT_TEMPERATURE, &
-!              BOGUS_DEW_POINT_TEMPERATURE)
+!         case(AIREP_DEWPOINT, AMDAR_DEWPOINT, PILOT_DEWPOINT, BOGUS_DEWPOINT)
 !              call get_expected_dew_point(state, location, 1, obs_val, istatus)
-!         case(BUOY_DEW_POINT_TEMPERATURE, SHIP_DEW_POINT_TEMPERATURE, &
-!              SYNOP_DEW_POINT_TEMPERATURE)
+!         case(BUOY_DEWPOINT, SHIP_DEWPOINT, SYNOP_DEWPOINT)
 !              call get_expected_dew_point(state, location, 2, obs_val, istatus)
 !         case(SATEM_THICKNESS)
 !            call get_expected_thickness(state, location, obs_val, istatus)
 ! END DART PREPROCESS GET_EXPECTED_OBS_FROM_DEF
 
 ! BEGIN DART PREPROCESS READ_OBS_DEF
-! case(AIREP_DEW_POINT_TEMPERATURE, &
-!      AMDAR_DEW_POINT_TEMPERATURE, PILOT_DEW_POINT_TEMPERATURE, &
-!      BOGUS_DEW_POINT_TEMPERATURE)
+! case(AIREP_DEWPOINT, AMDAR_DEWPOINT, PILOT_DEWPOINT, BOGUS_DEWPOINT)
 !      continue
-! case(BUOY_DEW_POINT_TEMPERATURE, SHIP_DEW_POINT_TEMPERATURE, &
-!      SYNOP_DEW_POINT_TEMPERATURE)
+! case(BUOY_DEWPOINT, SHIP_DEWPOINT, SYNOP_DEWPOINT)
 !      continue
 ! case(SATEM_THICKNESS)
 !      continue
 ! END DART PREPROCESS READ_OBS_DEF
 
 ! BEGIN DART PREPROCESS WRITE_OBS_DEF
-! case(AIREP_DEW_POINT_TEMPERATURE, &
-!      AMDAR_DEW_POINT_TEMPERATURE, PILOT_DEW_POINT_TEMPERATURE, &
-!      BOGUS_DEW_POINT_TEMPERATURE)
+! case(AIREP_DEWPOINT, AMDAR_DEWPOINT, PILOT_DEWPOINT, BOGUS_DEWPOINT)
 !      continue
-! case(BUOY_DEW_POINT_TEMPERATURE, SHIP_DEW_POINT_TEMPERATURE, &
-!      SYNOP_DEW_POINT_TEMPERATURE)
+! case(BUOY_DEWPOINT, SHIP_DEWPOINT, SYNOP_DEWPOINT)
 !      continue
 ! case(SATEM_THICKNESS)
 !      continue
 ! END DART PREPROCESS WRITE_OBS_DEF
 
 ! BEGIN DART PREPROCESS INTERACTIVE_OBS_DEF
-! case(AIREP_DEW_POINT_TEMPERATURE, &
-!      AMDAR_DEW_POINT_TEMPERATURE, PILOT_DEW_POINT_TEMPERATURE, &
-!      BOGUS_DEW_POINT_TEMPERATURE)
+! case(AIREP_DEWPOINT, AMDAR_DEWPOINT, PILOT_DEWPOINT, BOGUS_DEWPOINT)
 !      continue
-! case(BUOY_DEW_POINT_TEMPERATURE, SHIP_DEW_POINT_TEMPERATURE, &
-!      SYNOP_DEW_POINT_TEMPERATURE)
+! case(BUOY_DEWPOINT, SHIP_DEWPOINT, SYNOP_DEWPOINT)
 !      continue
 ! case(SATEM_THICKNESS)
 !      continue

Modified: DART/trunk/obs_def/obs_def_reanalysis_bufr_mod.f90
===================================================================
--- DART/trunk/obs_def/obs_def_reanalysis_bufr_mod.f90	2010-02-08 17:22:10 UTC (rev 4259)
+++ DART/trunk/obs_def/obs_def_reanalysis_bufr_mod.f90	2010-02-08 17:30:41 UTC (rev 4260)
@@ -9,22 +9,32 @@
 !RADIOSONDE_SURFACE_PRESSURE,  KIND_SURFACE_PRESSURE,  COMMON_CODE
 !RADIOSONDE_TEMPERATURE,       KIND_TEMPERATURE,       COMMON_CODE
 !RADIOSONDE_SPECIFIC_HUMIDITY, KIND_SPECIFIC_HUMIDITY, COMMON_CODE
+!RADIOSONDE_RELATIVE_HUMIDITY, KIND_RELATIVE_HUMIDITY, COMMON_CODE
+!RADIOSONDE_DEWPOINT,          KIND_DEWPOINT,          COMMON_CODE
 !AIRCRAFT_U_WIND_COMPONENT,    KIND_U_WIND_COMPONENT,  COMMON_CODE
 !AIRCRAFT_V_WIND_COMPONENT,    KIND_V_WIND_COMPONENT,  COMMON_CODE
 !AIRCRAFT_TEMPERATURE,         KIND_TEMPERATURE,       COMMON_CODE
 !AIRCRAFT_SPECIFIC_HUMIDITY,   KIND_SPECIFIC_HUMIDITY, COMMON_CODE
+!AIRCRAFT_RELATIVE_HUMIDITY,   KIND_RELATIVE_HUMIDITY, COMMON_CODE
+!AIRCRAFT_DEWPOINT,            KIND_DEWPOINT,          COMMON_CODE
 !ACARS_U_WIND_COMPONENT,       KIND_U_WIND_COMPONENT,  COMMON_CODE
 !ACARS_V_WIND_COMPONENT,       KIND_V_WIND_COMPONENT,  COMMON_CODE
 !ACARS_TEMPERATURE,            KIND_TEMPERATURE,       COMMON_CODE
 !ACARS_SPECIFIC_HUMIDITY,      KIND_SPECIFIC_HUMIDITY, COMMON_CODE
+!ACARS_RELATIVE_HUMIDITY,      KIND_RELATIVE_HUMIDITY, COMMON_CODE
+!ACARS_DEWPOINT,               KIND_DEWPOINT,          COMMON_CODE
 !MARINE_SFC_U_WIND_COMPONENT,  KIND_U_WIND_COMPONENT,  COMMON_CODE
 !MARINE_SFC_V_WIND_COMPONENT,  KIND_V_WIND_COMPONENT,  COMMON_CODE
 !MARINE_SFC_TEMPERATURE,       KIND_TEMPERATURE,       COMMON_CODE
 !MARINE_SFC_SPECIFIC_HUMIDITY, KIND_SPECIFIC_HUMIDITY, COMMON_CODE
+!MARINE_SFC_RELATIVE_HUMIDITY, KIND_RELATIVE_HUMIDITY, COMMON_CODE
+!MARINE_SFC_DEWPOINT,          KIND_DEWPOINT,          COMMON_CODE
 !LAND_SFC_U_WIND_COMPONENT,    KIND_U_WIND_COMPONENT,  COMMON_CODE
 !LAND_SFC_V_WIND_COMPONENT,    KIND_V_WIND_COMPONENT,  COMMON_CODE
 !LAND_SFC_TEMPERATURE,         KIND_TEMPERATURE,       COMMON_CODE
 !LAND_SFC_SPECIFIC_HUMIDITY,   KIND_SPECIFIC_HUMIDITY, COMMON_CODE
+!LAND_SFC_RELATIVE_HUMIDITY,   KIND_RELATIVE_HUMIDITY, COMMON_CODE
+!LAND_SFC_DEWPOINT,            KIND_DEWPOINT,          COMMON_CODE
 !SAT_U_WIND_COMPONENT,         KIND_U_WIND_COMPONENT,  COMMON_CODE
 !SAT_V_WIND_COMPONENT,         KIND_V_WIND_COMPONENT,  COMMON_CODE
 !ATOV_TEMPERATURE,             KIND_TEMPERATURE,       COMMON_CODE

Modified: DART/trunk/obs_kind/DEFAULT_obs_kind_mod.F90
===================================================================
--- DART/trunk/obs_kind/DEFAULT_obs_kind_mod.F90	2010-02-08 17:22:10 UTC (rev 4259)
+++ DART/trunk/obs_kind/DEFAULT_obs_kind_mod.F90	2010-02-08 17:30:41 UTC (rev 4260)
@@ -63,7 +63,7 @@
     KIND_PRESSURE                    = 6, &
     KIND_VERTICAL_VELOCITY           = 7, &
     KIND_RAINWATER_MIXING_RATIO      = 8, &
-    KIND_DEW_POINT_TEMPERATURE       = 9, &
+    KIND_DEWPOINT                    = 9, &
     KIND_DENSITY                     = 10, &
     KIND_VELOCITY                    = 11, &
     KIND_RADAR_REFLECTIVITY          = 12, &
@@ -290,7 +290,7 @@
 obs_kind_names( 6) = obs_kind_type(KIND_PRESSURE, 'KIND_PRESSURE')
 obs_kind_names( 7) = obs_kind_type(KIND_VERTICAL_VELOCITY, 'KIND_VERTICAL_VELOCITY')
 obs_kind_names( 8) = obs_kind_type(KIND_RAINWATER_MIXING_RATIO, 'KIND_RAINWATER_MIXING_RATIO')
-obs_kind_names( 9) = obs_kind_type(KIND_DEW_POINT_TEMPERATURE, 'KIND_DEW_POINT_TEMPERATURE')
+obs_kind_names( 9) = obs_kind_type(KIND_DEWPOINT, 'KIND_DEWPOINT')
 obs_kind_names(10) = obs_kind_type(KIND_DENSITY, 'KIND_DENSITY')
 obs_kind_names(11) = obs_kind_type(KIND_VELOCITY, 'KIND_VELOCITY')
 obs_kind_names(12) = obs_kind_type(KIND_RADAR_REFLECTIVITY, 'KIND_RADAR_REFLECTIVITY')

Modified: DART/trunk/observations/MADIS/convert_madis_acars.f90
===================================================================
--- DART/trunk/observations/MADIS/convert_madis_acars.f90	2010-02-08 17:22:10 UTC (rev 4259)
+++ DART/trunk/observations/MADIS/convert_madis_acars.f90	2010-02-08 17:30:41 UTC (rev 4260)
@@ -17,6 +17,9 @@
 !                         using the DART library routines.
 !
 !     created Dec. 2007 Ryan Torn, NCAR/MMM
+!     modified Dec. 2008 Soyoung Ha and David Dowell, NCAR/MMM
+!     - added dewpoint as an output variable
+!     - added relative humidity as an output variable
 !
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -29,7 +32,10 @@
 use time_manager_mod, only : time_type, set_calendar_type, set_date, &
                              increment_time, get_time, GREGORIAN, operator(-)
 use     obs_kind_mod, only : ACARS_U_WIND_COMPONENT, ACARS_V_WIND_COMPONENT, &
-                             ACARS_TEMPERATURE, ACARS_SPECIFIC_HUMIDITY
+                             ACARS_TEMPERATURE, ACARS_SPECIFIC_HUMIDITY, &
+                             ACARS_DEWPOINT, ACARS_RELATIVE_HUMIDITY
+use dewpoint_obs_err_mod, only : dewpt_error_from_rh_and_temp, &
+                                 rh_error_from_dewpt_and_temp
 use       meteor_mod, only : pres_alt_to_pres, sat_vapor_pressure, &
                              specific_humidity, wind_dirspd_to_uv
 use      obs_err_mod, only : acars_wind_error, acars_temp_error, &
@@ -41,21 +47,29 @@
 character(len=14),  parameter :: acars_netcdf_file = 'acars_input.nc'
 character(len=129), parameter :: acars_out_file    = 'obs_seq.acars'
 
+! the following logical parameters control which water-vapor variables appear in the output file
+! and whether to use the NCEP error or Lin and Hubbard (2004) moisture error model
+logical, parameter :: LH_err                    = .false.
+logical, parameter :: include_specific_humidity = .true.
+logical, parameter :: include_relative_humidity = .false.
+logical, parameter :: include_dewpoint          = .false.
+
 integer, parameter ::   num_copies = 1,   &   ! number of copies in sequence
                         num_qc     = 1        ! number of QC entries
 
 character (len=129) :: meta_data
 character (len=80)  :: name
 character (len=19)  :: datime
-integer :: rcode, ncid, varid, nobs, n, i, window_sec, dday, dsec, &
+integer :: rcode, ncid, varid, nobs, nvars, n, i, window_sec, dday, dsec, &
            oday, osec, nused, iyear, imonth, iday, ihour, imin, isec
 logical :: file_exist
-real(r8) :: palt_miss, tair_miss, relh_miss, wdir_miss, wspd_miss, uwnd, &
+real(r8) :: palt_miss, tair_miss, relh_miss, tdew_miss, wdir_miss, wspd_miss, uwnd, &
             vwnd, qobs, qsat, oerr, window_hours, pres, qc, qerr
 
 integer,  allocatable :: tobs(:)
-real(r8), allocatable :: lat(:), lon(:), palt(:), tair(:), relh(:), &
+real(r8), allocatable :: lat(:), lon(:), palt(:), tair(:), relh(:), tdew(:), &
                          wdir(:), wspd(:), latu(:), lonu(:), palu(:)
+integer,  allocatable :: qc_palt(:), qc_tair(:), qc_relh(:), qc_tdew(:), qc_wdir(:), qc_wspd(:)
 
 type(obs_sequence_type) :: obs_seq
 type(obs_type)          :: obs
@@ -86,13 +100,23 @@
 allocate(tair(nobs))  ;  allocate(relh(nobs))
 allocate(wdir(nobs))  ;  allocate(wspd(nobs))
 allocate(latu(nobs))  ;  allocate(lonu(nobs))
-allocate(palu(nobs))
+allocate(palu(nobs))  ;  allocate(tdew(nobs))
 
+nvars = 3
+if (include_specific_humidity) nvars = nvars + 1
+if (include_relative_humidity) nvars = nvars + 1
+if (include_dewpoint) nvars = nvars + 1
+
+allocate(qc_palt(nobs)) ;  allocate(qc_relh(nobs))
+allocate(qc_tair(nobs)) ;  allocate(qc_tdew(nobs))
+allocate(qc_wdir(nobs)) ;  allocate(qc_wspd(nobs))
+
+
 ! read the latitude array
 call check( nf90_inq_varid(ncid, "latitude", varid) )
 call check( nf90_get_var(ncid, varid, lat) )
 
-! read the latitude array
+! read the longitude array
 call check( nf90_inq_varid(ncid, "longitude", varid) )
 call check( nf90_get_var(ncid, varid, lon) )
 
@@ -106,11 +130,16 @@
 call check( nf90_get_var(ncid, varid, tair) )
 call check( nf90_get_att(ncid, varid, '_FillValue', tair_miss) )
 
-! read the dew-point temperature array
+! read the relative humidity array
 call check( nf90_inq_varid(ncid, "downlinkedRH", varid) )
 call check( nf90_get_var(ncid, varid, relh) )
 call check( nf90_get_att(ncid, varid, '_FillValue', relh_miss) )
 
+! read the dew-point temperature array
+call check( nf90_inq_varid(ncid, "dewpoint", varid) )
+call check( nf90_get_var(ncid, varid, tdew) )
+call check( nf90_get_att(ncid, varid, '_FillValue', tdew_miss) )
+
 ! read the wind direction array
 call check( nf90_inq_varid(ncid, "windDir", varid) )
 call check( nf90_get_var(ncid, varid, wdir) )
@@ -125,6 +154,25 @@
 call check( nf90_inq_varid(ncid, "timeObs", varid) )
 call check( nf90_get_var(ncid, varid, tobs) )
 
+! read the QC check for each variable
+call check( nf90_inq_varid(ncid, "altitudeQCR", varid) )
+call check( nf90_get_var(ncid, varid, qc_palt) )
+
+call check( nf90_inq_varid(ncid, "temperatureQCR", varid) )
+call check( nf90_get_var(ncid, varid, qc_tair) )
+
+call check( nf90_inq_varid(ncid, "downlinkedRHQCR", varid) )
+call check( nf90_get_var(ncid, varid, qc_relh) )
+
+call check( nf90_inq_varid(ncid, "dewpointQCR", varid) )
+call check( nf90_get_var(ncid, varid, qc_tdew) )
+
+call check( nf90_inq_varid(ncid, "windDirQCR", varid) )
+call check( nf90_get_var(ncid, varid, qc_wdir) )
+
+call check( nf90_inq_varid(ncid, "windSpeedQCR", varid) )
+call check( nf90_get_var(ncid, varid, qc_wspd) )
+
 call check( nf90_close(ncid) )
 
 !  either read existing obs_seq or create a new one
@@ -133,17 +181,17 @@
 inquire(file=acars_out_file, exist=file_exist)
 if ( file_exist ) then
 
-  call read_obs_seq(acars_out_file, 0, 0, 4*nobs, obs_seq)
+  call read_obs_seq(acars_out_file, 0, 0, nvars*nobs, obs_seq)
 
 else
 
-  call init_obs_sequence(obs_seq, num_copies, num_qc, 4*nobs)
+  call init_obs_sequence(obs_seq, num_copies, num_qc, nvars*nobs)
   do i = 1, num_copies
-    meta_data = 'NCEP BUFR observation'
+    meta_data = 'MADIS observation'
     call set_copy_meta_data(obs_seq, i, meta_data)
   end do
   do i = 1, num_qc
-    meta_data = 'NCEP QC index'
+    meta_data = 'Data QC'
     call set_qc_meta_data(obs_seq, i, meta_data)
   end do
 
@@ -154,6 +202,7 @@
 
   ! determine if the observation is within the window
   time_obs = increment_time(comp_day0, mod(tobs(n),86400), tobs(n) / 86400)
+  ! note:  the "-" operator in the following command always returns a positive time difference
   call get_time((time_anal - time_obs), dsec, dday)
   if ( dsec > window_sec .or. dday > 0 ) cycle obsloop
   if ( lon(n) < 0.0_r8 )  lon(n) = lon(n) + 360.0_r8
@@ -165,11 +214,11 @@
   end do
   qc = 1.0_r8
  
-  if ( palt(n) == palt_miss ) cycle obsloop  
+  if ( palt(n) == palt_miss .and. qc_palt(n) == 0 ) cycle obsloop  
   pres = pres_alt_to_pres(palt(n))
 
   ! add wind component data to obs. sequence
-  if ( wdir(n) /= wdir_miss .and. wspd(n) /= wspd_miss ) then
+  if ( wdir(n) /= wdir_miss .and. wspd(n) /= wspd_miss .and. qc_wdir(n) == 0 .and. qc_wspd(n) == 0 ) then
 
     call wind_dirspd_to_uv(wdir(n), wspd(n), uwnd, vwnd)
     oerr = acars_wind_error(pres * 0.01_r8)
@@ -187,7 +236,7 @@
   end if
 
   ! add air temperature data to obs. sequence
-  if ( tair(n) /= tair_miss ) then 
+  if ( tair(n) /= tair_miss .and. qc_tair(n) == 0 ) then 
    
     oerr = acars_temp_error(pres * 0.01_r8)
     if ( tair(n) >= 180.0_r8 .and. tair(n) <= 330.0_r8 .and. oerr /= missing_r8 ) then
@@ -200,12 +249,19 @@
 
   end if
 
-  ! add relative humidity data to obs. sequence, but as specific humidity
-  if ( tair(n) /= tair_miss .and. relh(n) /= relh_miss ) then
+  ! add specific humidity data to obs. sequence
+  if ( include_specific_humidity .and. tair(n) /= tair_miss .and. relh(n) /= relh_miss &
+       .and. tdew(n) /= tdew_miss .and. qc_tair(n) == 0 .and. qc_relh(n) == 0 &
+       .and. qc_tdew(n) == 0 ) then
 
     qsat = specific_humidity(sat_vapor_pressure(tair(n)), pres)
     qobs = qsat * relh(n)
-    qerr = acars_rel_hum_error(pres * 0.01_r8, tair(n), relh(n))
+    if ( LH_err ) then
+!GSR decided to get error from tdew and tair, while passing the rh from the read ob
+      qerr = rh_error_from_dewpt_and_temp(tair(n), tdew(n))
+    else 
+      qerr = acars_rel_hum_error(pres * 0.01_r8, tair(n), relh(n))
+    end if
     oerr = max(qerr * qsat, 0.0001_r8)
 
     if ( abs(qobs) < 0.1_r8 .and. qerr /= missing_r8 ) then
@@ -218,6 +274,36 @@
 
   end if
 
+  ! add relative humidity data to obs. sequence
+  if ( include_relative_humidity .and. tair(n) /= tair_miss .and. relh(n) /= relh_miss &
+       .and. tdew(n) /= tdew_miss .and. qc_tair(n) == 0 .and. qc_relh(n) == 0 &
+       .and. qc_tdew(n) == 0 ) then
+
+    if ( LH_err ) then
+!GSR decided to get error from tdew and tair, while passing the rh from the read ob
+      oerr = rh_error_from_dewpt_and_temp(tair(n), tdew(n))
+    else
+      oerr = acars_rel_hum_error(pres * 0.01_r8, tair(n), relh(n))
+    end if
+    
+    call create_obs_type(lat(n), lon(n), pres, VERTISPRESSURE, relh(n), &
+                         ACARS_RELATIVE_HUMIDITY, oerr, oday, osec, qc, obs)
+    call append_obs_to_seq(obs_seq, obs)
+
+  end if
+
+  ! add dew point temperature data to obs. sequence
+  if ( include_dewpoint .and. tdew(n) /= tdew_miss .and. tair(n) /= tair_miss &
+       .and. relh(n) /= relh_miss .and. qc_tair(n) == 0 .and. qc_relh(n) == 0 &
+       .and. qc_tdew(n) == 0 ) then
+
+    oerr = dewpt_error_from_rh_and_temp(tair(n), relh(n))
+    call create_obs_type(lat(n), lon(n), pres, VERTISPRESSURE, tdew(n), &
+                         ACARS_DEWPOINT, oerr, oday, osec, qc, obs)
+    call append_obs_to_seq(obs_seq, obs)
+
+  end if
+
   nused = nused + 1
   latu(nused) = lat(n)
   lonu(nused) = lon(n)

Modified: DART/trunk/observations/MADIS/convert_madis_marine.f90
===================================================================
--- DART/trunk/observations/MADIS/convert_madis_marine.f90	2010-02-08 17:22:10 UTC (rev 4259)
+++ DART/trunk/observations/MADIS/convert_madis_marine.f90	2010-02-08 17:30:41 UTC (rev 4260)
@@ -17,6 +17,9 @@
 !                          obs_seq file using the DART library routines.
 !
 !     created Dec. 2007 Ryan Torn, NCAR/MMM
+!     modified Dec. 2008 Soyoung Ha and David Dowell, NCAR/MMM
+!     - added dewpoint as an output variable
+!     - added relative humidity as an output variable
 !
 !
 !     modified to include QC_flag check (Soyoung Ha, NCAR/MMM, 08-04-2009)
@@ -32,14 +35,18 @@
                                   append_obs_to_seq, init_obs_sequence, get_num_obs, &
                                   set_copy_meta_data, set_qc_meta_data
 use            meteor_mod, only : sat_vapor_pressure, specific_humidity, & 
-                                  wind_dirspd_to_uv, pres_alt_to_pres
+                                  wind_dirspd_to_uv, pres_alt_to_pres, &
+                                  temp_and_dewpoint_to_rh
 use           obs_err_mod, only : fixed_marine_temp_error, fixed_marine_rel_hum_error, &
                                   fixed_marine_wind_error, fixed_marine_pres_error, &
                                   moving_marine_temp_error, moving_marine_rel_hum_error, &
                                   moving_marine_wind_error, moving_marine_pres_error
+use  dewpoint_obs_err_mod, only : dewpt_error_from_rh_and_temp, &
+                                  rh_error_from_dewpt_and_temp
 use          obs_kind_mod, only : MARINE_SFC_U_WIND_COMPONENT, MARINE_SFC_V_WIND_COMPONENT, &
-                                  MARINE_SFC_TEMPERATURE, MARINE_SFC_SPECIFIC_HUMIDITY, &
-                                  MARINE_SFC_ALTIMETER
+                                  MARINE_SFC_TEMPERATURE, MARINE_SFC_SPECIFIC_HUMIDITY,     &
+                                  MARINE_SFC_ALTIMETER, MARINE_SFC_DEWPOINT,   &
+                                  MARINE_SFC_RELATIVE_HUMIDITY
 use obs_def_altimeter_mod, only : compute_altimeter
 use                netcdf
 
@@ -48,6 +55,13 @@
 character(len=15),  parameter :: marine_netcdf_file = 'marine_input.nc'
 character(len=129), parameter :: marine_out_file    = 'obs_seq.marine_sfc'
 
+! the following logical parameters control which water-vapor variables appear in the output file
+! and whether to use the NCEP error or Lin and Hubbard (2004) moisture error model
+logical, parameter :: LH_err                    = .false.
+logical, parameter :: include_specific_humidity = .true.
+logical, parameter :: include_relative_humidity = .false.
+logical, parameter :: include_dewpoint          = .false.
+
 integer, parameter   :: dsecobs = 2700,   &   ! observation window
                         num_copies = 1,   &   ! number of copies in sequence
                         num_qc     = 1        ! number of QC entries
@@ -57,11 +71,11 @@
 character (len=129) :: meta_data
 character (len=80)  :: name
 character (len=19)  :: datestr
-integer :: rcode, ncid, varid, nobs, n, i, dday, dsec, oday, &
+integer :: rcode, ncid, varid, nobs, nvars, n, i, dday, dsec, oday, &
            osec, nused, iyear, imonth, iday, ihour, imin, isec
 logical :: file_exist
 real(r8) :: sfcp_miss, tair_miss, tdew_miss, wdir_miss, wspd_miss, uwnd, &
-            vwnd, altim, palt, oerr, qobs, qerr, qsat, slp_miss, elev_miss, qc
+            vwnd, altim, palt, oerr, qobs, qerr, qsat, qobserr, rh, slp_miss, elev_miss, qc
 
 integer,  allocatable :: tobs(:), plid(:)
 real(r8), allocatable :: lat(:), lon(:), elev(:), sfcp(:), tair(:), slp(:), & 
@@ -99,6 +113,11 @@
 allocate(wdir(nobs))  ;  allocate(wspd(nobs))
 allocate(tobs(nobs))
 
+nvars = 4
+if (include_specific_humidity) nvars = nvars + 1
+if (include_relative_humidity) nvars = nvars + 1
+if (include_dewpoint) nvars = nvars + 1
+
 allocate(qc_sfcp(nobs)) ;  allocate(qc_slp(nobs))
 allocate(qc_tair(nobs)) ;  allocate(qc_tdew(nobs))
 allocate(qc_wdir(nobs)) ;  allocate(qc_wspd(nobs))
@@ -181,17 +200,17 @@
 inquire(file=marine_out_file, exist=file_exist)
 if ( file_exist ) then
 
-  call read_obs_seq(marine_out_file, 0, 0, 5*nobs, obs_seq)
+  call read_obs_seq(marine_out_file, 0, 0, nvars*nobs, obs_seq)
 
 else
 
-  call init_obs_sequence(obs_seq, num_copies, num_qc, 5*nobs)
+  call init_obs_sequence(obs_seq, num_copies, num_qc, nvars*nobs)
   do i = 1, num_copies
-    meta_data = 'NCEP BUFR observation'
+    meta_data = 'MADIS observation'
     call set_copy_meta_data(obs_seq, i, meta_data)
   end do
   do i = 1, num_qc
-    meta_data = 'NCEP QC index'
+    meta_data = 'Data QC'
     call set_qc_meta_data(obs_seq, i, meta_data)
   end do
 
@@ -299,17 +318,22 @@
 
   end if
 
-  ! add dew-point temperature data to obs. sequence, but as specific humidity
-  if ( tair(n) /= tair_miss .and. tdew(n) /= tdew_miss .and. sfcp(n) /= sfcp_miss ) then
+  ! add specific humidity to obs. sequence
+  if ( include_specific_humidity .and. tair(n) /= tair_miss .and. tdew(n) /= tdew_miss &
+       .and. sfcp(n) /= sfcp_miss .and. qc_tair(n) == 0 .and. qc_tdew(n) == 0 .and. qc_sfcp(n) == 0 ) then
 
-   if ( qc_tair(n) == 0 .and. qc_tdew(n) == 0 .and. qc_sfcp(n) == 0 ) then
-
     qobs = specific_humidity(sat_vapor_pressure(tdew(n)), sfcp(n))
     qsat = specific_humidity(sat_vapor_pressure(tair(n)), sfcp(n))
-    if ( plid(n) == 0 ) then
-      oerr = fixed_marine_rel_hum_error(palt, tair(n), qobs / qsat)
+    if ( LH_err ) then
+      qerr = rh_error_from_dewpt_and_temp(tair(n), tdew(n))
     else
-      oerr = moving_marine_rel_hum_error(palt, tair(n), qobs / qsat)
+      if ( plid(n) == 0 ) then
+!GSR - there was a bug here with the rh error assigned to oerr instead of qerr - qerr not defined
+! for calc below
+        qerr = fixed_marine_rel_hum_error(palt, tair(n), qobs / qsat)
+      else
+        qerr = moving_marine_rel_hum_error(palt, tair(n), qobs / qsat)
+      end if
     end if
     oerr = max(qerr * qsat, 0.0001_r8)
 
@@ -323,8 +347,41 @@
 
   end if
 
+  ! add relative humidity data to obs. sequence
+  if ( include_relative_humidity .and. tdew(n) /= tdew_miss .and. tair(n) /= tair_miss &
+       .and. qc_tair(n) == 0 .and. qc_tdew(n) == 0 ) then
+
+    rh = temp_and_dewpoint_to_rh(tair(n), tdew(n))
+    if ( LH_err ) then
+      oerr = rh_error_from_dewpt_and_temp(tair(n), tdew(n))
+    else
+      if ( plid(n) == 0 ) then
+        oerr = fixed_marine_rel_hum_error(palt, tair(n), rh)
+      else
+        oerr = moving_marine_rel_hum_error(palt, tair(n), rh)
+      end if
+    end if
+ 
+    call create_obs_type(lat(n), lon(n), def_elev, VERTISSURFACE, rh, &
+                         MARINE_SFC_RELATIVE_HUMIDITY, oerr, &
+                         oday, osec, qc, obs)
+    call append_obs_to_seq(obs_seq, obs)
+
   end if
 
+  ! add dew-point temperature data to obs. sequence
+  if ( include_dewpoint .and. tdew(n) /= tdew_miss .and. tair(n) /= tair_miss &
+       .and. qc_tair(n) == 0 .and. qc_tdew(n) == 0 ) then
+
+    rh = temp_and_dewpoint_to_rh(tair(n), tdew(n))
+    oerr = dewpt_error_from_rh_and_temp(tair(n), rh)
+    call create_obs_type(lat(n), lon(n), def_elev, VERTISSURFACE, tdew(n), &
+                         MARINE_SFC_DEWPOINT, oerr, &
+                         oday, osec, qc, obs)
+    call append_obs_to_seq(obs_seq, obs)
+
+  end if
+
   nused = nused + 1
   latu(nused) = lat(n)
   lonu(nused) = lon(n)

Modified: DART/trunk/observations/MADIS/convert_madis_rawin.f90
===================================================================
--- DART/trunk/observations/MADIS/convert_madis_rawin.f90	2010-02-08 17:22:10 UTC (rev 4259)
+++ DART/trunk/observations/MADIS/convert_madis_rawin.f90	2010-02-08 17:30:41 UTC (rev 4260)
@@ -18,6 +18,9 @@
 !                         library routines.
 !
 !     created Dec. 2007 Ryan Torn, NCAR/MMM
+!     modified Dec. 2008 Soyoung Ha and David Dowell, NCAR/MMM
+!     - added dewpoint as an output variable
+!     - added relative humidity as an output variable
 !
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -30,14 +33,19 @@
                                   append_obs_to_seq, init_obs_sequence, get_num_obs, &
                                   set_copy_meta_data, set_qc_meta_data
 use            meteor_mod, only : sat_vapor_pressure, specific_humidity, & 
-                                  wind_dirspd_to_uv, pres_alt_to_pres
+                                  wind_dirspd_to_uv, pres_alt_to_pres, &
+                                  temp_and_dewpoint_to_rh
 use           obs_err_mod, only : rawin_temp_error, rawin_wind_error, &
                                   rawin_pres_error, rawin_rel_hum_error
+use  dewpoint_obs_err_mod, only : dewpt_error_from_rh_and_temp, &
+                                  rh_error_from_dewpt_and_temp
 use obs_def_altimeter_mod, only : compute_altimeter
-use          obs_kind_mod, only : RADIOSONDE_U_WIND_COMPONENT,  & 
-                                  RADIOSONDE_V_WIND_COMPONENT,  & 
-                                  RADIOSONDE_TEMPERATURE,       & 
-                                  RADIOSONDE_SPECIFIC_HUMIDITY, &
+use          obs_kind_mod, only : RADIOSONDE_U_WIND_COMPONENT,      & 
+                                  RADIOSONDE_V_WIND_COMPONENT,      & 
+                                  RADIOSONDE_TEMPERATURE,           & 
+                                  RADIOSONDE_SPECIFIC_HUMIDITY,     &
+                                  RADIOSONDE_RELATIVE_HUMIDITY,     &
+                                  RADIOSONDE_DEWPOINT, &
                                   RADIOSONDE_SURFACE_ALTIMETER 
 use                netcdf
 
@@ -46,6 +54,13 @@
 character(len=19),  parameter :: rawin_in_file  = 'rawinsonde_input.nc'
 character(len=129), parameter :: rawin_out_file = 'obs_seq.rawin'
 
+! the following logical parameters control which water-vapor variables appear in the output file
+! and whether to use the NCEP error or Lin and Hubbard (2004) moisture error model
+logical, parameter :: LH_err                    = .false.
+logical, parameter :: include_specific_humidity = .true.
+logical, parameter :: include_relative_humidity = .false.
+logical, parameter :: include_dewpoint          = .false.
+
 integer, parameter ::   num_copies = 1,   &   ! number of copies in sequence
                         num_qc     = 1        ! number of QC entries
 
@@ -54,17 +69,18 @@
 character(len=19)   :: datestr
 
 integer :: oday, osec, iyear, imonth, iday, ihour, imin, isec, nman, nsig, nsound, & 
-           nmaxml, nmaxsw, nmaxst, maxobs, k, n, fid, var_id, dsec, dday
+           nmaxml, nmaxsw, nmaxst, maxobs, nvars_man, nvars_sigt, k, n, fid, var_id, dsec, dday
 
 integer, allocatable :: obscnt(:)
 
 logical :: fexist, sigwnd, sigtmp
 
-real(r8) :: obswindow, otime, lat, lon, elev, uwnd, vwnd, qobs, qsat, oerr, &
+real(r8) :: obswindow, otime, lat, lon, elev, uwnd, vwnd, qobs, qsat, dptk, oerr, &
             pres_miss, wdir_miss, wspd_miss, tair_miss, tdew_miss, prespa, & 
-            time_miss, qc, altim, qerr
+            time_miss, qc, altim, rh, qerr
 
 real(r8), allocatable :: pres(:), wdir(:), wspd(:), tair(:), tdew(:)
+integer,  allocatable :: qc_pres(:), qc_wdir(:), qc_wspd(:), qc_tair(:), qc_tdew(:)
 
 type(obs_sequence_type) :: obs_seq
 type(obs_type)          :: obs
@@ -122,7 +138,22 @@
   end do
 end if
 
-maxobs = nsound * (4 * nmaxml + 2 * nmaxsw + 2 * nmaxst + 1)
+nvars_man = 4
+nvars_sigt = 1
+if (include_specific_humidity) then
+  nvars_man = nvars_man + 1
+  nvars_sigt = nvars_sigt + 1
+end if
+if (include_relative_humidity) then
+  nvars_man = nvars_man + 1
+  nvars_sigt = nvars_sigt + 1
+end if
+if (include_dewpoint) then
+  nvars_man = nvars_man + 1
+  nvars_sigt = nvars_sigt + 1
+end if
+
+maxobs = nsound * (nvars_man * nmaxml + 2 * nmaxsw + nvars_sigt * nmaxst + 1)
 deallocate(obscnt)
 
 !  either read existing obs_seq or create a new one
@@ -137,11 +168,11 @@
 
   call init_obs_sequence(obs_seq, num_copies, num_qc, maxobs)
   do n = 1, num_copies
-    meta_data = 'NCEP BUFR observation'
+    meta_data = 'MADIS observation'
     call set_copy_meta_data(obs_seq, n, meta_data)
   end do
   do n = 1, num_qc
-    meta_data = 'NCEP QC index'
+    meta_data = 'Data QC'
     call set_qc_meta_data(obs_seq, n, meta_data)
   end do
 
@@ -171,6 +202,9 @@
 
   allocate(pres(nman))  ;  allocate(tair(nman))  ;  allocate(tdew(nman))
   allocate(wdir(nman))  ;  allocate(wspd(nman))
+  
+  allocate(qc_pres(nman))  ;  allocate(qc_tair(nman))  ;  allocate(qc_tdew(nman))
+  allocate(qc_wdir(nman))  ;  allocate(qc_wspd(nman))
 
   call check( nf90_inq_varid(fid, 'prMan', var_id) )
   call check( nf90_get_var(fid,var_id,pres,start=(/ 1, n /),count=(/ nman, 1 /)) )
@@ -187,8 +221,18 @@
   call check( nf90_inq_varid(fid, 'wsMan', var_id) )
   call check( nf90_get_var(fid,var_id,wspd,start=(/ 1, n /),count=(/ nman, 1 /)) )
   call check( nf90_get_att(fid, var_id, '_FillValue', wspd_miss) )
+  call check( nf90_inq_varid(fid, "prManQCR", var_id) )
+  call check( nf90_get_var(fid, var_id, qc_pres,start=(/ 1, n /),count=(/ nman, 1 /)) )
+  call check( nf90_inq_varid(fid, "tpManQCR", var_id) )
+  call check( nf90_get_var(fid, var_id, qc_tair,start=(/ 1, n /),count=(/ nman, 1 /)) )
+  call check( nf90_inq_varid(fid, "tdManQCR", var_id) )
+  call check( nf90_get_var(fid, var_id, qc_tdew,start=(/ 1, n /),count=(/ nman, 1 /)) )
+  call check( nf90_inq_varid(fid, "wdManQCR", var_id) )
+  call check( nf90_get_var(fid, var_id, qc_wdir,start=(/ 1, n /),count=(/ nman, 1 /)) )
+  call check( nf90_inq_varid(fid, "wsManQCR", var_id) )
+  call check( nf90_get_var(fid, var_id, qc_wspd,start=(/ 1, n /),count=(/ nman, 1 /)) )
 
-  if ( pres(1) /= pres_miss ) then
+  if ( pres(1) /= pres_miss .and. qc_pres(1) == 0 ) then
 
     altim = compute_altimeter(pres(1), elev)
     oerr  = rawin_pres_error(pres_alt_to_pres(elev) * 0.01_r8)
@@ -206,7 +250,7 @@
 
     prespa = pres(k) * 100.0_r8
 
-    if ( wdir(k) /= wdir_miss .and. wspd(k) /= wspd_miss ) then
+    if ( wdir(k) /= wdir_miss .and. wspd(k) /= wspd_miss .and. qc_wdir(k) == 0 .and. qc_wspd(k) == 0 ) then
 
       call wind_dirspd_to_uv(wdir(k), wspd(k), uwnd, vwnd)
       oerr = rawin_wind_error(pres(k))
@@ -224,7 +268,7 @@
 
     end if
 
-    if ( tair(k) /= tair_miss ) then
+    if ( tair(k) /= tair_miss .and. qc_tair(k) == 0 ) then
 
       oerr = rawin_temp_error(pres(k))
       if ( tair(k) >= 180.0_r8 .and. tair(k) <= 330.0_r8 .and. oerr /= missing_r8 ) then
@@ -237,12 +281,18 @@
 
     end if
 
-    if ( tair(k) /= tair_miss .and. tdew(k) /= tdew_miss ) then
+    if ( include_specific_humidity .and. tair(k) /= tair_miss .and. tdew(k) /= tdew_miss &
+          .and. qc_tair(k) == 0 .and. qc_tdew(k) == 0 ) then
 
-      qobs = tair(k) - tdew(k)
-      qobs = specific_humidity(sat_vapor_pressure(qobs),    prespa)
+      ! tdew is the dewpoint depression
+      dptk = tair(k) - tdew(k)
+      qobs = specific_humidity(sat_vapor_pressure(dptk),    prespa)
       qsat = specific_humidity(sat_vapor_pressure(tair(k)), prespa)
-      qerr = rawin_rel_hum_error(pres(k), tair(k), qobs / qsat)
+      if (LH_err ) then
+        qerr = rh_error_from_dewpt_and_temp(tair(k), dptk)
+      else
+        qerr = rawin_rel_hum_error(pres(k), tair(k), qobs / qsat)
+      end if
       oerr = max(qerr * qsat, 0.0001_r8)
 
       if ( qobs > 0.0_r8 .and. qobs <= 0.070_r8 .and. qerr /= missing_r8 ) then
@@ -253,8 +303,39 @@
 
     end if
 
+    if ( include_relative_humidity .and. tair(k) /= tair_miss .and. tdew(k) /= tdew_miss &
+         .and. qc_tair(k) == 0 .and. qc_tdew(k) == 0 ) then
+
+      ! tdew is the dewpoint depression
+      dptk = tair(k) - tdew(k)
+      rh = temp_and_dewpoint_to_rh(tair(k), dptk)
+      if (LH_err ) then
+        oerr = rh_error_from_dewpt_and_temp(tair(k), dptk)
+      else
+        oerr = rawin_rel_hum_error(pres(k), tair(k), rh)
+      end if
+
+      call create_obs_type(lat, lon, prespa, VERTISPRESSURE, rh, &
+                           RADIOSONDE_RELATIVE_HUMIDITY, oerr, oday, osec, qc, obs)
+      call append_obs_to_seq(obs_seq, obs)
+
+    end if
+
+    if ( include_dewpoint .and. tair(k) /= tair_miss .and. tdew(k) /= tdew_miss &
+         .and. qc_tair(k) == 0 .and. qc_tdew(k) == 0 ) then
+
+      ! tdew is the dewpoint depression
+      dptk = tair(k) - tdew(k)
+      rh = temp_and_dewpoint_to_rh(tair(k), dptk)
+      oerr = dewpt_error_from_rh_and_temp(tair(k), rh)
+      call create_obs_type(lat, lon, prespa, VERTISPRESSURE, dptk, &
+                           RADIOSONDE_DEWPOINT, oerr, oday, osec, qc, obs)
+      call append_obs_to_seq(obs_seq, obs)
+
+    end if
+
   end do
-  deallocate(pres, wdir, wspd, tair, tdew)
+  deallocate(pres, wdir, wspd, tair, tdew, qc_pres, qc_wdir, qc_wspd, qc_tair, qc_tdew)
 
   !  If desired, read the significant-level temperature data, write to obs. seq.
   call check( nf90_inq_varid(fid, 'numSigT', var_id) )
@@ -263,6 +344,7 @@
   if ( sigtmp .and. nsig <= nmaxst ) then
 
     allocate(pres(nsig))  ;  allocate(tair(nsig))  ;  allocate(tdew(nsig))
+    allocate(qc_pres(nsig))  ;  allocate(qc_tair(nsig))  ;  allocate(qc_tdew(nsig))
 
     !  read significant level data
     call check( nf90_inq_varid(fid, 'prSigT', var_id) )
@@ -274,12 +356,18 @@
     call check( nf90_inq_varid(fid, 'tdSigT', var_id) )
     call check( nf90_get_var(fid,var_id,tdew,start=(/ 1, n /),count=(/ nsig, 1 /)) )
     call check( nf90_get_att(fid, var_id, '_FillValue', tdew_miss) )
+    call check( nf90_inq_varid(fid, "prSigTQCR", var_id) )
+    call check( nf90_get_var(fid, var_id, qc_pres,start=(/ 1, n /),count=(/ nsig, 1 /)) )
+    call check( nf90_inq_varid(fid, "tpSigTQCR", var_id) )
+    call check( nf90_get_var(fid, var_id, qc_tair,start=(/ 1, n /),count=(/ nsig, 1 /)) )
+    call check( nf90_inq_varid(fid, "tdSigTQCR", var_id) )
+    call check( nf90_get_var(fid, var_id, qc_tdew,start=(/ 1, n /),count=(/ nsig, 1 /)) )
 
     do k = 1, nsig
 
       prespa = pres(k) * 100.0_r8
 
-      if ( tair(k) /= tair_miss ) then
+      if ( tair(k) /= tair_miss .and. qc_tair(k) == 0 ) then
 
         oerr = rawin_temp_error(pres(k))
         if ( tair(k) >= 180.0_r8 .and. tair(k) <= 330.0_r8 .and. oerr /= missing_r8 ) then
@@ -292,12 +380,18 @@
 
       end if
 
-      if ( tair(k) /= tair_miss .and. tdew(k) /= tdew_miss ) then
+      if ( include_specific_humidity .and. tair(k) /= tair_miss .and. tdew(k) /= tdew_miss &
+           .and. qc_tair(k) == 0 .and. qc_tdew(k) == 0 ) then
 
-        qobs = tair(k) - tdew(k)
-        qobs = specific_humidity(sat_vapor_pressure(qobs),    prespa)
+        ! tdew is the dewpoint depression
+        dptk = tair(k) - tdew(k)
+        qobs = specific_humidity(sat_vapor_pressure(dptk),    prespa)

@@ Diff output truncated at 40000 characters. @@


More information about the Dart-dev mailing list