[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