Skip to content

Commit f2deaa2

Browse files
Merge pull request #791 from NCAR/oned_obs_diag_fix
Modified oned/obs_diag.f90 to add an unused singleton level
2 parents c6d3719 + 6cf8c4a commit f2deaa2

File tree

3 files changed

+63
-29
lines changed

3 files changed

+63
-29
lines changed

CHANGELOG.rst

+7
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ individual files.
2222

2323
The changes are now listed with the most recent at the top.
2424

25+
**January 9 2024 :: Bug-fix 1D obs_diag. Tag v11.8.7**
26+
27+
- Added a dummy dimension so 1D obs_diag output can be used with
28+
MATLAB diagnostic tools
29+
- Added a notification that probit inflation QCEFF options are ignored
30+
for RTPS
31+
2532
**December 6 2024 :: Developer tests. Tag v11.8.6**
2633

2734
- Tests for distribution modules: normal, beta, gamma

assimilation_code/programs/obs_diag/oned/obs_diag.f90

+55-28
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ program obs_diag
6868
integer, parameter :: MaxRegions = 4
6969
integer, parameter :: MaxTrusted = 5
7070
integer, parameter :: stringlength = 32
71+
! Output files need a single level to be compatible with three D fields for plotting
72+
integer, parameter :: Nlevels = 1
7173

7274
!---------------------------------------------------------------------
7375
! variables associated with the observation
@@ -1728,6 +1730,7 @@ subroutine WriteNetCDF(fname)
17281730
character(len=*), intent(in) :: fname
17291731

