@@ -68,6 +68,8 @@ program obs_diag
68
68
integer , parameter :: MaxRegions = 4
69
69
integer , parameter :: MaxTrusted = 5
70
70
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
71
73
72
74
!- --------------------------------------------------------------------
73
75
! variables associated with the observation
@@ -1728,6 +1730,7 @@ subroutine WriteNetCDF(fname)
1728
1730
character (len=* ), intent (in ) :: fname
1729
1731
1730
1732
integer :: ncid, i, nobs, typesdimlen
1733
+ integer :: LevelDimID, LevelVarID
1731
1734
integer :: RegionDimID, RegionVarID
1732
1735
integer :: TimeDimID, TimeVarID
1733
1736
integer :: CopyDimID, CopyVarID, CopyMetaVarID
@@ -1880,6 +1883,7 @@ subroutine WriteNetCDF(fname)
1880
1883
call nc_check(nf90_def_dim(ncid= ncid, &
1881
1884
name= ' time' , len = NF90_UNLIMITED, dimid = TimeDimID), &
1882
1885
' WriteNetCDF' , ' time:def_dim ' // trim (fname))
1886
+
1883
1887
call nc_check(nf90_def_dim(ncid= ncid, &
1884
1888
name= ' bounds' , len = 2 , dimid = BoundsDimID), &
1885
1889
' WriteNetCDF' , ' bounds:def_dim ' // trim (fname))
@@ -1892,6 +1896,10 @@ subroutine WriteNetCDF(fname)
1892
1896
name= ' obstypes' , len = max_defined_types_of_obs, dimid = TypesDimID), &
1893
1897
' WriteNetCDF' , ' types:def_dim ' // trim (fname))
1894
1898
1899
+ call nc_check(nf90_def_dim(ncid= ncid, &
1900
+ name= ' level' , len = 1 , dimid = LevelDimID), &
1901
+ ' WriteNetCDF' , ' level:def_dim ' // trim (fname))
1902
+
1895
1903
call nc_check(nf90_def_dim(ncid= ncid, &
1896
1904
name= ' region' , len = Nregions, dimid = RegionDimID), &
1897
1905
' WriteNetCDF' , ' region:def_dim ' // trim (fname))
@@ -1926,6 +1934,22 @@ subroutine WriteNetCDF(fname)
1926
1934
call nc_check(nf90_put_att(ncid, TypesVarID, ' explanation' , ' see ObservationTypes' ), &
1927
1935
' WriteNetCDF' , ' types:explanation' )
1928
1936
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
+
1929
1953
!- ---------------------------------------------------------------------------
1930
1954
! Define the regions coordinate variable and attributes
1931
1955
!- ---------------------------------------------------------------------------
@@ -1939,7 +1963,7 @@ subroutine WriteNetCDF(fname)
1939
1963
call nc_check(nf90_put_att(ncid, RegionVarID, ' valid_range' , (/ 1 ,Nregions/ )), &
1940
1964
' WriteNetCDF' , ' region:valid_range' )
1941
1965
call nc_check(nf90_put_att(ncid, RegionVarID, ' explanation' , ' see region_names' ), &
1942
- ' WriteNetCDF' , ' types :explanation' )
1966
+ ' WriteNetCDF' , ' region :explanation' )
1943
1967
1944
1968
!- ---------------------------------------------------------------------------
1945
1969
! Define 'bounds' dimension
@@ -2055,6 +2079,9 @@ subroutine WriteNetCDF(fname)
2055
2079
call nc_check(nf90_put_var(ncid, TypesMetaVarID, obs_type_strings(1 :max_defined_types_of_obs)), &
2056
2080
' WriteNetCDF' , ' typesmeta:put_var' )
2057
2081
2082
+ call nc_check(nf90_put_var(ncid, LevelVarID, (/ - 1 / )), &
2083
+ ' WriteNetCDF' , ' level:put_var' )
2084
+
2058
2085
call nc_check(nf90_put_var(ncid, RegionVarID, (/ (i,i= 1 ,Nregions) / ) ), &
2059
2086
' WriteNetCDF' , ' region:put_var' )
2060
2087
@@ -2078,13 +2105,13 @@ subroutine WriteNetCDF(fname)
2078
2105
2079
2106
if ( verbose ) write (* ,* )' summary for Priors of time-region vars'
2080
2107
if ( create_rank_histogram ) then
2081
- ierr = WriteTRV(ncid, prior, TimeDimID, CopyDimID, RegionDimID, RankDimID)
2108
+ ierr = WriteTRV(ncid, prior, TimeDimID, CopyDimID, LevelDimID, RegionDimID, RankDimID)
2082
2109
else
2083
- ierr = WriteTRV(ncid, prior, TimeDimID, CopyDimID, RegionDimID)
2110
+ ierr = WriteTRV(ncid, prior, TimeDimID, CopyDimID, LevelDimID, RegionDimID)
2084
2111
endif
2085
2112
if ( verbose ) write (* ,* )
2086
2113
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)
2088
2115
if ( verbose ) write (* ,* )
2089
2116
2090
2117
!- ---------------------------------------------------------------------------
@@ -2100,10 +2127,10 @@ end subroutine WriteNetCDF
2100
2127
! ======================================================================
2101
2128
2102
2129
2103
- function WriteTRV (ncid , vrbl , TimeDimID , CopyDimID , RegionDimID , RankDimID )
2130
+ function WriteTRV (ncid , vrbl , TimeDimID , CopyDimID , LevelDimID , RegionDimID , RankDimID )
2104
2131
integer , intent (in ) :: ncid
2105
2132
type (TRV_type), intent (in ) :: vrbl
2106
- integer , intent (in ) :: TimeDimID, CopyDimID, RegionDimID
2133
+ integer , intent (in ) :: TimeDimID, CopyDimID, RegionDimID, LevelDimID
2107
2134
integer , optional , intent (in ) :: RankDimID
2108
2135
integer :: WriteTRV
2109
2136
@@ -2112,7 +2139,7 @@ function WriteTRV(ncid, vrbl, TimeDimID, CopyDimID, RegionDimID, RankDimID)
2112
2139
character (len= NF90_MAX_NAME) :: string1
2113
2140
2114
2141
integer :: VarID, VarID2, oldmode
2115
- real (r4 ), allocatable , dimension (:,:,:) :: rchunk
2142
+ real (r4 ), allocatable , dimension (:,:,:, : ) :: rchunk
2116
2143
integer , allocatable , dimension (:,:,:) :: ichunk
2117
2144
2118
2145
FLAVORS : do ivar = 1 ,num_obs_types
@@ -2124,31 +2151,31 @@ function WriteTRV(ncid, vrbl, TimeDimID, CopyDimID, RegionDimID, RankDimID)
2124
2151
write (* ,' (i4,1x,A,1x,i8)' ) ivar, obs_type_strings(ivar), nobs
2125
2152
endif
2126
2153
2127
- allocate (rchunk(Nregions,Ncopies,Nepochs))
2154
+ allocate (rchunk(Nregions,Nlevels, Ncopies, Nepochs))
2128
2155
rchunk = MISSING_R4
2129
2156
2130
2157
do itime = 1 ,Nepochs
2131
2158
do iregion = 1 ,Nregions
2132
2159
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)
2152
2179
2153
2180
enddo
2154
2181
enddo
@@ -2161,7 +2188,7 @@ function WriteTRV(ncid, vrbl, TimeDimID, CopyDimID, RegionDimID, RankDimID)
2161
2188
string1 = trim (obsname)// ' _' // adjustl (vrbl% string)
2162
2189
2163
2190
call nc_check(nf90_def_var(ncid, name= string1, xtype= nf90_real, &
2164
- dimids= (/ RegionDimID, CopyDimID, TimeDimID / ), &
2191
+ dimids= (/ RegionDimID, LevelDimID, CopyDimID, TimeDimID / ), &
2165
2192
varid= VarID), ' WriteTRV' , ' region:def_var' )
2166
2193
call nc_check(nf90_put_att(ncid, VarID, ' _FillValue' , MISSING_R4 ), &
2167
2194
' WriteTRV' ,' put_att:fillvalue' )
0 commit comments