17301732
integer :: ncid, i, nobs, typesdimlen
1733+
integer :: LevelDimID, LevelVarID
17311734
integer :: RegionDimID, RegionVarID
17321735
integer :: TimeDimID, TimeVarID
17331736
integer :: CopyDimID, CopyVarID, CopyMetaVarID
@@ -1880,6 +1883,7 @@ subroutine WriteNetCDF(fname)
18801883
call nc_check(nf90_def_dim(ncid=ncid, &
18811884
name='time', len = NF90_UNLIMITED, dimid = TimeDimID), &
18821885
'WriteNetCDF', 'time:def_dim '//trim(fname))
1886+
18831887
call nc_check(nf90_def_dim(ncid=ncid, &
18841888
name='bounds', len = 2, dimid = BoundsDimID), &
18851889
'WriteNetCDF', 'bounds:def_dim '//trim(fname))
@@ -1892,6 +1896,10 @@ subroutine WriteNetCDF(fname)
18921896
name='obstypes', len = max_defined_types_of_obs, dimid = TypesDimID), &
18931897
'WriteNetCDF', 'types:def_dim '//trim(fname))
18941898

1899+
call nc_check(nf90_def_dim(ncid=ncid, &
1900+
name='level', len = 1, dimid = LevelDimID), &
1901+
'WriteNetCDF', 'level:def_dim '//trim(fname))
1902+
18951903
call nc_check(nf90_def_dim(ncid=ncid, &
18961904
name='region', len = Nregions, dimid = RegionDimID), &
18971905
'WriteNetCDF', 'region:def_dim '//trim(fname))
@@ -1926,6 +1934,22 @@ subroutine WriteNetCDF(fname)
19261934
call nc_check(nf90_put_att(ncid, TypesVarID, 'explanation', 'see ObservationTypes'), &
19271935
'WriteNetCDF', 'types:explanation')
19281936

1937+
!----------------------------------------------------------------------------
1938+
! Define 'level' dimension
1939+
!----------------------------------------------------------------------------
1940+
1941+
call nc_check(nf90_def_var(ncid=ncid, name='level', xtype=nf90_int, &
1942+
dimids=LevelDimID, varid=LevelVarID), 'WriteNetCDF', 'level:def_var')
1943+
call nc_check(nf90_put_att(ncid, LevelVarID, 'long_name', 'model level'), &
1944+
'WriteNetCDF', 'level:long_name')
1945+
call nc_check(nf90_put_att(ncid, LevelVarID, 'units', 'nondimensional'), &
1946+
'WriteNetCDF', 'level:units')
1947+
! Level values are -1 to reflect that they are not meaningful
1948+
call nc_check(nf90_put_att(ncid, LevelVarID, 'valid_range', (/-1, -1/)), &
1949+
'WriteNetCDF', 'level:valid_range')
1950+
call nc_check(nf90_put_att(ncid, LevelVarID, 'explanation', 'needed for compatibility with 3D'), &
1951+
'WriteNetCDF', 'level:explanation')
1952+
19291953
!----------------------------------------------------------------------------
19301954
! Define the regions coordinate variable and attributes
19311955
!----------------------------------------------------------------------------
@@ -1939,7 +1963,7 @@ subroutine WriteNetCDF(fname)
19391963
call nc_check(nf90_put_att(ncid, RegionVarID, 'valid_range', (/1,Nregions/)), &
19401964
'WriteNetCDF', 'region:valid_range')
19411965
call nc_check(nf90_put_att(ncid, RegionVarID, 'explanation', 'see region_names'), &
1942-
'WriteNetCDF', 'types:explanation')
1966+
'WriteNetCDF', 'region:explanation')
19431967

19441968
!----------------------------------------------------------------------------
19451969
! Define 'bounds' dimension
@@ -2055,6 +2079,9 @@ subroutine WriteNetCDF(fname)
20552079
call nc_check(nf90_put_var(ncid, TypesMetaVarID, obs_type_strings(1:max_defined_types_of_obs)), &
20562080
'WriteNetCDF', 'typesmeta:put_var')
20572081

2082+
call nc_check(nf90_put_var(ncid, LevelVarID, (/ -1 /)), &
2083+
'WriteNetCDF', 'level:put_var')
2084+
20582085
call nc_check(nf90_put_var(ncid, RegionVarID, (/ (i,i=1,Nregions) /) ), &
20592086
'WriteNetCDF', 'region:put_var')
20602087

@@ -2078,13 +2105,13 @@ subroutine WriteNetCDF(fname)
20782105

20792106
if ( verbose ) write(*,*)'summary for Priors of time-region vars'
20802107
if ( create_rank_histogram ) then
2081-
ierr = WriteTRV(ncid, prior, TimeDimID, CopyDimID, RegionDimID, RankDimID)
2108+
ierr = WriteTRV(ncid, prior, TimeDimID, CopyDimID, LevelDimID, RegionDimID, RankDimID)
20822109
else
2083-
ierr = WriteTRV(ncid, prior, TimeDimID, CopyDimID, RegionDimID)
2110+
ierr = WriteTRV(ncid, prior, TimeDimID, CopyDimID, LevelDimID, RegionDimID)
20842111
endif
20852112
if ( verbose ) write(*,*)
20862113
if ( verbose ) write(*,*)'summary for Posteriors of time-region vars'
2087-
ierr = WriteTRV(ncid, poste, TimeDimID, CopyDimID, RegionDimID)
2114+
ierr = WriteTRV(ncid, poste, TimeDimID, CopyDimID, LevelDimID, RegionDimID)
20882115
if ( verbose ) write(*,*)
20892116

20902117
!----------------------------------------------------------------------------
@@ -2100,10 +2127,10 @@ end subroutine WriteNetCDF
21002127
!======================================================================
21012128

21022129

2103-
function WriteTRV(ncid, vrbl, TimeDimID, CopyDimID, RegionDimID, RankDimID)
2130+
function WriteTRV(ncid, vrbl, TimeDimID, CopyDimID, LevelDimID, RegionDimID, RankDimID)
21042131
integer, intent(in) :: ncid
21052132
type(TRV_type), intent(in) :: vrbl
2106-
integer, intent(in) :: TimeDimID, CopyDimID, RegionDimID
2133+
integer, intent(in) :: TimeDimID, CopyDimID, RegionDimID, LevelDimID
21072134
integer, optional, intent(in) :: RankDimID
21082135
integer :: WriteTRV
21092136

@@ -2112,7 +2139,7 @@ function WriteTRV(ncid, vrbl, TimeDimID, CopyDimID, RegionDimID, RankDimID)
21122139
character(len=NF90_MAX_NAME) :: string1
21132140

21142141
integer :: VarID, VarID2, oldmode
2115-
real(r4), allocatable, dimension(:,:,:) :: rchunk
2142+
real(r4), allocatable, dimension(:,:,:, :) :: rchunk
21162143
integer, allocatable, dimension(:,:,:) :: ichunk
21172144

21182145
FLAVORS : do ivar = 1,num_obs_types
@@ -2124,31 +2151,31 @@ function WriteTRV(ncid, vrbl, TimeDimID, CopyDimID, RegionDimID, RankDimID)
21242151
write(*,'(i4,1x,A,1x,i8)') ivar, obs_type_strings(ivar), nobs
21252152
endif
21262153

2127-
allocate(rchunk(Nregions,Ncopies,Nepochs))
2154+
allocate(rchunk(Nregions,Nlevels, Ncopies, Nepochs))
21282155
rchunk = MISSING_R4
21292156

21302157
do itime = 1,Nepochs
21312158
do iregion = 1,Nregions
21322159

2133-
rchunk(iregion, 1,itime) = vrbl%Nposs( itime,iregion,ivar)
2134-
rchunk(iregion, 2,itime) = vrbl%Nused( itime,iregion,ivar)
2135-
rchunk(iregion, 3,itime) = vrbl%rmse( itime,iregion,ivar)
2136-
rchunk(iregion, 4,itime) = vrbl%bias( itime,iregion,ivar)
2137-
rchunk(iregion, 5,itime) = vrbl%spread( itime,iregion,ivar)
2138-
rchunk(iregion, 6,itime) = vrbl%totspread( itime,iregion,ivar)
2139-
rchunk(iregion, 7,itime) = vrbl%NbadDartQC( itime,iregion,ivar)
2140-
rchunk(iregion, 8,itime) = vrbl%observation(itime,iregion,ivar)
2141-
rchunk(iregion, 9,itime) = vrbl%ens_mean( itime,iregion,ivar)
2142-
rchunk(iregion,10,itime) = vrbl%Ntrusted( itime,iregion,ivar)
2143-
rchunk(iregion,11,itime) = vrbl%NDartQC_0( itime,iregion,ivar)
2144-
rchunk(iregion,12,itime) = vrbl%NDartQC_1( itime,iregion,ivar)
2145-
rchunk(iregion,13,itime) = vrbl%NDartQC_2( itime,iregion,ivar)
2146-
rchunk(iregion,14,itime) = vrbl%NDartQC_3( itime,iregion,ivar)
2147-
rchunk(iregion,15,itime) = vrbl%NDartQC_4( itime,iregion,ivar)
2148-
rchunk(iregion,16,itime) = vrbl%NDartQC_5( itime,iregion,ivar)
2149-
rchunk(iregion,17,itime) = vrbl%NDartQC_6( itime,iregion,ivar)
2150-
rchunk(iregion,18,itime) = vrbl%NDartQC_7( itime,iregion,ivar)
2151-
rchunk(iregion,19,itime) = vrbl%NDartQC_8( itime,iregion,ivar)
2160+
rchunk(iregion, 1, 1,itime) = vrbl%Nposs( itime,iregion,ivar)
2161+
rchunk(iregion, 1, 2,itime) = vrbl%Nused( itime,iregion,ivar)
2162+
rchunk(iregion, 1, 3,itime) = vrbl%rmse( itime,iregion,ivar)
2163+
rchunk(iregion, 1, 4,itime) = vrbl%bias( itime,iregion,ivar)
2164+
rchunk(iregion, 1, 5,itime) = vrbl%spread( itime,iregion,ivar)
2165+
rchunk(iregion, 1, 6,itime) = vrbl%totspread( itime,iregion,ivar)
2166+
rchunk(iregion, 1, 7,itime) = vrbl%NbadDartQC( itime,iregion,ivar)
2167+
rchunk(iregion, 1, 8,itime) = vrbl%observation(itime,iregion,ivar)
2168+
rchunk(iregion, 1, 9,itime) = vrbl%ens_mean( itime,iregion,ivar)
2169+
rchunk(iregion,1, 10,itime) = vrbl%Ntrusted( itime,iregion,ivar)
2170+
rchunk(iregion,1, 11,itime) = vrbl%NDartQC_0( itime,iregion,ivar)
2171+
rchunk(iregion,1, 12,itime) = vrbl%NDartQC_1( itime,iregion,ivar)
2172+
rchunk(iregion,1, 13,itime) = vrbl%NDartQC_2( itime,iregion,ivar)
2173+
rchunk(iregion,1, 14,itime) = vrbl%NDartQC_3( itime,iregion,ivar)
2174+
rchunk(iregion,1, 15,itime) = vrbl%NDartQC_4( itime,iregion,ivar)
2175+
rchunk(iregion,1, 16,itime) = vrbl%NDartQC_5( itime,iregion,ivar)
2176+
rchunk(iregion,1, 17,itime) = vrbl%NDartQC_6( itime,iregion,ivar)
2177+
rchunk(iregion,1, 18,itime) = vrbl%NDartQC_7( itime,iregion,ivar)
2178+
rchunk(iregion,1, 19,itime) = vrbl%NDartQC_8( itime,iregion,ivar)
21522179

21532180
enddo
21542181
enddo
@@ -2161,7 +2188,7 @@ function WriteTRV(ncid, vrbl, TimeDimID, CopyDimID, RegionDimID, RankDimID)
21612188
string1 = trim(obsname)//'_'//adjustl(vrbl%string)
21622189

21632190
call nc_check(nf90_def_var(ncid, name=string1, xtype=nf90_real, &
2164-
dimids=(/ RegionDimID, CopyDimID, TimeDimID /), &
2191+
dimids=(/ RegionDimID, LevelDimID, CopyDimID, TimeDimID /), &
21652192
varid=VarID), 'WriteTRV', 'region:def_var')
21662193
call nc_check(nf90_put_att(ncid, VarID, '_FillValue', MISSING_R4), &
21672194
'WriteTRV','put_att:fillvalue')

conf.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
author = 'Data Assimilation Research Section'
2222

2323
# The full version, including alpha/beta/rc tags
24-
release = '11.8.7'
24+
release = '11.8.8'
2525
root_doc = 'index'
2626

2727
# -- General configuration ---------------------------------------------------

0 commit comments

Comments
 (0)