Changeset 3000
- Timestamp:
- 2011-10-26T15:44:20+02:00 (13 years ago)
- Location:
- branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src
- Files:
-
- 33 added
- 4 deleted
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/convmerge.F90
r2945 r3000 3 3 USE toolspar_kind 4 4 USE obs_fbm 5 USE obs_utils 5 6 IMPLICIT NONE 6 7 … … 18 19 !! ** Action : 19 20 !! 21 !! Optional : 22 !! namelist = namobs.in to select the observation range 23 !! 20 24 !! History : 25 !! ! 2010 (K. Mogensen) Initial version 21 26 !!---------------------------------------------------------------------- 22 27 !! * Arguments … … 122 127 #include "greg2jul.h90" 123 128 124 #include "ddatetoymdhms.h90"129 !#include "ddatetoymdhms.h90" 125 130 126 131 END MODULE convmerge -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/corio2fb.F90
r2945 r3000 1 1 PROGRAM corio2fb 2 !!--------------------------------------------------------------------- 3 !! 4 !! ** PROGRAM corio2fb ** 5 !! 6 !! ** Purpose : Convert Coriolis format profiles to feedback format 7 !! 8 !! ** Method : Use of utilities from obs_fbm. 9 !! 10 !! ** Action : 11 !! 12 !! Usage: 13 !! corio2fb.exe outputfile inputfile1 inputfile2 ... 14 !! 15 !! History : 16 !! ! 2010 (K. Mogensen) Initial version 17 !!---------------------------------------------------------------------- 2 18 USE obs_fbm 3 19 USE obs_prof_io -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/ctl_stop.h90
r2945 r3000 10 10 !! ** Action : 11 11 !! 12 !! History : ( 08-12) K. Mogensen. NEMOVAR version12 !! History : (2008-12) K. Mogensen. NEMOVAR version 13 13 !!---------------------------------------------------------------------- 14 14 CHARACTER(len=*) :: cerr -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/enact2fb.F90
r2945 r3000 1 1 PROGRAM enact2fb 2 !!--------------------------------------------------------------------- 3 !! 4 !! ** PROGRAM corio2fb ** 5 !! 6 !! ** Purpose : Convert ENACT format profiles to feedback format 7 !! 8 !! ** Method : Use of utilities from obs_fbm. 9 !! 10 !! ** Action : 11 !! 12 !! Usage: 13 !! enact2fb.exe outputfile inputfile1 inputfile2 ... 14 !! 15 !! History : 16 !! ! 2010 (K. Mogensen) Initial version 17 !!---------------------------------------------------------------------- 2 18 USE obs_fbm 3 19 USE obs_prof_io -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbaccdata.F90
r2945 r3000 1 1 MODULE fbaccdata 2 INTEGER, DIMENSION(:,:,:,:), ALLOCATABLE :: inum 3 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: zmean,zrms,zsdev 2 USE fbacctype 3 IMPLICIT NONE 4 INTEGER, DIMENSION(:,:,:,:,:), ALLOCATABLE :: inum,inumov,inumbv 5 INTEGER, DIMENSION(:,:,:,:), ALLOCATABLE :: inuma 6 REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: zbias,zrms,zsdev,zomean,zmmean,& 7 & zoemea,zovmea,zbemea,zbvmea 8 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: zoamean 4 9 INTEGER, PARAMETER :: maxvars = 10 5 10 REAL, DIMENSION(maxvars) :: zcheck 6 11 REAL, DIMENSION(maxvars) :: zhistmax, zhistmin, zhiststep 7 TYPE histtype8 INTEGER :: npoints9 INTEGER, POINTER, DIMENSION(:,:,:,:) :: nhist10 END TYPE histtype11 12 TYPE(histtype), DIMENSION(maxvars) :: hist 12 13 REAL, DIMENSION(maxvars) :: zxymax, zxymin, zxystep 14 TYPE(xytype), DIMENSION(maxvars) :: xy 13 15 END MODULE fbaccdata 14 16 -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbcomb.F90
r2945 r3000 1 1 PROGRAM fbcomb 2 !!--------------------------------------------------------------------- 3 !! 4 !! ** PROGRAM fbcomb ** 5 !! 6 !! ** Purpose : Combine MPI decomposed feedback files into one file 7 !! 8 !! ** Method : Use of utilities from obs_fbm. 9 !! 10 !! ** Action : 11 !! 12 !! Usage: 13 !! fbcomb.exe outputfile inputfile1 inputfile2 ... 14 !! 15 !! History : 16 !! ! 2010 (K. Mogensen) Initial version 17 !!---------------------------------------------------------------------- 2 18 USE toolspar_kind 3 19 USE obs_fbm … … 23 39 REAL(KIND=dp),ALLOCATABLE :: zsort(:,:) 24 40 INTEGER,ALLOCATABLE :: iset(:),inum(:),iindex(:) 41 INTEGER :: iwmo 25 42 ! 26 43 ! Output data … … 30 47 ! Loop variables 31 48 ! 32 INTEGER :: ia,iv,ii,ij , ist49 INTEGER :: ia,iv,ii,ij 33 50 ! 34 51 ! Get number of command line arguments … … 48 65 ntotobs = 0 49 66 ninfiles = nargs - 1 50 ist=-151 67 DO ia=1, ninfiles 52 68 CALL getarg( ia+1, cdinfile(ia) ) … … 55 71 WRITE(*,'(2A)')'File = ', TRIM(cdinfile(ia)) 56 72 WRITE(*,'(A,I9,A)')'has', obsdata(ia)%nobs, ' observations' 57 IF (obsdata(ia)%nobs > 0 .AND. ist < 0) ist=ia ! find first file with obs in58 73 ntotobs = ntotobs + obsdata(ia)%nobs 59 74 ENDDO … … 62 77 ! Check that the data is confirming 63 78 ! 64 DO ia= ist+1, ninfiles65 IF ( obsdata(ia)%cdjuldref /= obsdata( ist)%cdjuldref ) THEN79 DO ia=2, ninfiles 80 IF ( obsdata(ia)%cdjuldref /= obsdata(1)%cdjuldref ) THEN 66 81 WRITE(*,*)'Different julian date reference. Aborting' 67 82 CALL abort 68 83 ENDIF 69 IF ( obsdata(ia)%nvar /= obsdata( ist)%nvar ) THEN84 IF ( obsdata(ia)%nvar /= obsdata(1)%nvar ) THEN 70 85 WRITE(*,*)'Different number of variables. Aborting' 71 86 CALL abort 72 87 ENDIF 73 IF (obsdata(ia)%nadd /= obsdata( ist)%nadd ) THEN88 IF (obsdata(ia)%nadd /= obsdata(1)%nadd ) THEN 74 89 WRITE(*,*)'Different number of additional entries. Aborting' 75 90 CALL abort 76 91 ENDIF 77 IF ( obsdata(ia)%next /= obsdata( ist)%next ) THEN92 IF ( obsdata(ia)%next /= obsdata(1)%next ) THEN 78 93 WRITE(*,*)'Different number of additional variables. Aborting' 79 94 CALL abort 80 95 ENDIF 81 IF ( obsdata(ia)%lgrid .NEQV. obsdata( ist)%lgrid ) THEN96 IF ( obsdata(ia)%lgrid .NEQV. obsdata(1)%lgrid ) THEN 82 97 WRITE(*,*)'Inconsistent grid search info. Aborting' 83 98 CALL abort 84 99 ENDIF 85 100 DO iv=1, obsdata(ia)%nvar 86 IF ( obsdata(ia)%cname(iv) /= obsdata( ist)%cname(iv) ) THEN101 IF ( obsdata(ia)%cname(iv) /= obsdata(1)%cname(iv) ) THEN 87 102 WRITE(*,*)'Variable name ', TRIM(obsdata(ia)%cname(iv)), & 88 & ' is different from ', TRIM(obsdata( ist)%cname(iv)), &103 & ' is different from ', TRIM(obsdata(1)%cname(iv)), & 89 104 & '. Aborting' 90 105 CALL abort 91 106 ENDIF 92 IF ( obsdata(ist)%lgrid .AND. obsdata(ia)%nobs > 0) THEN 93 IF ( obsdata(ia)%cgrid(iv) /= obsdata(ist)%cgrid(iv) ) THEN 94 WRITE(*,*)'Grid name ', TRIM(obsdata(ia)%cgrid(iv)), & 95 & ' is different from ', TRIM(obsdata(ist)%cgrid(iv)), & 96 & '. Aborting' 97 CALL abort 107 IF ( obsdata(1)%lgrid ) THEN 108 IF ( obsdata(ia)%cgrid(iv) /= obsdata(1)%cgrid(iv) ) THEN 109 IF (obsdata(1)%nobs==0) THEN 110 obsdata(1)%cgrid(iv) = obsdata(ia)%cgrid(iv) 111 ELSE 112 IF (obsdata(ia)%nobs>0) THEN 113 WRITE(*,*)'Grid name ', TRIM(obsdata(ia)%cgrid(iv)), & 114 & ' is different from ', & 115 & TRIM(obsdata(1)%cgrid(iv)), '. Aborting' 116 CALL abort 117 ENDIF 118 ENDIF 98 119 ENDIF 99 120 ENDIF 100 121 ENDDO 101 122 DO iv=1,obsdata(ia)%nadd 102 IF ( obsdata(ia)%caddname(iv) /= obsdata( ist)%caddname(iv) ) THEN123 IF ( obsdata(ia)%caddname(iv) /= obsdata(1)%caddname(iv) ) THEN 103 124 WRITE(*,*)'Additional name ', TRIM(obsdata(ia)%caddname(iv)), & 104 & ' is different from ', TRIM(obsdata( ist)%caddname(iv)), &125 & ' is different from ', TRIM(obsdata(1)%caddname(iv)), & 105 126 & '. Aborting' 106 127 CALL abort … … 108 129 ENDDO 109 130 DO iv=1,obsdata(ia)%next 110 IF ( obsdata(ia)%cextname(iv) /= obsdata( ist)%cextname(iv) ) THEN131 IF ( obsdata(ia)%cextname(iv) /= obsdata(1)%cextname(iv) ) THEN 111 132 WRITE(*,*)'Extra name ', TRIM(obsdata(ia)%cextname(iv)), & 112 & ' is different from ', TRIM(obsdata( ist)%cextname(iv)), &133 & ' is different from ', TRIM(obsdata(1)%cextname(iv)), & 113 134 & '. Aborting' 114 135 CALL abort … … 119 140 ! Construct sorting arrays 120 141 ! 121 ALLOCATE( zsort( 3,ntotobs), iset(ntotobs), &142 ALLOCATE( zsort(5,ntotobs), iset(ntotobs), & 122 143 & inum(ntotobs), iindex(ntotobs)) 123 144 ii = 0 … … 128 149 zsort(2,ii) = obsdata(ia)%pphi(ij) 129 150 zsort(3,ii) = obsdata(ia)%plam(ij) 151 iwmo = TRANSFER( obsdata(ia)%cdwmo(ij)(1:4), iwmo ) 152 zsort(4,ii) = iwmo 153 iwmo = TRANSFER( obsdata(ia)%cdwmo(ij)(5:8), iwmo ) 154 zsort(5,ii) = iwmo 130 155 iset(ii) = ia 131 156 inum(ii) = ij … … 135 160 ! Get indexes for time sorting. 136 161 ! 137 CALL index_sort_dp_n(zsort, 3,iindex,ntotobs)162 CALL index_sort_dp_n(zsort,5,iindex,ntotobs) 138 163 ! 139 164 ! Allocate output data … … 144 169 ENDDO 145 170 CALL init_obfbdata( obsoutdata ) 146 CALL alloc_obfbdata( obsoutdata, obsdata( ist)%nvar, ntotobs, nlev, &147 & obsdata( ist)%nadd, obsdata(ist)%next, obsdata(ist)%lgrid )171 CALL alloc_obfbdata( obsoutdata, obsdata(1)%nvar, ntotobs, nlev, & 172 & obsdata(1)%nadd, obsdata(1)%next, obsdata(1)%lgrid ) 148 173 ! 149 174 ! Copy input data into output data -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbmatchup.F90
r2945 r3000 1 1 PROGRAM fbmatchup 2 !!--------------------------------------------------------------------- 3 !! 4 !! ** PROGRAM fbmatchup ** 5 !! 6 !! ** Purpose : Find matching obs in feedback files 7 !! 8 !! ** Method : Use of utilities from obs_fbm. 9 !! 10 !! ** Action : 11 !! 12 !! Usage: 13 !! fbmatchup outputfile inputfile1 varname1 inputfile2 varname2 ... 14 !! 15 !! Optional: 16 !! namelist = namfbmatchup.in to set ldaily820 17 !! 18 !! History : 19 !! ! 2010 (K. Mogensen) Initial version 20 !!---------------------------------------------------------------------- 2 21 USE toolspar_kind 3 22 USE obs_fbm … … 14 33 CHARACTER(len=256),ALLOCATABLE :: cdinfile(:) 15 34 CHARACTER(len=ilenname),ALLOCATABLE :: cdnames(:) 16 INTEGER :: nqc35 CHARACTER(len=2*ilenname) :: cdtmp 17 36 LOGICAL :: ldaily820 18 NAMELIST/namfbmatchup/ nqc,ldaily82037 NAMELIST/namfbmatchup/ldaily820 19 38 ! 20 39 ! Input data … … 22 41 TYPE(obfbdata) :: obsdatatmp(1) 23 42 TYPE(obfbdata),POINTER :: obsdata(:) 24 INTEGER :: ninfiles,ntotobs,nlev 43 INTEGER :: ninfiles,ntotobs,nlev,nadd,next 25 44 ! 26 45 ! Time sorting arrays … … 35 54 REAL(KIND=fbsp) :: ztim,zphi,zlam 36 55 INTEGER(KIND=SELECTED_INT_KIND(12)) :: iwmo 56 LOGICAL, ALLOCATABLE :: ltaken(:) 37 57 ! 38 58 ! Output data … … 40 60 TYPE(obfbdata) :: obsoutdata 41 61 ! 62 ! Storage for extra to search for unique. 63 ! 64 CHARACTER(len=ilenname), ALLOCATABLE :: cexttmp(:) 65 TYPE extout 66 LOGICAL, POINTER, DIMENSION(:) :: luse 67 INTEGER, POINTER, DIMENSION(:) :: ipos 68 END TYPE extout 69 TYPE(extout), POINTER, DIMENSION(:) :: pextinf 70 ! 42 71 ! Loop variables 43 72 ! 44 INTEGER :: i a,ip,i1,ii,ij,ik1,ik2,iv,ist73 INTEGER :: ifi,ia,ip,i1,ii,ij,ik1,ik2,iv,ist,iadd,ie,iext 45 74 LOGICAL :: llfound 46 LOGICAL :: lexists 75 LOGICAL :: lexists,lnotobs 47 76 INTEGER :: ityp 48 77 ! … … 59 88 ! Read namelist if present 60 89 ! 61 nqc=162 90 ldaily820=.FALSE. 63 91 INQUIRE(file='namfbmatchup.in',exist=lexists) … … 71 99 ! Get input data 72 100 ! 73 ninfiles = ( nargs -1 ) / 2101 ninfiles = ( nargs -1 ) / 2 74 102 ALLOCATE( obsdata( ninfiles ) ) 75 103 ALLOCATE( cdinfile( ninfiles ) ) 76 104 ALLOCATE( cdnames( ninfiles ) ) 77 105 ip = 1 78 DO i a=1, ninfiles106 DO ifi = 1, ninfiles 79 107 ! 80 108 ! Read the unsorted file 81 109 ! 82 110 ip = ip + 1 83 CALL getarg( ip, cdinfile(i a) )111 CALL getarg( ip, cdinfile(ifi) ) 84 112 ip = ip + 1 85 CALL getarg( ip, cdnames(i a) )113 CALL getarg( ip, cdnames(ifi) ) 86 114 CALL init_obfbdata( obsdatatmp(1) ) 87 CALL read_obfbdata( TRIM(cdinfile(ia)), obsdatatmp(1) ) 88 ! 89 ! Check that only one variable present in input file 90 ! 91 IF ( obsdatatmp(1)%nadd > 1 ) THEN 92 WRITE(*,*)'Warning. More than one variable in input file' 93 WRITE(*,*)'Number of variables = ', obsdatatmp(1)%nadd 94 WRITE(*,*)'Only the first one is going to be stored' 95 ENDIF 96 IF ( obsdatatmp(1)%nadd < 1 ) THEN 97 WRITE(*,*)'Error. less than one variable in input file' 98 CALL abort 99 ENDIF 100 ! 101 ! Check that we have few levels than in the first file 102 ! 103 IF ( ia > 1 ) THEN 115 CALL read_obfbdata( TRIM(cdinfile(ifi)), obsdatatmp(1) ) 116 ! 117 ! Check if we have fewer levels than in the first file 118 ! 119 IF ( ifi > 1 ) THEN 104 120 IF ( obsdatatmp(1)%nlev > obsdata(1)%nlev ) THEN 105 121 WRITE(*,*)'Warning. More levels in file than the first file' … … 111 127 ENDIF 112 128 ! 113 ! Check that we have fewobservations than in the first file114 ! 115 IF ( i a> 1 ) THEN129 ! Check if we have fewer observations than in the first file 130 ! 131 IF ( ifi > 1 ) THEN 116 132 IF ( obsdatatmp(1)%nobs > obsdata(1)%nobs ) THEN 117 133 WRITE(*,*)'Warning. More obs in file than the first file' … … 125 141 ! Check that we have the same number of variables 126 142 ! 127 IF ( i a> 1 ) THEN143 IF ( ifi > 1 ) THEN 128 144 IF ( obsdatatmp(1)%nvar /= obsdata(1)%nvar ) THEN 129 145 WRITE(*,*)'Error. Different number of variables.' … … 136 152 ! Check reference datas 137 153 ! 138 IF ( i a> 1 ) THEN154 IF ( ifi > 1 ) THEN 139 155 IF ( obsdatatmp(1)%cdjuldref /= obsdata(1)%cdjuldref ) THEN 140 156 WRITE(*,*)'Different reference dates' … … 145 161 ! Special fix for daily average MRB data (820) for the first file 146 162 ! 147 IF (ldaily820.AND.(i a==1)) THEN163 IF (ldaily820.AND.(ifi==1)) THEN 148 164 DO ij = 1,obsdatatmp(1)%nobs 149 165 READ(obsdatatmp(1)%cdtyp(ij),'(I5)')ityp … … 171 187 ! 172 188 CALL index_sort_dp_n(zsort,3,iindex,obsdatatmp(1)%nobs) 173 CALL init_obfbdata( obsdata(i a) )174 CALL alloc_obfbdata( obsdata(i a), &189 CALL init_obfbdata( obsdata(ifi) ) 190 CALL alloc_obfbdata( obsdata(ifi), & 175 191 & obsdatatmp(1)%nvar, obsdatatmp(1)%nobs, & 176 192 & obsdatatmp(1)%nlev, obsdatatmp(1)%nadd, & … … 179 195 ! Copy input data into output data 180 196 ! 181 CALL merge_obfbdata( 1, obsdatatmp, obsdata(i a), iset, inum, iindex )197 CALL merge_obfbdata( 1, obsdatatmp, obsdata(ifi), iset, inum, iindex ) 182 198 CALL dealloc_obfbdata( obsdatatmp(1) ) 183 199 184 WRITE(*,'(2A)')'File = ', TRIM(cdinfile(i a))185 WRITE(*,'(A,I9,A)')'has', obsdata(i a)%nobs, ' observations'200 WRITE(*,'(2A)')'File = ', TRIM(cdinfile(ifi)) 201 WRITE(*,'(A,I9,A)')'has', obsdata(ifi)%nobs, ' observations' 186 202 187 203 DEALLOCATE( zsort, iset, inum, iindex ) … … 190 206 ! 191 207 ! Prepare output data 192 ! 208 ! 193 209 CALL init_obfbdata( obsoutdata ) 194 210 ! 211 ! Count number of additional fields 212 ! 213 nadd = 0 214 DO ifi = 1, ninfiles 215 nadd = nadd + obsdata(ifi)%nadd 216 ENDDO 217 ! 218 ! Count number of unique extra fields 219 ! 220 ! First the maximum to construct list 221 next = 0 222 DO ifi = 1, ninfiles 223 next = next + obsdata(ifi)%next 224 ENDDO 225 ALLOCATE( & 226 & cexttmp(next) & 227 & ) 228 ! Setup pextinf structure and search for unique extra fields 229 ALLOCATE( & 230 & pextinf(ninfiles) & 231 & ) 232 next = 0 233 DO ifi = 1, ninfiles 234 ALLOCATE( & 235 & pextinf(ifi)%luse(obsdata(ifi)%next), & 236 & pextinf(ifi)%ipos(obsdata(ifi)%next) & 237 & ) 238 DO ie = 1, obsdata(ifi)%next 239 llfound = .FALSE. 240 DO ii = 1, next 241 IF ( cexttmp(ii) == obsdata(ifi)%cextname(ie) ) THEN 242 llfound = .TRUE. 243 ENDIF 244 ENDDO 245 IF (llfound) THEN 246 pextinf(ifi)%luse(ie) = .FALSE. 247 pextinf(ifi)%ipos(ie) = -1 248 ELSE 249 next = next + 1 250 pextinf(ifi)%luse(ie) = .TRUE. 251 pextinf(ifi)%ipos(ie) = next 252 cexttmp(next) = obsdata(ifi)%cextname(ie) 253 ENDIF 254 ENDDO 255 ENDDO 256 ! 195 257 ! Copy the first input data to output data 196 258 ! 197 259 CALL copy_obfbdata( obsdata(1), obsoutdata, & 198 & kadd = ninfiles ) 199 DO ia = 1, ninfiles 200 obsoutdata%caddname(ia) = cdnames(ia) 201 obsoutdata%caddlong(ia,:) = obsdata(ia)%caddlong(1,:) 202 obsoutdata%caddunit(ia,:) = obsdata(ia)%caddunit(1,:) 260 & kadd = nadd, kext = next ) 261 ALLOCATE( ltaken(obsoutdata%nlev) ) 262 iadd = 0 263 DO ifi = 1, ninfiles 264 DO ia = 1, obsdata(ifi)%nadd 265 cdtmp = TRIM(obsdata(ifi)%caddname(ia))//TRIM(cdnames(ifi)) 266 obsoutdata%caddname(iadd+ia) = cdtmp(1:ilenname) 267 DO iv = 1, obsdata(ifi)%nvar 268 obsoutdata%caddlong(iadd+ia,iv) = obsdata(ifi)%caddlong(ia,iv) 269 obsoutdata%caddunit(iadd+ia,iv) = obsdata(ifi)%caddunit(ia,iv) 270 ENDDO 271 ENDDO 272 DO ie = 1, obsdata(ifi)%next 273 IF ( pextinf(ifi)%luse(ie) ) THEN 274 obsoutdata%cextname(pextinf(ifi)%ipos(ie)) = & 275 & obsdata(ifi)%cextname(ie) 276 obsoutdata%cextlong(pextinf(ifi)%ipos(ie)) = & 277 & obsdata(ifi)%cextlong(ie) 278 obsoutdata%cextunit(pextinf(ifi)%ipos(ie)) = & 279 & obsdata(ifi)%cextunit(ie) 280 ENDIF 281 ENDDO 282 iadd = iadd + obsdata(ifi)%nadd 203 283 ENDDO 204 284 ! … … 220 300 ! Merge extra data into output data 221 301 ! 222 DO ia = 2, ninfiles 302 iadd = obsdata(1)%nadd 303 DO ifi = 2, ninfiles 223 304 ist = 1 224 DO ii = 1, obsdata(i a)%nobs305 DO ii = 1, obsdata(ifi)%nobs 225 306 IF (MOD(ii,10000)==1) THEN 226 WRITE(*,*)'Handling observation no ',ii,' for file no ',i a307 WRITE(*,*)'Handling observation no ',ii,' for file no ',ifi 227 308 ENDIF 228 309 llfound = .FALSE. 229 iwmo = TRANSFER( obsdata(i a)%cdwmo(ii), iwmo )230 ztim = REAL( obsdata(i a)%ptim(ii), fbsp )231 zphi = REAL( obsdata(i a)%pphi(ii), fbsp )232 zlam = REAL( obsdata(i a)%plam(ii), fbsp )310 iwmo = TRANSFER( obsdata(ifi)%cdwmo(ii), iwmo ) 311 ztim = REAL( obsdata(ifi)%ptim(ii), fbsp ) 312 zphi = REAL( obsdata(ifi)%pphi(ii), fbsp ) 313 zlam = REAL( obsdata(ifi)%plam(ii), fbsp ) 233 314 ! Check if the the same index is the right one. 234 315 IF ( iwmo == irwmo(ii) ) THEN … … 237 318 IF ( zlam == zrlam(ii) ) THEN 238 319 llfound = .TRUE. 239 DO iv = 1, obsdata(ia)%nvar 240 ! Since the inner loop don't change the 241 ! qc decisions use this to ensure match 242 ! for duplicate observations 243 IF ( obsdata(ia)%ivqc(ii,iv) /= & 244 & obsoutdata%ivqc(ii,iv)) THEN 245 llfound = .FALSE. 246 CYCLE 247 ENDIF 248 ENDDO 249 IF (llfound) i1 = ii 320 i1 = ii 250 321 ENDIF 251 322 ENDIF … … 261 332 IF ( zlam == zrlam(i1) ) THEN 262 333 llfound = .TRUE. 263 DO iv = 1, obsdata(ia)%nvar 264 ! Since the inner loop don't change the 265 ! qc decisions use this to ensure match 266 ! for duplicate observations 267 IF ( obsdata(ia)%ivqc(ii,iv) /= & 268 & obsoutdata%ivqc(i1,iv)) THEN 269 llfound = .FALSE. 270 WRITE (*,*)'QC flags different for ',& 271 & TRIM(obsdata(ia)%cdwmo(ii)),' at ', & 272 & obsdata(ia)%ptim(ii) 273 CYCLE 274 ENDIF 275 ENDDO 276 IF (llfound) EXIT 334 EXIT 277 335 ENDIF 278 336 ENDIF … … 289 347 IF ( zlam == zrlam(i1) ) THEN 290 348 llfound = .TRUE. 291 DO iv = 1, obsdata(ia)%nvar 292 ! Since the inner loop don't change the 293 ! qc decisions use this to ensure match 294 ! for duplicate observations 295 IF ( obsdata(ia)%ivqc(ii,iv) /= & 296 & obsoutdata%ivqc(i1,iv)) THEN 297 llfound = .FALSE. 298 WRITE (*,*)'QC flags different for ',& 299 & TRIM(obsdata(ia)%cdwmo(ii)),' at ', & 300 & obsdata(ia)%ptim(ii) 301 CYCLE 302 ENDIF 303 ENDDO 304 IF (llfound) EXIT 349 EXIT 305 350 ENDIF 306 351 ENDIF … … 311 356 ! If found put the data into the common structure 312 357 IF (llfound) THEN 313 IF ( nqc == ia ) THEN 314 obsoutdata%ioqc(i1) = obsdata(ia)%ioqc(ii) 315 obsoutdata%ipqc(i1) = obsdata(ia)%ipqc(ii) 316 obsoutdata%itqc(i1) = obsdata(ia)%itqc(ii) 317 obsoutdata%ivqc(i1,:) = obsdata(ia)%ivqc(ii,:) 318 ENDIF 319 obsoutdata%ioqcf(:,i1) = IOR( obsdata(ia)%ioqcf(:,ii), & 358 obsoutdata%ioqc(i1) = & 359 & MAX( obsoutdata%ioqc(i1), obsdata(ifi)%ioqc(ii) ) 360 obsoutdata%ipqc(i1) = & 361 & MAX( obsoutdata%ipqc(i1), obsdata(ifi)%ipqc(ii) ) 362 obsoutdata%itqc(i1) = & 363 & MAX( obsoutdata%itqc(i1), obsdata(ifi)%itqc(ii) ) 364 obsoutdata%ivqc(i1,:) = & 365 & MAX( obsoutdata%ivqc(i1,:), obsdata(ifi)%ivqc(ii,:) ) 366 obsoutdata%ioqcf(:,i1) = IOR( obsdata(ifi)%ioqcf(:,ii), & 320 367 & obsoutdata%ioqcf(:,i1) ) 321 obsoutdata%ipqcf(:,i1) = IOR( obsdata(i a)%ipqcf(:,ii), &368 obsoutdata%ipqcf(:,i1) = IOR( obsdata(ifi)%ipqcf(:,ii), & 322 369 & obsoutdata%ipqcf(:,i1) ) 323 obsoutdata%itqcf(:,i1) = IOR( obsdata(i a)%itqcf(:,ii), &370 obsoutdata%itqcf(:,i1) = IOR( obsdata(ifi)%itqcf(:,ii), & 324 371 & obsoutdata%itqcf(:,i1) ) 325 obsoutdata%ivqcf(:,i1,:) = IOR( obsdata(i a)%ivqcf(:,ii,:), &372 obsoutdata%ivqcf(:,i1,:) = IOR( obsdata(ifi)%ivqcf(:,ii,:), & 326 373 & obsoutdata%ivqcf(:,i1,:) ) 327 374 llfound = .FALSE. 328 ! Search for levels 329 DO ik1 = 1, obsdata(ia)%nlev 330 DO ik2 = 1, obsoutdata%nlev 331 IF ( REAL( obsdata(ia)%pdep(ik1,ii), fbsp ) == & 375 ! Search for levels 376 ltaken(:) = .FALSE. 377 DO ik1 = 1, obsdata(ifi)%nlev 378 levloop : DO ik2 = 1, obsoutdata%nlev 379 IF ( REAL( obsdata(ifi)%pdep(ik1,ii), fbsp ) == & 332 380 & REAL( obsoutdata%pdep(ik2,i1), fbsp ) ) THEN 333 obsoutdata%padd(ik2,i1,ia,:) = & 334 & obsdata(ia)%padd(ik1,ii,1,:) 335 IF ( nqc == ia ) THEN 336 obsoutdata%idqc(ik2,i1) = obsdata(ia)%idqc(ik1,ii) 337 obsoutdata%ivlqc(ik2,i1,:) = obsdata(ia)%ivlqc(ik1,ii,:) 338 ENDIF 381 lnotobs=.TRUE. 382 IF (ltaken(ik2)) CYCLE 383 DO iv = 1, obsdata(ifi)%nvar 384 IF ( REAL( obsdata(ifi)%pob(ik1,ii,iv), fbsp ) == & 385 & REAL( obsoutdata%pob(ik2,i1,iv), fbsp ) ) THEN 386 lnotobs=.FALSE. 387 ENDIF 388 ENDDO 389 IF (lnotobs) CYCLE levloop 390 ltaken(ik2)=.TRUE. 391 DO ia = 1, obsdata(ifi)%nadd 392 obsoutdata%padd(ik2,i1,iadd+ia,:) = & 393 & obsdata(ifi)%padd(ik1,ii,ia,:) 394 ENDDO 395 DO ie = 1, obsdata(ifi)%next 396 IF ( pextinf(ifi)%luse(ie) ) THEN 397 obsoutdata%pext(ik2,i1,pextinf(ifi)%ipos(ie)) = & 398 & obsdata(ifi)%pext(ik1,ii,ie) 399 ENDIF 400 ENDDO 401 obsoutdata%idqc(ik2,i1) = & 402 & MAX( obsoutdata%idqc(ik2,i1), obsdata(ifi)%idqc(ik1,ii) ) 403 obsoutdata%ivlqc(ik2,i1,:) = & 404 & MAX( obsoutdata%ivlqc(ik2,i1,:), obsdata(ifi)%ivlqc(ik1,ii,:) ) 339 405 obsoutdata%idqcf(:,ik2,i1) = & 340 & IOR( obsdata(i a)%idqcf(:,ik1,ii), &406 & IOR( obsdata(ifi)%idqcf(:,ik1,ii), & 341 407 & obsoutdata%idqcf(:,ik2,i1) ) 342 408 obsoutdata%ivlqcf(:,ik2,i1,:) = & 343 & IOR( obsdata(i a)%ivlqcf(:,ik1,ii,:), &409 & IOR( obsdata(ifi)%ivlqcf(:,ik1,ii,:), & 344 410 & obsoutdata%ivlqcf(:,ik2,i1,:) ) 345 411 llfound = .TRUE. 346 412 EXIT 347 413 ENDIF 348 ENDDO 414 ENDDO levloop 349 415 ! Write warning if level not found 350 IF (.NOT.llfound.AND.(obsdata(i a)%pdep(ik1,ii)/=fbrmdi)) THEN416 IF (.NOT.llfound.AND.(obsdata(ifi)%pdep(ik1,ii)/=fbrmdi)) THEN 351 417 WRITE(*,*)'Level not found in first file : ',& 352 418 & TRIM( cdinfile(1) ) 353 419 WRITE(*,*)'Data file : ',& 354 & TRIM( cdinfile(i a) )420 & TRIM( cdinfile(ifi) ) 355 421 WRITE(*,*)'Identifier : ',& 356 & obsdata(i a)%cdwmo(ii)357 WRITE(*,*)'Juli an date : ',&358 & obsdata(i a)%ptim(ii)422 & obsdata(ifi)%cdwmo(ii) 423 WRITE(*,*)'Julifin date : ',& 424 & obsdata(ifi)%ptim(ii) 359 425 WRITE(*,*)'Latitude : ',& 360 & obsdata(i a)%pphi(ii)426 & obsdata(ifi)%pphi(ii) 361 427 WRITE(*,*)'Longitude : ',& 362 & obsdata(i a)%plam(ii)428 & obsdata(ifi)%plam(ii) 363 429 WRITE(*,*)'Depth : ',& 364 & obsdata(i a)%pdep(ik1,ii)430 & obsdata(ifi)%pdep(ik1,ii) 365 431 ENDIF 366 432 ENDDO … … 371 437 & TRIM( cdinfile(1) ) 372 438 WRITE(*,*)'Data file : ',& 373 & TRIM( cdinfile(i a) )439 & TRIM( cdinfile(ifi) ) 374 440 WRITE(*,*)'Identifier : ',& 375 & obsdata(i a)%cdwmo(ii)376 WRITE(*,*)'Juli an date : ',&377 & obsdata(i a)%ptim(ii)441 & obsdata(ifi)%cdwmo(ii) 442 WRITE(*,*)'Julifin date : ',& 443 & obsdata(ifi)%ptim(ii) 378 444 WRITE(*,*)'Latitude : ',& 379 & obsdata(i a)%pphi(ii)445 & obsdata(ifi)%pphi(ii) 380 446 WRITE(*,*)'Longitude : ',& 381 & obsdata(i a)%plam(ii)447 & obsdata(ifi)%plam(ii) 382 448 ist = 1 383 449 ENDIF 384 450 ENDDO 385 IF (obsdata(ia)%nobs>0) THEN 386 WRITE(*,*)'Handled last obs. no ',ii,' for file no ',ia 387 ENDIF 451 IF (obsdata(ifi)%nobs>0) THEN 452 WRITE(*,*)'Handled last obs. no ',ii,' for file no ',ifi 453 ENDIF 454 iadd = iadd + obsdata(ifi)%nadd 388 455 ENDDO 389 456 ! … … 391 458 ! 392 459 CALL write_obfbdata( TRIM(cdoutfile), obsoutdata ) 460 ! 461 ! Deallocate temporary data 462 ! 463 DEALLOCATE(zrtim,zrphi,zrlam,irwmo ) 464 DEALLOCATE( & 465 & cexttmp & 466 & ) 467 DO ifi = 1, ninfiles 468 DEALLOCATE( & 469 & pextinf(ifi)%luse, & 470 & pextinf(ifi)%ipos & 471 & ) 472 ENDDO 473 DEALLOCATE( & 474 & pextinf & 475 & ) 393 476 394 477 END PROGRAM fbmatchup -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbprint.F90
r2945 r3000 1 1 PROGRAM fbprint 2 !!--------------------------------------------------------------------- 3 !! 4 !! ** PROGRAM fbprint ** 5 !! 6 !! ** Purpose : Print feedback file contents as text 7 !! 8 !! ** Method : Use of utilities from obs_fbm. 9 !! 10 !! ** Action : 11 !! 12 !! Usage : 13 !! fbprint [options] inputfile 14 !! Options : 15 !! -b shorter output 16 !! -q QC flags (nqc=1) select observations based on QC flags 17 !! -Q QC flags (nqc=2) select observations based on QC flags 18 !! -B QC flags (nqc=3) select observations based on QC flags 19 !! -u unsorted 20 !! -s ID select station ID 21 !! -t TYPE select observation type 22 !! -v NUM1-NUM2 select variable range to print by number (default all) 23 !! -a NUM1-NUM2 select additional variable range to print by number (default all) 24 !! -e NUM1-NUM2 select extra variable range to print by number (default all) 25 !! -d output date range 26 !! -D print depths 27 !! -z use zipped files 28 !! 29 !! History : 30 !! ! 2010 (K. Mogensen) Initial version 31 !!---------------------------------------------------------------------- 2 32 USE toolspar_kind 3 33 USE obs_fbm 4 34 USE index_sort 35 USE date_utils 36 USE proftools 37 5 38 IMPLICIT NONE 6 39 ! … … 11 44 #endif 12 45 INTEGER :: nargs 13 CHARACTER(len=256) :: cdinfile,cdbrief 14 LOGICAL :: lbrief, lqcflags, lstat 15 CHARACTER(len=8) :: cdstat 46 CHARACTER(len=256) :: cdinfile, cdbrief 47 LOGICAL :: lbrief, lqcflags, lstat, ltyp, lsort, ldaterange, lzinp, ldepths 48 CHARACTER(len=ilenwmo) :: cdstat 49 CHARACTER(len=ilentyp) :: cdtyp 16 50 INTEGER :: nqc 51 INTEGER :: nvar1, nvar2, nadd1, nadd2, next1, next2 17 52 ! 18 53 ! Input data … … 22 57 ! Loop variables 23 58 ! 24 INTEGER :: ii 59 INTEGER :: ii, iarg, ip 25 60 ! 26 61 ! Sorting 27 62 ! 63 INTEGER :: iwmo 28 64 REAL(KIND=dp),ALLOCATABLE :: zsort(:,:) 29 65 INTEGER,ALLOCATABLE :: iindex(:) … … 34 70 lbrief = .FALSE. 35 71 lstat = .FALSE. 72 ltyp = .FALSE. 73 ldaterange = .FALSE. 74 ldepths = .FALSE. 36 75 cdstat = 'XXXXXXX' 76 cdtyp = 'XXXX' 77 lsort = .TRUE. 37 78 nqc = 0 38 IF ( (nargs < 1) .OR. (nargs > 3) ) THEN 79 nvar1 = -1 80 nvar2 = -1 81 nadd1 = -1 82 nadd2 = -1 83 next1 = -1 84 next2 = -1 85 lzinp = .FALSE. 86 IF ( nargs < 1 ) THEN 39 87 CALL usage() 40 88 ENDIF 41 IF (( nargs == 2 )) THEN 42 CALL getarg( 1, cdbrief ) 89 iarg = 1 90 DO 91 IF ( iarg == nargs ) EXIT 92 CALL getarg( iarg, cdbrief ) 43 93 IF ( cdbrief == '-b' ) THEN 44 94 lbrief = .TRUE. 95 iarg = iarg + 1 45 96 ELSEIF( cdbrief == '-q' ) THEN 46 97 lqcflags = .TRUE. 47 98 nqc=1 99 iarg = iarg + 1 48 100 ELSEIF( cdbrief == '-Q' ) THEN 49 101 lqcflags = .TRUE. 50 102 nqc=2 103 iarg = iarg + 1 51 104 ELSEIF( cdbrief == '-B' ) THEN 52 105 lqcflags = .TRUE. 53 106 nqc=3 107 iarg = iarg + 1 108 ELSEIF( cdbrief == '-u' ) THEN 109 lsort = .FALSE. 110 iarg = iarg + 1 111 ELSEIF ( cdbrief == '-s' ) THEN 112 lstat = .TRUE. 113 CALL getarg( iarg + 1, cdstat ) 114 iarg = iarg + 2 115 ELSEIF ( cdbrief == '-t' ) THEN 116 ltyp = .TRUE. 117 CALL getarg( iarg + 1, cdtyp ) 118 iarg = iarg + 2 119 ELSEIF ( cdbrief == '-v' ) THEN 120 CALL getarg( iarg + 1, cdbrief ) 121 ip=INDEX(cdbrief,'-') 122 IF (ip==0) THEN 123 READ(cdbrief,'(I10)') nvar1 124 IF (nvar1==0) THEN 125 nvar2=-1 126 ELSE 127 nvar2 = nvar1 128 ENDIF 129 ELSEIF(ip==1) THEN 130 nvar1=1 131 READ(cdbrief(ip+1:),'(I10)') nvar2 132 ELSE 133 READ(cdbrief(1:ip-1),'(I10)') nvar1 134 READ(cdbrief(ip+1:),'(I10)') nvar2 135 ENDIF 136 iarg = iarg + 2 137 ELSEIF ( cdbrief == '-a' ) THEN 138 CALL getarg( iarg + 1, cdbrief ) 139 ip=INDEX(cdbrief,'-') 140 IF (ip==0) THEN 141 READ(cdbrief,'(I10)') nadd1 142 IF (nadd1==0) THEN 143 nadd2=-1 144 ELSE 145 nadd2 = nadd1 146 ENDIF 147 ELSEIF(ip==1) THEN 148 nadd1=1 149 READ(cdbrief(ip+1:),'(I10)') nadd2 150 ELSE 151 READ(cdbrief(1:ip-1),'(I10)') nadd1 152 READ(cdbrief(ip+1:),'(I10)') nadd2 153 ENDIF 154 iarg = iarg + 2 155 ELSEIF ( cdbrief == '-e' ) THEN 156 CALL getarg( iarg + 1, cdbrief ) 157 ip=INDEX(cdbrief,'-') 158 IF (ip==0) THEN 159 READ(cdbrief,'(I10)') next1 160 IF (next1==0) THEN 161 next2=-1 162 ELSE 163 next2 = next1 164 ENDIF 165 ELSEIF(ip==1) THEN 166 next1=1 167 READ(cdbrief(ip+1:),'(I10)') next2 168 ELSE 169 READ(cdbrief(1:ip-1),'(I10)') next1 170 READ(cdbrief(ip+1:),'(I10)') next2 171 ENDIF 172 iarg = iarg + 2 173 ELSEIF ( cdbrief == '-d' ) THEN 174 ldaterange=.TRUE. 175 iarg = iarg + 1 176 ELSEIF ( cdbrief == '-D' ) THEN 177 ldepths=.TRUE. 178 iarg = iarg + 1 179 ELSEIF ( cdbrief == '-z' ) THEN 180 lzinp=.TRUE. 181 iarg = iarg + 1 54 182 ELSE 55 183 CALL usage 56 184 ENDIF 57 ENDIF 58 IF (( nargs == 3 )) THEN 59 CALL getarg( 1, cdbrief ) 60 IF ( cdbrief == '-s' ) THEN 61 lstat = .TRUE. 62 CALL getarg( 2, cdstat ) 63 ELSE 64 CALL usage 65 ENDIF 66 ENDIF 185 ENDDO 67 186 CALL getarg( nargs, cdinfile ) 68 187 ! 69 188 ! Get input data 70 189 ! 71 CALL read_obfbdata( TRIM(cdinfile), obsdata ) 190 IF (lzinp) THEN 191 #if defined NOSYSTEM 192 WRITE(*,*)'Compressed files need the system subroutine call' 193 CALL abort 194 #else 195 CALL system( 'cp '//TRIM(cdinfile)//' fbprint_tmp.nc.gz' ) 196 CALL system( 'gzip -df fbprint_tmp.nc.gz' ) 197 CALL read_obfbdata( 'fbprint_tmp.nc', obsdata ) 198 CALL system( 'rm -f fbprint_tmp.nc' ) 199 #endif 200 ELSE 201 CALL read_obfbdata( TRIM(cdinfile), obsdata ) 202 ENDIF 203 CALL sealsfromargo( obsdata ) 72 204 WRITE(*,'(2A,I9,A,I9,A)')TRIM(cdinfile), ' has ', obsdata%nobs ,& 73 205 & ' observations and a maximum of ', obsdata%nlev, ' levels' 206 IF (nvar1<0) THEN 207 nvar1 = 1 208 nvar2 = obsdata%nvar 209 ENDIF 210 IF (nadd1<0) THEN 211 nadd1 = 1 212 nadd2 = obsdata%nadd 213 ENDIF 214 IF (next1<0) THEN 215 next1 = 1 216 next2 = obsdata%next 217 ENDIF 74 218 ! 75 219 ! Sort the data 76 220 ! 77 ALLOCATE(zsort(3,obsdata%nobs),iindex(obsdata%nobs)) 78 DO ii=1,obsdata%nobs 79 zsort(1,ii)=obsdata%ptim(ii) 80 zsort(2,ii)=obsdata%pphi(ii) 81 zsort(3,ii)=obsdata%plam(ii) 82 ENDDO 83 CALL index_sort_dp_n(zsort,3,iindex,obsdata%nobs) 84 ! 85 ! Print the sorted list 86 ! 87 DO ii=1,obsdata%nobs 88 IF (lstat) THEN 89 IF (cdstat /= obsdata%cdwmo(ii)) CYCLE 221 ALLOCATE(zsort(5,obsdata%nobs),iindex(obsdata%nobs)) 222 IF (lsort) THEN 223 DO ii=1,obsdata%nobs 224 zsort(1,ii)=obsdata%ptim(ii) 225 zsort(2,ii)=obsdata%pphi(ii) 226 zsort(3,ii)=obsdata%plam(ii) 227 iwmo = TRANSFER( obsdata%cdwmo(ii)(1:4), iwmo ) 228 zsort(4,ii) = iwmo 229 iwmo = TRANSFER( obsdata%cdwmo(ii)(5:8), iwmo ) 230 zsort(5,ii) = iwmo 231 ENDDO 232 CALL index_sort_dp_n(zsort,5,iindex,obsdata%nobs) 233 ELSE 234 DO ii=1,obsdata%nobs 235 iindex(ii)=ii 236 ENDDO 237 ENDIF 238 IF (ldaterange) THEN 239 IF (obsdata%nobs>0) THEN 240 WRITE(*,'(A)')'First observation' 241 CALL print_time(obsdata%ptim(1)) 242 WRITE(*,'(A)')'Last observation' 243 CALL print_time(obsdata%ptim(obsdata%nobs)) 90 244 ENDIF 91 IF (lqcflags) THEN 92 CALL print_obs_qc(obsdata,iindex(ii),nqc) 93 ELSE 94 CALL print_obs(obsdata,iindex(ii),lbrief,lqcflags,nqc) 245 ELSE 246 ! 247 ! Print the sorted list 248 ! 249 DO ii=1,obsdata%nobs 250 IF (lstat) THEN 251 IF (TRIM(ADJUSTL(cdstat)) /= & 252 &TRIM(ADJUSTL(obsdata%cdwmo(iindex(ii))))) CYCLE 253 ENDIF 254 IF (ltyp) THEN 255 IF (TRIM(ADJUSTL(cdtyp)) /= & 256 &TRIM(ADJUSTL(obsdata%cdtyp(iindex(ii))))) CYCLE 257 ENDIF 258 IF (ldepths) THEN 259 CALL print_depths(obsdata,iindex(ii)) 260 ELSE 261 IF (lqcflags) THEN 262 CALL print_obs_qc(obsdata,iindex(ii),nqc,nvar1,nvar2) 263 ELSE 264 CALL print_obs(obsdata,iindex(ii),lbrief,& 265 & nvar1,nvar2,nadd1,nadd2,next1,next2) 266 ENDIF 267 ENDIF 268 ENDDO 269 270 ENDIF 271 272 CONTAINS 273 274 SUBROUTINE usage 275 WRITE(*,'(A)')'Usage:' 276 WRITE(*,'(A)')'fbprint [options] inputfile' 277 CALL abort() 278 END SUBROUTINE usage 279 280 SUBROUTINE print_depths(obsdata,iindex) 281 IMPLICIT NONE 282 TYPE(obfbdata) :: obsdata 283 INTEGER :: iindex 284 INTEGER :: kj 285 REAL :: mindep,maxdep 286 287 mindep=10000 288 maxdep=0 289 DO kj=1,obsdata%nlev 290 IF (obsdata%pdep(kj,iindex)<99999.0) THEN 291 IF (obsdata%pdep(kj,iindex)>maxdep) maxdep=obsdata%pdep(kj,iindex) 292 IF (obsdata%pdep(kj,iindex)<mindep) mindep=obsdata%pdep(kj,iindex) 293 ENDIF 294 ENDDO 295 296 WRITE(*,*)'Fileindex = ',obsdata%kindex(iindex) 297 WRITE(*,*)'Station identifier = ',obsdata%cdwmo(iindex) 298 WRITE(*,*)'Station type = ',obsdata%cdtyp(iindex) 299 WRITE(*,*)'Latitude = ',obsdata%pphi(iindex) 300 WRITE(*,*)'Longtude = ',obsdata%plam(iindex) 301 CALL print_time( obsdata%ptim(iindex) ) 302 WRITE(*,*)'Position QC = ',obsdata%ipqc(iindex) 303 WRITE(*,*)'Observation QC = ',obsdata%ioqc(iindex) 304 WRITE(*,*)'Minimum obs. depth = ',mindep 305 WRITE(*,*)'Maximum obs. depth = ',maxdep 306 WRITE(*,*) 307 308 END SUBROUTINE print_depths 309 310 SUBROUTINE print_obs(obsdata,iindex,lshort,& 311 & kvar1,kvar2,kadd1,kadd2,kext1,kext2) 312 IMPLICIT NONE 313 TYPE(obfbdata) :: obsdata 314 INTEGER :: iindex 315 LOGICAL :: lshort 316 INTEGER :: kvar1,kvar2,kadd1,kadd2,kext1,kext2 317 INTEGER :: jv,ja,je,jk 318 INTEGER :: kj 319 LOGICAL :: lskip 320 CHARACTER(len=1024) :: cdfmt1,cdfmt2 321 CHARACTER(len=16) :: cdtmp 322 323 WRITE(*,*)'Fileindex = ',obsdata%kindex(iindex) 324 WRITE(*,*)'Station identifier = ',obsdata%cdwmo(iindex) 325 WRITE(*,*)'Station type = ',obsdata%cdtyp(iindex) 326 WRITE(*,*)'Latitude = ',obsdata%pphi(iindex) 327 WRITE(*,*)'Longtude = ',obsdata%plam(iindex) 328 CALL print_time( obsdata%ptim(iindex) ) 329 WRITE(*,*)'Position QC = ',obsdata%ipqc(iindex) 330 WRITE(*,*)'Observation QC = ',obsdata%ioqc(iindex) 331 IF (.NOT.lshort) THEN 332 DO jv = kvar1, kvar2 333 WRITE(*,*)'Variable name = ',obsdata%cname(jv) 334 WRITE(*,*)'Variable QC = ',obsdata%ivqc(iindex,jv) 335 IF (obsdata%lgrid) THEN 336 WRITE(*,*)'Grid I = ',obsdata%iobsi(iindex,jv) 337 WRITE(*,*)'Grid J = ',obsdata%iobsj(iindex,jv) 338 ENDIF 339 ENDDO 340 cdfmt1='(1X,A8,1X,A8' 341 cdfmt2='(1X,F8.2,1X,I8' 342 DO jv = kvar1, kvar2 343 cdfmt1 = TRIM(cdfmt1)//',1X,A15,1X,A8' 344 cdfmt2 = TRIM(cdfmt2)//',1X,E15.9,1X,I8' 345 IF (kadd2-kadd1+1>0) THEN 346 WRITE(cdtmp,'(I10)')kadd2-kadd1+1 347 cdfmt1 = TRIM(cdfmt1)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,A15)' 348 cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,E15.9)' 349 ENDIF 350 IF (obsdata%lgrid) THEN 351 cdfmt1 = TRIM(cdfmt1)//',1X,A10' 352 cdfmt2 = TRIM(cdfmt2)//',1X,I10' 353 ENDIF 354 ENDDO 355 IF (kext2-kext1+1>0) THEN 356 WRITE(cdtmp,'(I10)')kext2-kext1+1 357 cdfmt1 = TRIM(cdfmt1)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,A15)' 358 cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,E15.9)' 359 ENDIF 360 cdfmt1=TRIM(cdfmt1)//')' 361 cdfmt2=TRIM(cdfmt2)//')' 362 IF (obsdata%lgrid) THEN 363 WRITE(*,FMT=cdfmt1)& 364 & 'DEPTH', 'DEP_QC', & 365 & (TRIM(obsdata%cname(jv))//'_OBS', & 366 & TRIM(obsdata%cname(jv))//'_QC' , & 367 & (TRIM(obsdata%cname(jv))//'_'//TRIM(obsdata%caddname(ja)),& 368 & ja = kadd1, kadd2 ), & 369 & TRIM(obsdata%cname(jv))//'_K' , & 370 & jv = kvar1, kvar2 ), & 371 & ( TRIM(obsdata%cextname(ja)),& 372 & ja = kext1, kext2 ) 373 DO kj=1,obsdata%nlev 374 IF (obsdata%pdep(kj,iindex)<99999.0) THEN 375 WRITE (*,FMT=cdfmt2) & 376 & obsdata%pdep(kj,iindex), & 377 & obsdata%idqc(kj,iindex), & 378 & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 379 & ( obsdata%padd(kj,iindex,ja,jv) , ja = kadd1, kadd2 ), & 380 & obsdata%iobsk(kj,iindex,jv), & 381 & jv = kvar1, kvar2 ), & 382 & ( obsdata%pext(kj,iindex,ja), ja = kext1, kext2 ) 383 ENDIF 384 ENDDO 385 ELSE 386 cdfmt1=TRIM(cdfmt1)//')' 387 cdfmt2=TRIM(cdfmt2)//')' 388 WRITE(*,FMT=cdfmt1)& 389 & 'DEPTH', 'DEP_QC', & 390 & (TRIM(obsdata%cname(jv))//'_OBS', & 391 & TRIM(obsdata%cname(jv))//'_QC' , & 392 & (TRIM(obsdata%cname(jv))//TRIM(obsdata%caddname(ja)),& 393 & ja = kadd1, kadd2 ), & 394 & jv = kvar1, kvar2 ), & 395 & ( TRIM(obsdata%cextname(ja)),& 396 & ja = kext1, kext2 ) 397 DO kj=1,obsdata%nlev 398 IF (obsdata%pdep(kj,iindex)<99999.0) THEN 399 WRITE (*,FMT=cdfmt2) & 400 & obsdata%pdep(kj,iindex), & 401 & obsdata%idqc(kj,iindex), & 402 & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 403 & ( obsdata%padd(kj,iindex,ja,jv) , ja = kadd1, kadd2 ), & 404 & jv = kvar1, kvar2 ), & 405 & ( obsdata%pext(kj,iindex,ja), ja = kext1, kext2 ) 406 ENDIF 407 ENDDO 408 ENDIF 95 409 ENDIF 96 ENDDO 97 98 END PROGRAM fbprint 99 100 SUBROUTINE usage 101 WRITE(*,'(A)')'Usage:' 102 WRITE(*,'(A)')'fbprint [-b] [-q] inputfile' 103 WRITE(*,'(A)')'where -b selects brief output' 104 WRITE(*,'(A)')' and -q selects qc flags rather than extra fields' 105 CALL abort() 106 END SUBROUTINE usage 107 108 SUBROUTINE print_obs(obsdata,iindex,lshort) 109 USE obs_fbm 110 USE date_utils 111 IMPLICIT NONE 112 TYPE(obfbdata) :: obsdata 113 INTEGER :: iindex 114 LOGICAL :: lshort 115 INTEGER :: jv,ja,je,jk 116 INTEGER :: kj,iyr,imon,iday,ihou,imin,isec 117 LOGICAL :: lskip 118 CHARACTER(len=1024) :: cdfmt1,cdfmt2 119 CHARACTER(len=16) :: cdtmp 120 121 WRITE(*,*)'Fileindex = ',obsdata%kindex(iindex) 122 WRITE(*,*)'Station identifier = ',obsdata%cdwmo(iindex) 123 WRITE(*,*)'Station type = ',obsdata%cdtyp(iindex) 124 WRITE(*,*)'Latitude = ',obsdata%pphi(iindex) 125 WRITE(*,*)'Longtude = ',obsdata%plam(iindex) 126 WRITE(*,*)'Position QC = ',obsdata%ipqc(iindex) 127 WRITE(*,*)'Observation QC = ',obsdata%ioqc(iindex) 128 WRITE(*,*)'Julian date = ',obsdata%ptim(iindex) 129 CALL jul2greg(isec,imin,ihou,iday,imon,iyr,obsdata%ptim(iindex)) 130 WRITE(*,'(1X,A,I4,2I2.2)') & 131 & 'Gregorian date = ',iyr,imon,iday 132 WRITE(*,'(1X,A,I2.2,A1,I2.2,A1,I2.2)') & 133 & 'Time = ',ihou,':',imin,':',isec 134 IF (.NOT.lshort) THEN 135 DO jv = 1,obsdata%nvar 410 WRITE(*,*) 411 END SUBROUTINE print_obs 412 413 SUBROUTINE print_obs_qc(obsdata,iindex,kqc,kvar1,kvar2) 414 IMPLICIT NONE 415 TYPE(obfbdata) :: obsdata 416 INTEGER :: iindex 417 LOGICAL :: lqc 418 INTEGER :: kqc 419 INTEGER :: kvar1,kvar2 420 INTEGER :: jv,ja,je,jk 421 INTEGER :: kj 422 LOGICAL :: lskip 423 CHARACTER(len=1024) :: cdfmt1,cdfmt2 424 CHARACTER(len=16) :: cdtmp 425 INTEGER :: iqcf 426 427 IF (kqc==2) THEN 428 lskip=.TRUE. 429 IF (obsdata%ipqc(iindex)>1) lskip=.FALSE. 430 IF (obsdata%ioqc(iindex)>1) lskip=.FALSE. 431 DO jv = kvar1, kvar2 432 IF (obsdata%ivqc(iindex,jv)>1) lskip=.FALSE. 433 ENDDO 434 DO kj=1,obsdata%nlev 435 IF (obsdata%pdep(kj,iindex)<99999.0) THEN 436 IF (obsdata%idqc(kj,iindex)>1) lskip=.FALSE. 437 DO jv = kvar1, kvar2 438 IF (obsdata%ivlqc(kj,iindex,jv)>1) lskip=.FALSE. 439 ENDDO 440 ENDIF 441 ENDDO 442 IF (lskip) RETURN 443 ELSEIF (kqc==3) THEN 444 lskip=.TRUE. 445 DO kj=1,obsdata%nlev 446 IF (obsdata%pdep(kj,iindex)<99999.0) THEN 447 iqcf=0 448 DO jv = kvar1, kvar2 449 IF (obsdata%ivlqc(kj,iindex,jv)>1) iqcf=iqcf+1 450 IF (iqcf==obsdata%nvar) lskip=.FALSE. 451 ENDDO 452 ENDIF 453 ENDDO 454 IF (lskip) RETURN 455 ENDIF 456 WRITE(*,*)'Fileindex = ',obsdata%kindex(iindex) 457 WRITE(*,*)'Station identifier = ',obsdata%cdwmo(iindex) 458 WRITE(*,*)'Station type = ',obsdata%cdtyp(iindex) 459 WRITE(*,*)'Latitude = ',obsdata%pphi(iindex) 460 WRITE(*,*)'Longtude = ',obsdata%plam(iindex) 461 CALL print_time( obsdata%ptim(iindex) ) 462 WRITE(*,*)'Position QC = ',obsdata%ipqc(iindex) 463 WRITE(*,*)'Position QC flags = ',obsdata%ipqcf(:,iindex) 464 WRITE(*,*)'Observation QC = ',obsdata%ioqc(iindex) 465 WRITE(*,*)'Observation QC flags= ',obsdata%ioqcf(:,iindex) 466 DO jv = kvar1, kvar2 136 467 WRITE(*,*)'Variable name = ',obsdata%cname(jv) 137 468 WRITE(*,*)'Variable QC = ',obsdata%ivqc(iindex,jv) 138 IF (obsdata%lgrid) THEN 139 WRITE(*,*)'Grid I = ',obsdata%iobsi(iindex,jv) 140 WRITE(*,*)'Grid J = ',obsdata%iobsj(iindex,jv) 141 ENDIF 469 WRITE(*,*)'Variable QC flags = ',obsdata%ivqcf(:,iindex,jv) 142 470 ENDDO 143 471 cdfmt1='(1X,A8,1X,A8' 144 472 cdfmt2='(1X,F8.2,1X,I8' 145 DO jv=1, obsdata%nvar 473 WRITE(cdtmp,'(I10)')obsdata%nqcf 474 cdfmt1 = TRIM(cdfmt1)//',1X,A18' 475 cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(I9)' 476 DO jv = kvar1, kvar2 146 477 cdfmt1 = TRIM(cdfmt1)//',1X,A15,1X,A8' 147 478 cdfmt2 = TRIM(cdfmt2)//',1X,E15.9,1X,I8' 148 IF (obsdata%nadd>0) THEN 149 WRITE(cdtmp,'(I10)')obsdata%nadd 150 cdfmt1 = TRIM(cdfmt1)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,A15)' 151 cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,E15.9)' 152 ENDIF 153 IF (obsdata%lgrid) THEN 154 cdfmt1 = TRIM(cdfmt1)//',1X,A10' 155 cdfmt2 = TRIM(cdfmt2)//',1X,I10' 156 ENDIF 479 WRITE(cdtmp,'(I10)')obsdata%nqcf 480 cdfmt1 = TRIM(cdfmt1)//',1X,A18' 481 cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(I9)' 157 482 ENDDO 158 483 IF (obsdata%next>0) THEN … … 163 488 cdfmt1=TRIM(cdfmt1)//')' 164 489 cdfmt2=TRIM(cdfmt2)//')' 165 IF (obsdata%lgrid) THEN 166 WRITE(*,FMT=cdfmt1)& 167 & 'DEPTH', 'DEP_QC', & 168 & (TRIM(obsdata%cname(jv))//'_OBS', & 169 & TRIM(obsdata%cname(jv))//'_QC' , & 170 & (TRIM(obsdata%cname(jv))//'_'//TRIM(obsdata%caddname(ja)),& 171 & ja = 1, obsdata%nadd ), & 172 & TRIM(obsdata%cname(jv))//'_K' , & 173 & jv = 1, obsdata%nvar ), & 174 & ( TRIM(obsdata%cextname(ja)),& 175 & ja = 1, obsdata%next ) 176 DO kj=1,obsdata%nlev 177 IF (obsdata%pdep(kj,iindex)<99999.0) THEN 178 WRITE (*,FMT=cdfmt2) & 179 & obsdata%pdep(kj,iindex), & 180 & obsdata%idqc(kj,iindex), & 181 & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 182 & ( obsdata%padd(kj,iindex,ja,jv) , ja=1, obsdata%nadd ), & 183 & obsdata%iobsk(kj,iindex,jv), & 184 & jv = 1, obsdata%nvar ), & 185 & ( obsdata%pext(kj,iindex,ja), ja=1, obsdata%next ) 186 ENDIF 187 ENDDO 188 ELSE 189 cdfmt1=TRIM(cdfmt1)//')' 190 cdfmt2=TRIM(cdfmt2)//')' 191 WRITE(*,FMT=cdfmt1)& 192 & 'DEPTH', 'DEP_QC', & 193 & (TRIM(obsdata%cname(jv))//'_OBS', & 194 & TRIM(obsdata%cname(jv))//'_QC' , & 195 & (TRIM(obsdata%cname(jv))//TRIM(obsdata%caddname(ja)),& 196 & ja = 1, obsdata%nadd ), & 197 & jv = 1, obsdata%nvar ), & 198 & ( TRIM(obsdata%cextname(ja)),& 199 & ja = 1, obsdata%next ) 200 DO kj=1,obsdata%nlev 201 IF (obsdata%pdep(kj,iindex)<99999.0) THEN 202 WRITE (*,FMT=cdfmt2) & 203 & obsdata%pdep(kj,iindex), & 204 & obsdata%idqc(kj,iindex), & 205 & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 206 & ( obsdata%padd(kj,iindex,ja,jv) , ja=1, obsdata%nadd ), & 207 & jv = 1, obsdata%nvar ), & 208 & ( obsdata%pext(kj,iindex,ja), ja=1, obsdata%next ) 209 ENDIF 210 ENDDO 211 ENDIF 212 ENDIF 213 WRITE(*,*) 214 END SUBROUTINE print_obs 215 216 SUBROUTINE print_obs_qc(obsdata,iindex,kqc) 217 USE obs_fbm 218 USE date_utils 219 IMPLICIT NONE 220 TYPE(obfbdata) :: obsdata 221 INTEGER :: iindex 222 LOGICAL :: lqc 223 INTEGER :: kqc 224 INTEGER :: jv,ja,je,jk 225 INTEGER :: kj,iyr,imon,iday,ihou,imin,isec 226 LOGICAL :: lskip 227 CHARACTER(len=1024) :: cdfmt1,cdfmt2 228 CHARACTER(len=16) :: cdtmp 229 integer :: iqcf 230 231 IF (kqc==2) THEN 232 lskip=.TRUE. 233 IF (obsdata%ipqc(iindex)>1) lskip=.FALSE. 234 IF (obsdata%ioqc(iindex)>1) lskip=.FALSE. 235 DO jv = 1,obsdata%nvar 236 IF (obsdata%ivqc(iindex,jv)>1) lskip=.FALSE. 237 ENDDO 490 WRITE(*,FMT=cdfmt1)& 491 & 'DEPTH', 'DEP_QC', 'DEP_QC_FLAGS', & 492 & (TRIM(obsdata%cname(jv))//'_OBS', & 493 & TRIM(obsdata%cname(jv))//'_QC' , & 494 & TRIM(obsdata%cname(jv))//'_QC_FLAGS',& 495 & jv = kvar1, kvar2 ), & 496 & ( TRIM(obsdata%cextname(ja)),& 497 & ja = 1, obsdata%next ) 238 498 DO kj=1,obsdata%nlev 239 IF (obsdata%pdep(kj,iindex)<99999.0) THEN 499 IF (kqc>=2) THEN 500 lskip=.TRUE. 240 501 IF (obsdata%idqc(kj,iindex)>1) lskip=.FALSE. 241 DO jv = 1, obsdata%nvar502 DO jv = kvar1, kvar2 242 503 IF (obsdata%ivlqc(kj,iindex,jv)>1) lskip=.FALSE. 243 504 ENDDO 244 ENDIF 245 ENDDO 246 IF (lskip) RETURN 247 ELSEIF (kqc==3) THEN 248 lskip=.TRUE. 249 DO kj=1,obsdata%nlev 505 IF (lskip) CYCLE 506 ENDIF 250 507 IF (obsdata%pdep(kj,iindex)<99999.0) THEN 251 iqcf=0 252 DO jv = 1, obsdata%nvar 253 IF (obsdata%ivlqc(kj,iindex,jv)>1) iqcf=iqcf+1 254 IF (iqcf==obsdata%nvar) lskip=.FALSE. 255 ENDDO 256 ENDIF 257 ENDDO 258 IF (lskip) RETURN 259 ENDIF 260 WRITE(*,*)'Fileindex = ',obsdata%kindex(iindex) 261 WRITE(*,*)'Station identifier = ',obsdata%cdwmo(iindex) 262 WRITE(*,*)'Station type = ',obsdata%cdtyp(iindex) 263 WRITE(*,*)'Latitude = ',obsdata%pphi(iindex) 264 WRITE(*,*)'Longtude = ',obsdata%plam(iindex) 265 WRITE(*,*)'Position QC = ',obsdata%ipqc(iindex) 266 WRITE(*,*)'Position QC flags = ',obsdata%ipqcf(:,iindex) 267 WRITE(*,*)'Observation QC = ',obsdata%ioqc(iindex) 268 WRITE(*,*)'Observation QC flags= ',obsdata%ioqcf(:,iindex) 269 WRITE(*,*)'Julian date = ',obsdata%ptim(iindex) 270 CALL jul2greg(isec,imin,ihou,iday,imon,iyr,obsdata%ptim(iindex)) 271 WRITE(*,'(1X,A,I4,2I2.2)') & 272 & 'Gregorian date = ',iyr,imon,iday 273 WRITE(*,'(1X,A,I2.2,A1,I2.2,A1,I2.2)') & 274 & 'Time = ',ihou,':',imin,':',isec 275 DO jv = 1,obsdata%nvar 276 WRITE(*,*)'Variable name = ',obsdata%cname(jv) 277 WRITE(*,*)'Variable QC = ',obsdata%ivqc(iindex,jv) 278 WRITE(*,*)'Variable QC flags = ',obsdata%ivqcf(:,iindex,jv) 279 ENDDO 280 cdfmt1='(1X,A8,1X,A8' 281 cdfmt2='(1X,F8.2,1X,I8' 282 WRITE(cdtmp,'(I10)')obsdata%nqcf 283 cdfmt1 = TRIM(cdfmt1)//',1X,A18' 284 cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(I9)' 285 DO jv=1, obsdata%nvar 286 cdfmt1 = TRIM(cdfmt1)//',1X,A15,1X,A8' 287 cdfmt2 = TRIM(cdfmt2)//',1X,E15.9,1X,I8' 288 WRITE(cdtmp,'(I10)')obsdata%nqcf 289 cdfmt1 = TRIM(cdfmt1)//',1X,A18' 290 cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(I9)' 291 ENDDO 292 IF (obsdata%next>0) THEN 293 WRITE(cdtmp,'(I10)')obsdata%next 294 cdfmt1 = TRIM(cdfmt1)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,A15)' 295 cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,E15.9)' 296 ENDIF 297 cdfmt1=TRIM(cdfmt1)//')' 298 cdfmt2=TRIM(cdfmt2)//')' 299 WRITE(*,FMT=cdfmt1)& 300 & 'DEPTH', 'DEP_QC', 'DEP_QC_FLAGS', & 301 & (TRIM(obsdata%cname(jv))//'_OBS', & 302 & TRIM(obsdata%cname(jv))//'_QC' , & 303 & TRIM(obsdata%cname(jv))//'_QC_FLAGS',& 304 & jv = 1, obsdata%nvar ), & 305 & ( TRIM(obsdata%cextname(ja)),& 306 & ja = 1, obsdata%next ) 307 DO kj=1,obsdata%nlev 308 IF (kqc>=2) THEN 309 lskip=.TRUE. 310 IF (obsdata%idqc(kj,iindex)>1) lskip=.FALSE. 311 DO jv = 1, obsdata%nvar 312 IF (obsdata%ivlqc(kj,iindex,jv)>1) lskip=.FALSE. 313 ENDDO 314 IF (lskip) CYCLE 315 ENDIF 316 IF (obsdata%pdep(kj,iindex)<99999.0) THEN 317 WRITE (*,FMT=cdfmt2) & 318 & obsdata%pdep(kj,iindex), & 319 & obsdata%idqc(kj,iindex), & 320 & ( obsdata%idqcf(ja,kj,iindex), ja = 1, obsdata%nqcf ), & 321 & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 322 & ( obsdata%ivlqcf(ja,kj,iindex,jv) , ja=1, obsdata%nqcf ), & 323 & jv = 1, obsdata%nvar ), & 324 & ( obsdata%pext(kj,iindex,ja), ja=1, obsdata%next ) 325 ENDIF 326 ENDDO 327 WRITE(*,*) 328 329 END SUBROUTINE print_obs_qc 508 WRITE (*,FMT=cdfmt2) & 509 & obsdata%pdep(kj,iindex), & 510 & obsdata%idqc(kj,iindex), & 511 & ( obsdata%idqcf(ja,kj,iindex), ja = 1, obsdata%nqcf ), & 512 & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 513 & ( obsdata%ivlqcf(ja,kj,iindex,jv) , ja=1, obsdata%nqcf ), & 514 & jv = kvar1, kvar2 ), & 515 & ( obsdata%pext(kj,iindex,ja), ja=1, obsdata%next ) 516 ENDIF 517 ENDDO 518 WRITE(*,*) 519 520 END SUBROUTINE print_obs_qc 521 522 SUBROUTINE print_time(ptim) 523 IMPLICIT NONE 524 REAL(fbdp) :: ptim 525 INTEGER:: iyr,imon,iday,ihou,imin,isec 526 WRITE(*,*)'Julian date = ',ptim 527 CALL jul2greg(isec,imin,ihou,iday,imon,iyr,ptim) 528 WRITE(*,'(1X,A,I4,2I2.2)') & 529 & 'Gregorian date = ',iyr,imon,iday 530 WRITE(*,'(1X,A,I2.2,A1,I2.2,A1,I2.2)') & 531 & 'Time = ',ihou,':',imin,':',isec 532 END SUBROUTINE print_time 533 534 END PROGRAM fbprint 535 330 536 -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbsel.F90
r2945 r3000 1 1 PROGRAM fbsel 2 !!--------------------------------------------------------------------- 3 !! 4 !! ** PROGRAM fbsel ** 5 !! 6 !! ** Purpose : Select or subsample observations 7 !! 8 !! ** Method : Use of utilities from obs_fbm. 9 !! 10 !! ** Action : 11 !! 12 !! Usage: 13 !! fbsel <input filename> <output filename> 14 !! 15 !! History : 16 !! ! 2010 (K. Mogensen) Initial version 17 !!---------------------------------------------------------------------- 2 18 USE obs_fbm 3 19 USE date_utils … … 11 27 INTEGER,PARAMETER :: maxdates=20 12 28 INTEGER :: nqc,ntyp,ndates,ninidate(maxdates),nenddate(maxdates) 13 LOGICAL :: lsplitqc,lsplittyp 14 INTEGER :: iqc,ityp,idate 29 LOGICAL :: lsplitqc,lsplittyp,lsplitstat 30 INTEGER :: iqc,ityp,idate,istat 15 31 REAL :: maxlat,minlat,maxlon,minlon 32 CHARACTER(len=ilenwmo) :: cdwmo,cdwmobeg,cdwmoend 33 CHARACTER(len=ilenwmo), DIMENSION(:), POINTER :: clstatids 34 INTEGER :: nstat 16 35 NAMELIST/namsel/nqc,ntyp,ndates,ninidate,nenddate,lsplitqc,lsplittyp, & 17 & maxlat,minlat,maxlon,minlon 36 & lsplitstat,maxlat,minlat,maxlon,minlon,cdwmo,& 37 & cdwmobeg,cdwmoend 18 38 19 39 IF (iargc()/=2) THEN … … 34 54 lsplitqc=.FALSE. 35 55 lsplittyp=.FALSE. 56 lsplitstat=.FALSE. 57 cdwmo=REPEAT('X',ilenwmo) 58 cdwmobeg=cdwmo 59 cdwmoend=cdwmo 36 60 maxlat=1e+38 37 61 minlat=-1e+38 … … 41 65 READ(10,namsel) 42 66 CLOSE(10) 67 IF (cdwmobeg==REPEAT('X',ilenwmo)) cdwmobeg=cdwmo 68 IF (cdwmoend==REPEAT('X',ilenwmo)) cdwmoend=cdwmo 43 69 WRITE(*,namsel) 44 70 … … 59 85 CALL fb_sel(fbdatain,fbdataout,iqc,ntyp, & 60 86 & ninidate(idate),nenddate(idate), & 61 & maxlat,minlat,maxlon,minlon )87 & maxlat,minlat,maxlon,minlon,cdwmobeg,cdwmoend) 62 88 WRITE(filenametmp,'(A,I2.2,A,A)')'qc_',iqc,'_',TRIM(cnameout) 63 89 IF (fbdataout%nobs>0) THEN … … 73 99 CALL fb_sel(fbdatain,fbdataout,nqc,ityp, & 74 100 & ninidate(idate),nenddate(idate), & 75 & maxlat,minlat,maxlon,minlon )101 & maxlat,minlat,maxlon,minlon,cdwmobeg,cdwmoend) 76 102 WRITE(filenametmp,'(A,I4.4,A,A)')'typ_',ityp,'_',TRIM(cnameout) 77 103 IF (fbdataout%nobs>0) THEN … … 83 109 CALL dealloc_obfbdata(fbdataout) 84 110 ENDDO 111 ELSEIF (lsplitstat) THEN 112 CALL fb_sel_uniqueids(fbdatain,clstatids,nstat) 113 DO istat=1,nstat 114 CALL fb_sel(fbdatain,fbdataout,nqc,ntyp, & 115 & ninidate(idate),nenddate(idate), & 116 & maxlat,minlat,maxlon,minlon,clstatids(istat),clstatids(istat)) 117 WRITE(filenametmp,'(4A)')'statid_', & 118 & TRIM(clstatids(istat)),'_',TRIM(cnameout) 119 IF (fbdataout%nobs>0) THEN 120 WRITE(*,*)'Station = ',clstatids(istat) 121 WRITE(*,*)'Number of observations selected = ',fbdataout%nobs 122 WRITE(*,*)'Writing file : ',TRIM(filenametmp) 123 CALL write_obfbdata(TRIM(filenametmp),fbdataout) 124 ENDIF 125 CALL dealloc_obfbdata(fbdataout) 126 ENDDO 85 127 ELSE 86 128 CALL fb_sel(fbdatain,fbdataout,nqc,ntyp, & 87 129 & ninidate(idate),nenddate(idate), & 88 & maxlat,minlat,maxlon,minlon )130 & maxlat,minlat,maxlon,minlon,cdwmobeg,cdwmoend) 89 131 WRITE(*,*)'Number of observations selected = ',fbdataout%nobs 90 132 WRITE(*,*)'Writing file : ',TRIM(cnameout) … … 97 139 98 140 SUBROUTINE fb_sel(fbdatain,fbdataout,nqc,ntyp,ninidate,nenddate,& 99 & maxlat,minlat,maxlon,minlon )141 & maxlat,minlat,maxlon,minlon,cdwmobeg,cdwmoend) 100 142 TYPE(obfbdata) :: fbdatain,fbdataout 101 143 INTEGER :: nqc,ntyp,ninidate,nenddate 102 144 REAL :: maxlat,minlat,maxlon,minlon 145 CHARACTER(len=ilenwmo) :: cdwmobeg,cdwmoend 103 146 INTEGER :: jobs 104 147 INTEGER :: iqc,ityp … … 106 149 INTEGER :: iyea,imon,iday 107 150 REAL(KIND=dp) :: zjini,zjend 108 151 LOGICAL :: lcheckwmo 152 153 lcheckwmo=(cdwmobeg/=REPEAT('X',ilenwmo)).OR.& 154 & (cdwmoend/=REPEAT('X',ilenwmo)) 109 155 iyea=ninidate/10000 110 156 imon=ninidate/100-iyea*100 … … 131 177 llvalid(jobs)=(fbdatain%ptim(jobs)<=zjend).AND.llvalid(jobs) 132 178 ENDIF 133 llvalid(jobs)=(fbdatain%pphi(jobs)<=maxlat).AND. & 134 & (fbdatain%pphi(jobs)>=minlat).AND. & 135 & (fbdatain%plam(jobs)<=maxlon).AND. & 136 & (fbdatain%plam(jobs)>=minlon).AND.llvalid(jobs) 179 llvalid(jobs)=(fbdatain%pphi(jobs)<=maxlat).AND. & 180 & (fbdatain%pphi(jobs)>=minlat).AND. & 181 & (((fbdatain%plam(jobs)<=maxlon).AND. & 182 & (fbdatain%plam(jobs)>=minlon)).OR. & 183 & ((fbdatain%plam(jobs)+360<=maxlon).AND. & 184 & (fbdatain%plam(jobs)+360>=minlon)).OR. & 185 & ((fbdatain%plam(jobs)-360<=maxlon).AND. & 186 & (fbdatain%plam(jobs)-360>=minlon))).AND.llvalid(jobs) 187 IF (lcheckwmo) THEN 188 llvalid(jobs)=LGE(TRIM(fbdatain%cdwmo(jobs)),TRIM(cdwmobeg)) & 189 & .AND. LLE(TRIM(fbdatain%cdwmo(jobs)),TRIM(cdwmoend)) & 190 & .AND. llvalid(jobs) 191 ENDIF 137 192 ! Add more checks here... 138 193 ENDDO … … 142 197 END SUBROUTINE fb_sel 143 198 199 SUBROUTINE fb_sel_uniqueids(fbdatain,clstatids,nstat) 200 TYPE(obfbdata) :: fbdatain 201 CHARACTER(len=ilenwmo), DIMENSION(:), POINTER :: clstatids 202 INTEGER :: nstat 203 INTEGER :: jobs,kobs 204 LOGICAL, DIMENSION(fbdatain%nobs) :: lunique 205 206 lunique(:)=.TRUE. 207 DO jobs=1,fbdatain%nobs 208 IF (.NOT.lunique(jobs)) CYCLE 209 DO kobs=jobs+1,fbdatain%nobs 210 IF (.NOT.lunique(kobs)) CYCLE 211 IF (fbdatain%cdwmo(jobs)==fbdatain%cdwmo(kobs)) THEN 212 lunique(kobs)=.FALSE. 213 ENDIF 214 ENDDO 215 ENDDO 216 nstat=COUNT(lunique) 217 ALLOCATE(clstatids(nstat)) 218 kobs=0 219 DO jobs=1,fbdatain%nobs 220 IF (lunique(jobs)) THEN 221 kobs=kobs+1 222 clstatids(kobs)=fbdatain%cdwmo(jobs) 223 ENDIF 224 ENDDO 225 WRITE(*,*)'Unique station ids' 226 DO jobs=1,nstat 227 WRITE(*,'(I5,1X,A)')jobs,clstatids(jobs) 228 ENDDO 229 230 END SUBROUTINE fb_sel_uniqueids 231 144 232 SUBROUTINE check_prof(fbdata,iobs,iqc) 145 233 -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbstat.F90
r2945 r3000 1 1 PROGRAM fbstat 2 !!--------------------------------------------------------------------- 3 !! 4 !! ** PROGRAM fbstat ** 5 !! 6 !! ** Purpose : Output feedback file summary info/statistics 7 !! into a number of .dat files for different areas 8 !! 9 !! ** Method : Use of utilities from obs_fbm. 10 !! 11 !! ** Action : 12 !! 13 !! Usage: 14 !! fbstat [-nmlev] <filenames> 15 !! Optional: 16 !! namelist = namfbstat.in 17 !! 18 !! History : 19 !! ! 2010 (K. Mogensen) Initial version 20 !!---------------------------------------------------------------------- 2 21 USE obs_fbm 3 22 USE fbaccdata 4 23 USE coords 5 24 USE omonainfo 25 USE fbstatncio 26 USE proftools 6 27 IMPLICIT NONE 7 28 TYPE(obfbdata) :: fbdata 8 CHARACTER(len=256) :: filename 9 INTEGER :: jfile,jbox,jlev,jfirst,jvar,jadd,ji 29 CHARACTER(len=256) :: filename,outfilename 30 INTEGER :: jfile,jbox,jlev,jfirst,jvar,jadd,ji,ja,jt,jboxl 10 31 #ifndef NOIARGCPROTO 11 32 INTEGER,EXTERNAL :: iargc … … 13 34 REAL,DIMENSION(:),ALLOCATABLE :: zlev 14 35 INTEGER :: nmlev, nfiles 15 LOGICAL :: lexists,lomona,ltext 36 LOGICAL :: lexists,lomona,ltext,lnetcdf,lzinp 16 37 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zdat3d 17 38 REAL, ALLOCATABLE, DIMENSION(:,:) :: zdat2d 18 39 INTEGER,DIMENSION(1) :: itime 19 40 INTEGER :: inidate,icurdate,loopno,ityp,iloopno 20 INTEGER :: nvar,nadd 41 INTEGER :: nvar,nadd,noberr,nbgerr 21 42 CHARACTER(len=4) :: expver 22 CHARACTER(len= 7) :: cltyp43 CHARACTER(len=20) :: cltyp 23 44 CHARACTER(len=128) :: cdfmthead,cdfmtbody 24 45 LOGICAL :: lnear,linner,linnerp,linnerini,lpassive,lhistogram,lfound 25 INTEGER :: nqc 26 CHARACTER(len=ilenname), DIMENSION(:), ALLOCATABLE :: cname,caddname 27 CHARACTER(len=20) :: carea 28 INTEGER :: jstabox, jendbox 29 NAMELIST/namfbstat/ltext,lomona,nmlev,inidate,icurdate,loopno,& 30 & expver,lnear,linner,lpassive,lhistogram, & 31 & zhistmax,zhistmin,zhiststep,zcheck,carea 46 LOGICAL :: lxyplot,lrmmean 47 INTEGER :: nqc,nqco 48 REAL :: rlspc,rlmax 49 CHARACTER(len=ilenname), DIMENSION(:), ALLOCATABLE :: cname,caddname,& 50 & cobename,cbgename 51 INTEGER, PARAMETER :: nmaxareas = 20 52 CHARACTER(len=20), DIMENSION(nmaxareas) :: carea 53 LOGICAL, DIMENSION(:), ALLOCATABLE :: lskipbox 54 INTEGER, parameter :: maxtyp = 10 55 CHARACTER(len=ilentyp), DIMENSION(maxtyp) :: ctyp 56 INTEGER :: ntyp,nboxuserl,ipdcst 57 REAL :: mindcst 58 NAMELIST/namfbstat/ltext,lomona,lnetcdf,nmlev,inidate,icurdate,loopno,& 59 & expver,lnear,linner,lpassive,lhistogram,& 60 & zhistmax,zhistmin,zhiststep,zcheck,carea,nmlev,& 61 & nqc,nqco, & 62 & rlspc,rlmax,ntyp,ctyp,& 63 & lxyplot,zxymin,zxymax,zxystep,lzinp,lrmmean,mindcst 32 64 33 65 ltext=.TRUE. 66 lnetcdf=.TRUE. 34 67 lomona=.FALSE. 35 68 nmlev=31 36 69 inidate=19010101 37 70 icurdate=19010116 38 loopno= -171 loopno=0 39 72 expver='test' 40 73 lnear=.TRUE. … … 45 78 zhistmax(:)=10.0 46 79 zhiststep(:)=0.1 47 zcheck(:)=10 .080 zcheck(:)=1000.0 48 81 nqc=2 49 carea='all' 82 nqco=2 83 carea(:)='all' 84 rlmax=5000.0 85 rlspc=-0.1 86 ntyp=1 87 ctyp(:)='all' 88 lxyplot=.FALSE. 89 zxymin(:)=-5.0 90 zxymax(:)=45.0 91 zxystep(:)=0.5 92 lzinp=.FALSE. 93 lrmmean=.FALSE. 94 mindcst=-1.0 95 50 96 INQUIRE(file='namfbstat.in',exist=lexists) 51 97 IF (lexists) THEN … … 55 101 WRITE(*,namfbstat) 56 102 ENDIF 103 mindcst=mindcst*1000.0 !From km to m. 57 104 IF (iargc()==0) THEN 58 105 WRITE(*,*)'Usage:' … … 85 132 END DO 86 133 nfiles=iargc() 87 88 IF (carea/='all') THEN 134 135 CALL coord_user_init('o') 136 137 ALLOCATE(lskipbox(nboxuser)) 138 lskipbox(:)=.FALSE. 139 140 IF (carea(1)/='all') THEN 89 141 IF (lomona) THEN 90 WRITE(*,*)'For omona files carea has to be all'142 WRITE(*,*)'For omona files carea(1) has to be all' 91 143 CALL abort 92 144 ENDIF 93 lfound=.FALSE. 94 DO jbox=1,nbox 95 IF (TRIM(carea)==TRIM(cl_boxes(jbox))) THEN 96 jstabox=jbox 97 jendbox=jbox 98 lfound=.TRUE. 145 lskipbox(:)=.TRUE. 146 DO ji=1,nmaxareas 147 IF (carea(ji)/='all') THEN 148 lfound=.FALSE. 149 DO jbox=1,nboxuser 150 IF (TRIM(carea(ji))==TRIM(cl_boxes_user(jbox))) THEN 151 lskipbox(jbox)=.FALSE. 152 lfound=.TRUE. 153 ENDIF 154 ENDDO 155 IF (.NOT.lfound) THEN 156 WRITE(*,*)'Area ',TRIM(carea(ji)),' not found' 157 CALL abort 158 ENDIF 99 159 ENDIF 100 160 ENDDO 101 IF (.NOT.lfound) THEN 102 WRITE(*,*)'Area not found' 161 nboxuserl=0 162 DO ji=1,nboxuser 163 WRITE(*,*)'Area ',TRIM(cl_boxes_user(ji)),' is set to ',lskipbox(ji) 164 IF (.NOT.lskipbox(ji)) nboxuserl=nboxuserl+1 165 ENDDO 166 WRITE(*,*)'Total areas for statistics = ',nboxuserl 167 IF (lomona.AND.(nboxuserl/=nboxuser)) THEN 168 WRITE(*,*)'Omona files only possible if all areas' 103 169 CALL abort 104 170 ENDIF 105 171 ELSE 106 jstabox=1 107 jendbox=nbox 172 nboxuserl=nboxuser 108 173 ENDIF 109 PRINT *,'jstabox,jendbox=',jstabox,jendbox 110 111 IF (.NOT.lnear) nmlev=nmlev-1 112 113 ALLOCATE(& 114 & zlev(nmlev) & 115 & ) 116 IF(lnear) THEN 117 CALL getlevs(nmlev,zlev) 174 175 IF (rlspc>0.0) THEN 176 lnear=.TRUE. 177 nmlev=rlmax/rlspc+1 178 ALLOCATE(zlev(nmlev)) 179 DO ji=1,nmlev 180 zlev(ji)=(ji-1)*rlspc 181 ENDDO 118 182 ELSE 119 CALL getlevsmean(nmlev,zlev) 183 IF (.NOT.lnear) nmlev=nmlev-1 184 ALLOCATE(& 185 & zlev(nmlev) & 186 & ) 187 IF(lnear) THEN 188 CALL getlevs(nmlev,zlev) 189 ELSE 190 CALL getlevsmean(nmlev,zlev) 191 ENDIF 120 192 ENDIF 121 193 … … 123 195 CALL getarg(jfile,filename) 124 196 WRITE(*,*)'Handling file : ',TRIM(filename) 125 CALL read_obfbdata(TRIM(filename),fbdata) 197 CALL flush(6) 198 IF (lzinp) THEN 199 #if defined NOSYSTEM 200 WRITE(*,*)'Compressed files need the system subroutine call' 201 CALL abort 202 #else 203 CALL system('cp '//TRIM(filename)//' fbstat_tmp.nc.gz') 204 CALL system('gzip -df fbstat_tmp.nc.gz') 205 CALL read_obfbdata('fbstat_tmp.nc',fbdata) 206 CALL system('rm -f fbstat_tmp.nc') 207 #endif 208 ELSE 209 CALL read_obfbdata(TRIM(filename),fbdata) 210 ENDIF 211 CALL sealsfromargo( fbdata ) 126 212 IF (jfile==jfirst) THEN 127 213 nvar=fbdata%nvar 128 nadd=fbdata%nadd 214 nadd=0 215 DO ja= 1, fbdata%nadd 216 IF (fbdata%caddname(ja)(1:2)=='Hx') nadd=nadd+1 217 ENDDO 218 noberr=0 219 DO ja= 1, fbdata%nadd 220 IF (fbdata%caddname(ja)(1:3)=='OBE') noberr=noberr+1 221 ENDDO 222 nbgerr=0 223 DO ja= 1, fbdata%nadd 224 IF (fbdata%caddname(ja)(1:3)=='BGE') nbgerr=nbgerr+1 225 ENDDO 129 226 IF (lhistogram) THEN 130 227 IF (nvar>maxvars) THEN … … 139 236 & hist(jvar)%npoints 140 237 WRITE(*,*)'Size of histogram array (elements) = ',& 141 & hist(jvar)%npoints*nmlev*nbox *nadd238 & hist(jvar)%npoints*nmlev*nboxuserl*nadd 142 239 ALLOCATE(& 143 & hist(jvar)%nhist(hist(jvar)%npoints,nmlev,nbox ,nadd) &240 & hist(jvar)%nhist(hist(jvar)%npoints,nmlev,nboxuserl,nadd,ntyp) & 144 241 & ) 145 hist(jvar)%nhist(:,:,:,:)=0 242 hist(jvar)%nhist(:,:,:,:,:)=0 243 ENDDO 244 ENDIF 245 ipdcst=0 246 IF (mindcst>0) THEN 247 DO ja= 1, fbdata%next 248 IF (TRIM(fbdata%cextname(ja))=='DCST') THEN 249 ipdcst=ja 250 EXIT 251 ENDIF 252 ENDDO 253 IF (ipdcst==0) THEN 254 WRITE(*,*)'Distance to coast not found in file, but mindcst>0' 255 WRITE(*,*)'Extra variables:' 256 DO ja= 1, fbdata%next 257 WRITE(*,*)ja,TRIM(fbdata%cextname(ja)) 258 ENDDO 259 CALL abort 260 ENDIF 261 ENDIF 262 IF (lxyplot) THEN 263 IF (nvar>maxvars) THEN 264 WRITE(*,*)'fbstat.F90: Increase maxvars to ',nvar 265 WRITE(*,*)'if you want xyplots' 266 CALL abort 267 ENDIF 268 DO jvar = 1, nvar 269 xy(jvar)%npoints=(zxymax(jvar)-zxymin(jvar))& 270 & /zxystep(jvar)+1 271 WRITE(*,*)'Number of points in x and y for xyplots = ',& 272 & xy(jvar)%npoints 273 WRITE(*,*)'Size of xyplot array (elements) = ',& 274 & xy(jvar)%npoints*xy(jvar)%npoints*nmlev*nboxuserl*nadd 275 ALLOCATE(& 276 & xy(jvar)%nxy(xy(jvar)%npoints,xy(jvar)%npoints,& 277 & nmlev,nboxuserl,nadd,ntyp) & 278 & ) 279 xy(jvar)%nxy(:,:,:,:,:,:)=0 146 280 ENDDO 147 281 ENDIF 148 282 ALLOCATE(& 149 & inum(nmlev,nbox,nadd,nvar), & 150 & zmean(nmlev,nbox,nadd,nvar), & 151 & zrms(nmlev,nbox,nadd,nvar), & 152 & zsdev(nmlev,nbox,nadd,nvar), & 153 & cname(nvar), & 154 & caddname(nadd) & 283 & inum(nmlev,nboxuserl,nadd,nvar,ntyp), & 284 & inumov(nmlev,nboxuserl,noberr,nvar,ntyp), & 285 & inumbv(nmlev,nboxuserl,nbgerr,nvar,ntyp), & 286 & inuma(nmlev,nboxuserl,nvar,ntyp), & 287 & zbias(nmlev,nboxuserl,nadd,nvar,ntyp), & 288 & zrms(nmlev,nboxuserl,nadd,nvar,ntyp), & 289 & zsdev(nmlev,nboxuserl,nadd,nvar,ntyp), & 290 & zomean(nmlev,nboxuserl,nadd,nvar,ntyp),& 291 & zmmean(nmlev,nboxuserl,nadd,nvar,ntyp),& 292 & zoemea(nmlev,nboxuserl,noberr,nvar,ntyp),& 293 & zovmea(nmlev,nboxuserl,noberr,nvar,ntyp),& 294 & zbemea(nmlev,nboxuserl,nbgerr,nvar,ntyp),& 295 & zbvmea(nmlev,nboxuserl,nbgerr,nvar,ntyp),& 296 & zoamean(nmlev,nboxuserl,nvar,ntyp), & 297 & cname(nvar), & 298 & caddname(nadd), & 299 & cobename(noberr), & 300 & cbgename(nbgerr) & 155 301 & ) 156 302 DO jvar = 1, nvar 157 303 cname(jvar) = fbdata%cname(jvar) 158 304 END DO 159 DO jadd = 1, nadd 160 caddname(jadd) = fbdata%caddname(jadd) 305 jadd = 0 306 DO ja= 1, fbdata%nadd 307 IF (fbdata%caddname(ja)(1:2)=='Hx') THEN 308 jadd=jadd+1 309 caddname(jadd) = fbdata%caddname(ja) 310 ENDIF 161 311 END DO 162 inum(:,:,:,:)=0 163 zmean(:,:,:,:)=0.0 164 zrms(:,:,:,:)=0.0 165 zsdev(:,:,:,:)=0.0 312 jadd = 0 313 DO ja= 1, fbdata%nadd 314 IF (fbdata%caddname(ja)(1:3)=='OBE') THEN 315 jadd=jadd+1 316 cobename(jadd) = fbdata%caddname(ja) 317 ENDIF 318 END DO 319 jadd = 0 320 DO ja= 1, fbdata%nadd 321 IF (fbdata%caddname(ja)(1:3)=='BGE') THEN 322 jadd=jadd+1 323 cbgename(jadd) = fbdata%caddname(ja) 324 ENDIF 325 END DO 326 IF (nadd>0) THEN 327 inum(:,:,:,:,:)=0 328 zbias(:,:,:,:,:)=0.0 329 zrms(:,:,:,:,:)=0.0 330 zsdev(:,:,:,:,:)=0.0 331 zomean(:,:,:,:,:)=0.0 332 zmmean(:,:,:,:,:)=0.0 333 ENDIF 334 IF (noberr>0) THEN 335 inumov(:,:,:,:,:)=0 336 zoemea(:,:,:,:,:)=0 337 zovmea(:,:,:,:,:)=0 338 ENDIF 339 IF (nbgerr>0) THEN 340 inumbv(:,:,:,:,:)=0 341 zbemea(:,:,:,:,:)=0 342 zbvmea(:,:,:,:,:)=0 343 ENDIF 344 inuma(:,:,:,:)=0 345 zoamean(:,:,:,:)=0.0 166 346 ELSE 167 347 IF (fbdata%nvar/=nvar) THEN … … 170 350 CALL abort 171 351 ENDIF 172 IF (fbdata%nadd/=nadd) THEN 173 WRITE(*,*)'Different number of nadd ',fbdata%nadd,' in ',& 352 jadd = 0 353 DO ja= 1, fbdata%nadd 354 IF (fbdata%caddname(ja)(1:2)=='Hx') THEN 355 jadd=jadd+1 356 ENDIF 357 END DO 358 IF (jadd/=nadd) THEN 359 WRITE(*,*)'Different number of nadd ',jadd,' in ',& 174 360 & TRIM(filename) 175 361 CALL abort 176 362 ENDIF 177 ENDIF 178 CALL fb_stat(fbdata,jstabox,jendbox,nmlev,zlev,lnear,nqc,lhistogram) 363 jadd = 0 364 DO ja= 1, fbdata%nadd 365 IF (fbdata%caddname(ja)(1:3)=='OBE') THEN 366 jadd=jadd+1 367 ENDIF 368 END DO 369 IF (jadd/=noberr) THEN 370 WRITE(*,*)'Different number of noberr ',jadd,' in ',& 371 & TRIM(filename) 372 CALL abort 373 ENDIF 374 jadd = 0 375 DO ja= 1, fbdata%nadd 376 IF (fbdata%caddname(ja)(1:3)=='BGE') THEN 377 jadd=jadd+1 378 ENDIF 379 END DO 380 IF (jadd/=nbgerr) THEN 381 WRITE(*,*)'Different number of nbgerr ',jadd,' in ',& 382 & TRIM(filename) 383 CALL abort 384 ENDIF 385 IF (ipdcst>0) THEN 386 IF (ipdcst>fbdata%next) THEN 387 WRITE(*,*)'Distrance to coast in file not compatible with first file' 388 CALL abort 389 ENDIF 390 IF (TRIM(fbdata%cextname(ipdcst))/='DCST') THEN 391 WRITE(*,*)'Distrance to coast in file not compatible with first file' 392 CALL abort 393 ENDIF 394 ENDIF 395 ENDIF 396 IF (lrmmean) THEN 397 CALL fb_rmmean(fbdata) 398 ENDIF 399 CALL fb_stat(fbdata,lskipbox,nmlev,zlev,lnear,nqc,nqco,& 400 & lhistogram,lxyplot,ntyp,ctyp,ipdcst,mindcst) 179 401 CALL dealloc_obfbdata(fbdata) 180 402 ENDDO 181 403 182 DO jvar=1, nvar 183 DO jadd=1, nadd 184 DO jbox=jstabox, jendbox 185 DO jlev = 1, nmlev 186 IF ( inum(jlev,jbox,jadd,jvar) > 0 ) THEN 187 zmean(jlev,jbox,jadd,jvar) = & 188 & zmean(jlev,jbox,jadd,jvar)/inum(jlev,jbox,jadd,jvar) 189 zrms(jlev,jbox,jadd,jvar) = & 190 & SQRT(zrms(jlev,jbox,jadd,jvar)/inum(jlev,jbox,jadd,jvar)) 191 zsdev(jlev,jbox,jadd,jvar) = & 192 & SQRT(MAX(zrms(jlev,jbox,jadd,jvar)**2-zmean(jlev,jbox,jadd,jvar)**2,0.0)) 193 ELSE 194 zmean(jlev,jbox,jadd,jvar) = fbrmdi 195 zrms(jlev,jbox,jadd,jvar) = fbrmdi 196 zsdev(jlev,jbox,jadd,jvar) = fbrmdi 197 ENDIF 404 DO jt=1,ntyp 405 DO jvar=1,nvar 406 DO jadd=1,nadd 407 jboxl=0 408 DO jbox=1,nboxuser 409 IF (lskipbox(jbox)) CYCLE 410 jboxl=jboxl+1 411 DO jlev = 1, nmlev 412 IF ( inum(jlev,jboxl,jadd,jvar,jt) > 0 ) THEN 413 zbias(jlev,jboxl,jadd,jvar,jt) = & 414 & zbias(jlev,jboxl,jadd,jvar,jt)/inum(jlev,jboxl,jadd,jvar,jt) 415 zrms(jlev,jboxl,jadd,jvar,jt) = & 416 & SQRT(zrms(jlev,jboxl,jadd,jvar,jt)/inum(jlev,jboxl,jadd,jvar,jt)) 417 zsdev(jlev,jboxl,jadd,jvar,jt) = & 418 & SQRT(MAX(zrms(jlev,jboxl,jadd,jvar,jt)**2-zbias(jlev,jboxl,jadd,jvar,jt)**2,0.0)) 419 zomean(jlev,jboxl,jadd,jvar,jt) = & 420 & zomean(jlev,jboxl,jadd,jvar,jt)/inum(jlev,jboxl,jadd,jvar,jt) 421 zmmean(jlev,jboxl,jadd,jvar,jt) = & 422 & zmmean(jlev,jboxl,jadd,jvar,jt)/inum(jlev,jboxl,jadd,jvar,jt) 423 ELSE 424 zbias(jlev,jboxl,jadd,jvar,jt) = fbrmdi 425 zrms(jlev,jboxl,jadd,jvar,jt) = fbrmdi 426 zsdev(jlev,jboxl,jadd,jvar,jt) = fbrmdi 427 zomean(jlev,jboxl,jadd,jvar,jt) = fbrmdi 428 zmmean(jlev,jboxl,jadd,jvar,jt) = fbrmdi 429 ENDIF 430 ENDDO 431 ENDDO 432 ENDDO 433 DO jadd=1,noberr 434 jboxl=0 435 DO jbox=1,nboxuser 436 IF (lskipbox(jbox)) CYCLE 437 jboxl=jboxl+1 438 DO jlev = 1, nmlev 439 IF ( inumov(jlev,jboxl,jadd,jvar,jt) > 0 ) THEN 440 zoemea(jlev,jboxl,jadd,jvar,jt) = & 441 & zoemea(jlev,jboxl,jadd,jvar,jt)/inumov(jlev,jboxl,jadd,jvar,jt) 442 zovmea(jlev,jboxl,jadd,jvar,jt) = & 443 & zovmea(jlev,jboxl,jadd,jvar,jt)/inumov(jlev,jboxl,jadd,jvar,jt) 444 ELSE 445 zoemea(jlev,jboxl,jadd,jvar,jt) = fbrmdi 446 zovmea(jlev,jboxl,jadd,jvar,jt) = fbrmdi 447 ENDIF 448 ENDDO 449 ENDDO 450 ENDDO 451 DO jadd=1,nbgerr 452 jboxl=0 453 DO jbox=1,nboxuser 454 IF (lskipbox(jbox)) CYCLE 455 jboxl=jboxl+1 456 DO jlev = 1, nmlev 457 IF ( inumbv(jlev,jboxl,jadd,jvar,jt) > 0 ) THEN 458 zbemea(jlev,jboxl,jadd,jvar,jt) = & 459 & zbemea(jlev,jboxl,jadd,jvar,jt)/inumbv(jlev,jboxl,jadd,jvar,jt) 460 zbvmea(jlev,jboxl,jadd,jvar,jt) = & 461 & zbvmea(jlev,jboxl,jadd,jvar,jt)/inumbv(jlev,jboxl,jadd,jvar,jt) 462 ELSE 463 zbemea(jlev,jboxl,jadd,jvar,jt) = fbrmdi 464 zbvmea(jlev,jboxl,jadd,jvar,jt) = fbrmdi 465 ENDIF 466 ENDDO 198 467 ENDDO 199 468 ENDDO 200 469 ENDDO 201 470 ENDDO 471 DO jt=1,ntyp 472 DO jvar=1,nvar 473 jboxl=0 474 DO jbox=1,nboxuser 475 IF (lskipbox(jbox)) CYCLE 476 jboxl=jboxl+1 477 DO jlev = 1, nmlev 478 IF ( inuma(jlev,jboxl,jvar,jt) > 0 ) THEN 479 zoamean(jlev,jboxl,jvar,jt) = & 480 & zoamean(jlev,jboxl,jvar,jt)/inuma(jlev,jboxl,jvar,jt) 481 ELSE 482 zoamean(jlev,jboxl,jvar,jt) = fbrmdi 483 ENDIF 484 ENDDO 485 ENDDO 486 ENDDO 487 ENDDO 202 488 203 489 IF (ltext) THEN 204 DO jvar=1, nvar 205 DO jadd=1, nadd 206 DO jbox=jstabox, jendbox 207 WRITE(filename,'(5A)')TRIM(cname(jvar)),& 208 & TRIM(caddname(jadd)),'_',& 209 & TRIM(cl_boxes(jbox)),'.dat' 490 491 DO jt=1,ntyp 492 DO jvar=1,nvar 493 DO jadd=1,nadd 494 jboxl=0 495 DO jbox=1,nboxuser 496 IF (lskipbox(jbox)) CYCLE 497 jboxl=jboxl+1 498 WRITE(filename,'(7A)')TRIM(cname(jvar)),& 499 & TRIM(caddname(jadd)),'_',& 500 & TRIM(cl_boxes_user(jbox)),'_',& 501 & TRIM(ADJUSTL(ctyp(jt))),'.dat' 502 OPEN(10,file=TRIM(filename)) 503 DO jlev = 1, nmlev 504 WRITE(10,'(F16.7,2I12,5F17.10)') zlev(jlev), & 505 & jlev, inum(jlev,jboxl,jadd,jvar,jt), & 506 & zbias(jlev,jboxl,jadd,jvar,jt), & 507 & zrms(jlev,jboxl,jadd,jvar,jt), & 508 & zsdev(jlev,jboxl,jadd,jvar,jt), & 509 & zomean(jlev,jboxl,jadd,jvar,jt), & 510 & zmmean(jlev,jboxl,jadd,jvar,jt) 511 ENDDO 512 CLOSE(10) 513 ENDDO 514 ENDDO 515 DO jadd=1,noberr 516 jboxl=0 517 DO jbox=1,nboxuser 518 IF (lskipbox(jbox)) CYCLE 519 jboxl=jboxl+1 520 WRITE(filename,'(7A)')TRIM(cname(jvar)),& 521 & TRIM(cobename(jadd)),'_',& 522 & TRIM(cl_boxes_user(jbox)),'_',& 523 & TRIM(ADJUSTL(ctyp(jt))),'.dat' 524 OPEN(10,file=TRIM(filename)) 525 DO jlev = 1, nmlev 526 WRITE(10,'(F16.7,2I12,5F17.10)') zlev(jlev), & 527 & jlev, inumov(jlev,jboxl,jadd,jvar,jt), & 528 & zoemea(jlev,jboxl,jadd,jvar,jt), & 529 & zovmea(jlev,jboxl,jadd,jvar,jt) 530 ENDDO 531 CLOSE(10) 532 ENDDO 533 ENDDO 534 DO jadd=1,nbgerr 535 jboxl=0 536 DO jbox=1,nboxuser 537 IF (lskipbox(jbox)) CYCLE 538 jboxl=jboxl+1 539 WRITE(filename,'(7A)')TRIM(cname(jvar)),& 540 & TRIM(cbgename(jadd)),'_',& 541 & TRIM(cl_boxes_user(jbox)),'_',& 542 & TRIM(ADJUSTL(ctyp(jt))),'.dat' 543 OPEN(10,file=TRIM(filename)) 544 DO jlev = 1, nmlev 545 WRITE(10,'(F16.7,2I12,5F17.10)') zlev(jlev), & 546 & jlev, inumbv(jlev,jboxl,jadd,jvar,jt), & 547 & zbemea(jlev,jboxl,jadd,jvar,jt), & 548 & zbvmea(jlev,jboxl,jadd,jvar,jt) 549 ENDDO 550 CLOSE(10) 551 ENDDO 552 ENDDO 553 ENDDO 554 ENDDO 555 556 DO jt=1,ntyp 557 DO jvar=1,nvar 558 jboxl=0 559 DO jbox=1,nboxuser 560 IF (lskipbox(jbox)) CYCLE 561 jboxl=jboxl+1 562 WRITE(filename,'(7A)')TRIM(cname(jvar)),'_',& 563 & TRIM(cl_boxes_user(jbox)),'_',& 564 & TRIM(ADJUSTL(ctyp(jt))),'.dat' 210 565 OPEN(10,file=TRIM(filename)) 211 566 DO jlev = 1, nmlev 212 WRITE(10,'(F16.7,2I12,3F17.10)') zlev(jlev), & 213 & jlev, inum(jlev,jbox,jadd,jvar), & 214 & zmean(jlev,jbox,jadd,jvar), & 215 & zrms(jlev,jbox,jadd,jvar), & 216 & zsdev(jlev,jbox,jadd,jvar) 567 WRITE(10,'(F16.7,2I12,F17.10)') zlev(jlev), & 568 & jlev, inuma(jlev,jboxl,jvar,jt), & 569 & zoamean(jlev,jboxl,jvar,jt) 217 570 ENDDO 218 571 CLOSE(10) … … 220 573 ENDDO 221 574 ENDDO 575 576 IF (lhistogram) THEN 577 DO jt=1,ntyp 578 DO jvar=1,nvar 579 DO jadd=1,nadd 580 jboxl=0 581 DO jbox=1,nboxuser 582 IF (lskipbox(jbox)) CYCLE 583 jboxl=jboxl+1 584 WRITE(filename,'(7A)')TRIM(cname(jvar)),& 585 & TRIM(caddname(jadd)),'_',& 586 & TRIM(cl_boxes_user(jbox)),'_',& 587 & TRIM(ADJUSTL(ctyp(jt))),& 588 & '_histogram.dat' 589 OPEN(10,file=TRIM(filename)) 590 WRITE(10,'(A10,1000F10.2)')'#',(zlev(jlev),jlev=1,nmlev) 591 DO ji=1,hist(jvar)%npoints 592 WRITE(10,'(F10.2,1000I10)') & 593 & zhistmin(jvar)+(ji-1)*zhiststep(jvar), & 594 & (hist(jvar)%nhist(ji,jlev,jboxl,jadd,jt),jlev=1,nmlev) 595 ENDDO 596 CLOSE(10) 597 ENDDO 598 ENDDO 599 ENDDO 600 ENDDO 601 ENDIF 602 222 603 ENDIF 223 604 224 IF (lhistogram) THEN 225 DO jvar=1, nvar 226 DO jadd=1, nadd 227 DO jbox=jstabox, jendbox 228 WRITE(filename,'(5A)')TRIM(cname(jvar)),& 229 & TRIM(caddname(jadd)),'_',& 230 & TRIM(cl_boxes(jbox)),'_histogram.dat' 231 OPEN(10,file=TRIM(filename)) 232 WRITE(10,'(A10,100F10.2)')'#',(zlev(jlev),jlev=1,nmlev) 233 DO ji=1,hist(jvar)%npoints 234 WRITE(10,'(F10.2,100I10)') & 235 & zhistmin(jvar)+(ji-1)*zhiststep(jvar), & 236 & (hist(jvar)%nhist(ji,jlev,jbox,jadd),jlev=1,nmlev) 237 ENDDO 238 CLOSE(10) 239 ENDDO 605 IF (lnetcdf) THEN 606 607 IF (nadd>0) THEN 608 DO jt=1,ntyp 609 WRITE(outfilename,'(3A)')'fbstat_',TRIM(ADJUSTL(ctyp(jt))),'.nc' 610 CALL fbstat_ncwrite(TRIM(outfilename),& 611 & nvar,cname,nadd,caddname,noberr,cobename,nbgerr,cbgename,& 612 & nboxuser,nboxuserl,20,cl_boxes_user,lskipbox,nmlev,zlev,& 613 & inum(:,:,:,:,jt),zbias(:,:,:,:,jt),zrms(:,:,:,:,jt), & 614 & zsdev(:,:,:,:,jt),zomean(:,:,:,:,jt),zmmean(:,:,:,:,jt),& 615 & inuma(:,:,:,jt),zoamean(:,:,:,jt), & 616 & inumov(:,:,:,:,jt),zoemea(:,:,:,:,jt),zovmea(:,:,:,:,jt), & 617 & inumbv(:,:,:,:,jt),zbemea(:,:,:,:,jt),zbvmea(:,:,:,:,jt) ) 618 IF (lhistogram) THEN 619 WRITE(outfilename,'(3A)')'fbstat_hist_',TRIM(ADJUSTL(ctyp(jt))),'.nc' 620 CALL fbstat_ncwrite_hist(TRIM(outfilename),& 621 & nvar,cname,nadd,caddname,& 622 & nboxuser,20,cl_boxes_user,lskipbox,nmlev,zlev,& 623 & hist,zhistmin,zhiststep,jt) 624 ENDIF 625 IF (lxyplot) THEN 626 WRITE(outfilename,'(3A)')'fbstat_xyplot_',TRIM(ADJUSTL(ctyp(jt))),'.nc' 627 CALL fbstat_ncwrite_xy(TRIM(outfilename),& 628 & nvar,cname,nadd,caddname,& 629 & nboxuser,20,cl_boxes_user,lskipbox,nmlev,zlev,& 630 & xy,zxymin,zxystep,jt) 631 ENDIF 240 632 ENDDO 241 END DO633 ENDIF 242 634 ENDIF 243 635 244 636 IF (lomona) THEN 245 637 638 IF (ntyp>1) THEN 639 WRITE(*,*)'Omona file only supported for the first type which is : ',TRIM(ctyp(1)) 640 ENDIF 246 641 IF (nmlev>1) THEN 247 ALLOCATE(zdat3d(nmlev,nbox ,1))642 ALLOCATE(zdat3d(nmlev,nboxuser,1)) 248 643 ELSE 249 ALLOCATE(zdat2d(nbox ,1))644 ALLOCATE(zdat2d(nboxuser,1)) 250 645 ENDIF 251 646 … … 257 652 iloopno = loopno 258 653 linnerini = linner 259 DO jvar = 1, nvar 260 linner = linnerini 261 loopno = iloopno 262 SELECT CASE (TRIM(cname(jvar))) 263 CASE('POTM') 264 cl_var = 'votemper' 265 CASE('PSAL') 266 cl_var='vosaline' 267 CASE('SLA') 268 cl_var='sossheig' 269 CASE('SST') 270 cl_var='sosstsst' 271 END SELECT 272 DO jadd = 1, nadd 273 linner = (caddname(jadd)(1:3)=='Hxa').OR.linner 654 i_fill=0 655 656 DO jt=1,ntyp 657 DO jvar = 1, nvar 658 linner = linnerini 659 loopno = iloopno 660 SELECT CASE (TRIM(cname(jvar))) 661 CASE('POTM') 662 cl_var = 'votemper' 663 CASE('PSAL') 664 cl_var='vosaline' 665 CASE('SLA') 666 cl_var='sossheig' 667 CASE('SST') 668 cl_var='sosstsst' 669 CASE('UVEL') 670 cl_var='vozocrtx' 671 CASE('VVEL') 672 cl_var='vomecrty' 673 END SELECT 674 DO jadd = 1, nadd 675 linner = (caddname(jadd)(1:3)=='Hxa').OR.linner 676 IF (lpassive) THEN 677 ityp=145 678 ELSE 679 IF (linner) THEN 680 linnerp=.TRUE. 681 ityp=144 682 IF (jadd>1) loopno=loopno+1 683 ELSE 684 ityp=142 685 IF (.NOT.linnerp) THEN 686 IF (jadd>1) loopno=loopno+1 687 ENDIF 688 ENDIF 689 ENDIF 690 WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 691 & TRIM(ADJUSTL(ctyp(jt))) 692 CALL obs_variable_att(cltyp) 693 IF (nmlev>1) THEN 694 zdat3d(:,:,1) = zbias(:,:,jadd,jvar,jt) 695 i_fill=0 696 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 697 & cl_boxes_user,REAL(fbrmdi),i_fill) 698 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 699 ELSE 700 zdat2d(:,1) = zbias(1,:,jadd,jvar,jt) 701 i_fill=0 702 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 703 & cl_boxes_user,REAL(fbrmdi),i_fill) 704 ENDIF 705 IF (lpassive) THEN 706 ityp=245 707 ELSE 708 IF (linner) THEN 709 ityp=244 710 ELSE 711 ityp=242 712 ENDIF 713 ENDIF 714 WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 715 & TRIM(ADJUSTL(ctyp(jt))) 716 CALL obs_variable_att(cltyp) 717 IF (nmlev>1) THEN 718 zdat3d(:,:,1) = zrms(:,:,jadd,jvar,jt) 719 i_fill=0 720 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 721 & cl_boxes_user,REAL(fbrmdi),i_fill) 722 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 723 ELSE 724 zdat2d(:,1) = zrms(1,:,jadd,jvar,jt) 725 i_fill=0 726 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 727 & cl_boxes_user,REAL(fbrmdi),i_fill) 728 ENDIF 729 IF (lpassive) THEN 730 ityp=345 731 ELSE 732 IF (linner) THEN 733 ityp=344 734 ELSE 735 ityp=342 736 ENDIF 737 ENDIF 738 WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 739 & TRIM(ADJUSTL(ctyp(jt))) 740 CALL obs_variable_att(cltyp) 741 IF (nmlev>1) THEN 742 zdat3d(:,:,1) = zsdev(:,:,jadd,jvar,jt) 743 i_fill=0 744 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 745 & cl_boxes_user,REAL(fbrmdi),i_fill) 746 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 747 ELSE 748 zdat2d(:,1) = zsdev(1,:,jadd,jvar,jt) 749 i_fill=0 750 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 751 & cl_boxes_user,REAL(fbrmdi),i_fill) 752 ENDIF 753 IF (lpassive) THEN 754 ityp=445 755 ELSE 756 IF (linner) THEN 757 ityp=444 758 ELSE 759 ityp=442 760 ENDIF 761 ENDIF 762 WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 763 & TRIM(ADJUSTL(ctyp(jt))) 764 CALL obs_variable_att(cltyp) 765 IF (nmlev>1) THEN 766 zdat3d(:,:,1) = inum(:,:,jadd,jvar,jt) 767 i_fill=0 768 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 769 & cl_boxes_user,REAL(fbrmdi),i_fill) 770 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 771 ELSE 772 zdat2d(:,1) = inum(1,:,jadd,jvar,jt) 773 i_fill=0 774 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 775 & cl_boxes_user,REAL(fbrmdi),i_fill) 776 ENDIF 777 IF (lpassive) THEN 778 ityp=545 779 ELSE 780 IF (linner) THEN 781 ityp=544 782 ELSE 783 ityp=542 784 ENDIF 785 ENDIF 786 WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 787 & TRIM(ADJUSTL(ctyp(jt))) 788 CALL obs_variable_att(cltyp) 789 IF (nmlev>1) THEN 790 zdat3d(:,:,1) = zomean(:,:,jadd,jvar,jt) 791 i_fill=0 792 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 793 & cl_boxes_user,REAL(fbrmdi),i_fill) 794 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 795 ELSE 796 zdat2d(:,1) = zomean(1,:,jadd,jvar,jt) 797 i_fill=0 798 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 799 & cl_boxes_user,REAL(fbrmdi),i_fill) 800 ENDIF 801 IF (lpassive) THEN 802 ityp=645 803 ELSE 804 IF (linner) THEN 805 ityp=644 806 ELSE 807 ityp=642 808 ENDIF 809 ENDIF 810 WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 811 & TRIM(ADJUSTL(ctyp(jt))) 812 CALL obs_variable_att(cltyp) 813 IF (nmlev>1) THEN 814 zdat3d(:,:,1) = zmmean(:,:,jadd,jvar,jt) 815 i_fill=0 816 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 817 & cl_boxes_user,REAL(fbrmdi),i_fill) 818 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 819 ELSE 820 zdat2d(:,1) = zmmean(1,:,jadd,jvar,jt) 821 i_fill=0 822 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 823 & cl_boxes_user,REAL(fbrmdi),i_fill) 824 ENDIF 825 linner=.FALSE. 826 ENDDO 827 loopno = iloopno 828 DO jadd = 1, noberr 829 linner = .TRUE. 830 ityp = 139 831 IF (jadd>1) loopno=loopno+1 832 WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 833 & TRIM(ADJUSTL(ctyp(jt))) 834 CALL obs_variable_att(cltyp) 835 IF (nmlev>1) THEN 836 zdat3d(:,:,1) = zoemea(:,:,jadd,jvar,jt) 837 i_fill=0 838 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 839 & cl_boxes_user,REAL(fbrmdi),i_fill) 840 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 841 ELSE 842 zdat2d(:,1) = zoemea(1,:,jadd,jvar,jt) 843 i_fill=0 844 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 845 & cl_boxes_user,REAL(fbrmdi),i_fill) 846 ENDIF 847 ityp = 239 848 WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 849 & TRIM(ADJUSTL(ctyp(jt))) 850 CALL obs_variable_att(cltyp) 851 IF (nmlev>1) THEN 852 zdat3d(:,:,1) = zovmea(:,:,jadd,jvar,jt) 853 i_fill=0 854 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 855 & cl_boxes_user,REAL(fbrmdi),i_fill) 856 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 857 ELSE 858 zdat2d(:,1) = zovmea(1,:,jadd,jvar,jt) 859 i_fill=0 860 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 861 & cl_boxes_user,REAL(fbrmdi),i_fill) 862 ENDIF 863 ENDDO 864 loopno = iloopno 865 DO jadd = 1, nbgerr 866 linner = .TRUE. 867 ityp = 141 868 IF (jadd>1) loopno=loopno+1 869 WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 870 & TRIM(ADJUSTL(ctyp(jt))) 871 CALL obs_variable_att(cltyp) 872 IF (nmlev>1) THEN 873 zdat3d(:,:,1) = zbemea(:,:,jadd,jvar,jt) 874 i_fill=0 875 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 876 & cl_boxes_user,REAL(fbrmdi),i_fill) 877 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 878 ELSE 879 zdat2d(:,1) = zbemea(1,:,jadd,jvar,jt) 880 i_fill=0 881 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 882 & cl_boxes_user,REAL(fbrmdi),i_fill) 883 ENDIF 884 ityp = 241 885 WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 886 & TRIM(ADJUSTL(ctyp(jt))) 887 CALL obs_variable_att(cltyp) 888 IF (nmlev>1) THEN 889 zdat3d(:,:,1) = zbvmea(:,:,jadd,jvar,jt) 890 i_fill=0 891 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 892 & cl_boxes_user,REAL(fbrmdi),i_fill) 893 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 894 ELSE 895 zdat2d(:,1) = zbvmea(1,:,jadd,jvar,jt) 896 i_fill=0 897 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 898 & cl_boxes_user,REAL(fbrmdi),i_fill) 899 ENDIF 900 ENDDO 274 901 IF (lpassive) THEN 275 ityp= 145902 ityp=745 276 903 ELSE 277 IF (linner) THEN 278 linnerp=.TRUE. 279 ityp=144 280 IF (jadd>1) loopno=loopno+1 281 ELSE 282 ityp=142 283 IF (.NOT.linnerp) THEN 284 IF (jadd>1) loopno=loopno+1 285 ENDIF 286 ENDIF 287 ENDIF 288 WRITE(cltyp,'(I3.3,A1,I2.2)')ityp,'_',loopno 904 ityp=742 905 ENDIF 906 WRITE(cltyp,'(I3.3,A1,A)')ityp,'_',& 907 & TRIM(ADJUSTL(ctyp(jt))) 289 908 CALL obs_variable_att(cltyp) 290 909 IF (nmlev>1) THEN 291 zdat3d(:,:,1) = zmean(:,:,jadd,jvar) 910 zdat3d(:,:,1) = inuma(:,:,jvar,jt) 911 i_fill=0 292 912 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 293 & cl_boxes ,REAL(fbrmdi))294 CALL write_dep_netcdf(cl_filename_out,cl_boxes ,zlev)913 & cl_boxes_user,REAL(fbrmdi),i_fill) 914 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 295 915 ELSE 296 zdat2d(:,1) = zmean(1,:,jadd,jvar) 916 zdat2d(:,1) = inuma(1,:,jvar,jt) 917 i_fill=0 297 918 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 298 & cl_boxes ,REAL(fbrmdi))919 & cl_boxes_user,REAL(fbrmdi),i_fill) 299 920 ENDIF 300 921 IF (lpassive) THEN 301 ityp= 245922 ityp=845 302 923 ELSE 303 IF (linner) THEN 304 ityp=244 305 ELSE 306 ityp=242 307 ENDIF 308 ENDIF 309 WRITE(cltyp,'(I3.3,A1,I2.2)')ityp,'_',loopno 924 ityp=842 925 ENDIF 926 WRITE(cltyp,'(I3.3,A1,A)')ityp,'_',& 927 & TRIM(ADJUSTL(ctyp(jt))) 310 928 CALL obs_variable_att(cltyp) 311 929 IF (nmlev>1) THEN 312 zdat3d(:,:,1) = zrms(:,:,jadd,jvar) 930 zdat3d(:,:,1) = zoamean(:,:,jvar,jt) 931 i_fill=0 313 932 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 314 & cl_boxes ,REAL(fbrmdi))315 CALL write_dep_netcdf(cl_filename_out,cl_boxes ,zlev)933 & cl_boxes_user,REAL(fbrmdi),i_fill) 934 CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 316 935 ELSE 317 zdat2d(:,1) = zrms(1,:,jadd,jvar) 936 zdat2d(:,1) = zoamean(1,:,jvar,jt) 937 i_fill=0 318 938 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 319 & cl_boxes,REAL(fbrmdi)) 320 ENDIF 321 IF (lpassive) THEN 322 ityp=345 323 ELSE 324 IF (linner) THEN 325 ityp=344 326 ELSE 327 ityp=342 328 ENDIF 329 ENDIF 330 WRITE(cltyp,'(I3.3,A1,I2.2)')ityp,'_',loopno 331 CALL obs_variable_att(cltyp) 332 IF (nmlev>1) THEN 333 zdat3d(:,:,1) = zsdev(:,:,jadd,jvar) 334 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 335 & cl_boxes,REAL(fbrmdi)) 336 CALL write_dep_netcdf(cl_filename_out,cl_boxes,zlev) 337 ELSE 338 zdat2d(:,1) = zsdev(1,:,jadd,jvar) 339 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 340 & cl_boxes,REAL(fbrmdi)) 341 ENDIF 342 IF (lpassive) THEN 343 ityp=445 344 ELSE 345 IF (linner) THEN 346 ityp=444 347 ELSE 348 ityp=442 349 ENDIF 350 ENDIF 351 WRITE(cltyp,'(I3.3,A1,I2.2)')ityp,'_',loopno 352 CALL obs_variable_att(cltyp) 353 IF (nmlev>1) THEN 354 zdat3d(:,:,1) = inum(:,:,jadd,jvar) 355 CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 356 & cl_boxes,REAL(fbrmdi)) 357 CALL write_dep_netcdf(cl_filename_out,cl_boxes,zlev) 358 ELSE 359 zdat2d(:,1) = inum(1,:,jadd,jvar) 360 CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 361 & cl_boxes,REAL(fbrmdi)) 362 ENDIF 363 linner=.FALSE. 939 & cl_boxes_user,REAL(fbrmdi),i_fill) 940 ENDIF 364 941 ENDDO 365 942 ENDDO … … 375 952 CONTAINS 376 953 377 SUBROUTINE fb_stat(fbdata,nstabox, nendbox, nmlev,zlev,lnear,kqc,lhist) 954 SUBROUTINE fb_stat(fbdata,lskipbox,nmlev,zlev,lnear,kqc,kqco,lhist,lxyplot,& 955 & ntyp,ctyp,ipdcst,mindcst) 378 956 USE fbaccdata 379 957 USE coords 380 958 TYPE(obfbdata) :: fbdata 381 INTEGER :: nstabox,nendbox959 LOGICAL, DIMENSION(nboxuser) :: lskipbox 382 960 INTEGER :: nmlev 383 961 REAL :: zlev(nmlev) 384 962 LOGICAL :: lnear 385 INTEGER :: kqc 386 LOGICAL :: lhist 387 INTEGER :: jlev, jobs, jvar, klev,jlev2,ih 388 REAL :: zarea(4),zlat,zlon,zdiff,zdiff2 963 INTEGER :: kqc,kqco 964 LOGICAL :: lhist,lxyplot 965 INTEGER :: ntyp 966 CHARACTER(len=ilentyp), DIMENSION(ntyp) :: ctyp 967 INTEGER :: ipdcst 968 REAL :: mindcst 969 INTEGER, DIMENSION(nboxuser) :: jlboxnum 970 INTEGER :: jlev, jobs, jvar, klev,jlev2,ih,ja,jadd,jbox,jt,ix,iy,jboxl 971 REAL :: zarea(4),zlat,zlon,zdiff,zdiff2,zvar 389 972 390 DO jbox = nstabox, nendbox 391 CALL coord_area(cl_boxes(jbox),zarea) 973 jboxl=0 974 jlboxnum=-1 975 DO jbox = 1, nboxuser 976 IF (lskipbox(jbox)) CYCLE 977 jboxl=jboxl+1 978 jlboxnum(jbox)=jboxl 979 ENDDO 980 981 !$omp parallel do default(shared) private(jlev,jobs,jvar,klev,jlev2,ih,ja,jadd,jbox,jt,ix,iy,jboxl,zarea,zlat,zlon,zdiff,zdiff2) 982 DO jbox = 1, nboxuser 983 IF (lskipbox(jbox)) CYCLE 984 jboxl=jlboxnum(jbox) 985 CALL coord_area_user(cl_boxes_user(jbox),zarea) 392 986 DO jobs = 1, fbdata%nobs 987 ! Reject observations with observation, position or time flag rejections 988 IF (fbdata%ioqc(jobs)>kqco) CYCLE 989 IF (fbdata%ipqc(jobs)>kqco) CYCLE 990 IF (fbdata%itqc(jobs)>kqco) CYCLE 393 991 zlat = fbdata%pphi(jobs) 394 992 zlon = fbdata%plam(jobs) … … 407 1005 408 1006 DO jlev = 1, fbdata%nlev 1007 IF (ipdcst>0) THEN 1008 IF (fbdata%pext(jlev,jobs,ipdcst)==fbrmdi) CYCLE 1009 IF (fbdata%pext(jlev,jobs,ipdcst)<mindcst) CYCLE 1010 ENDIF 409 1011 DO jvar = 1, fbdata%nvar 410 1012 IF (nmlev==1) THEN … … 425 1027 ENDIF 426 1028 IF ( klev > nmlev ) THEN 427 DO jadd = 1, fbdata%nvar 428 IF ( ABS(fbdata%padd(jlev,jobs,jadd,jvar))<9000 ) THEN 1029 DO ja = 1, fbdata%nadd 1030 IF ( fbdata%caddname(ja)(1:2) /= 'Hx' ) CYCLE 1031 IF ( ABS(fbdata%padd(jlev,jobs,ja,jvar))<9000 ) THEN 429 1032 WRITE(*,*)'Error in fb_stat' 430 1033 WRITE(*,*)'Increase nmlev to at least ',klev … … 435 1038 ENDIF 436 1039 ENDIF 1040 IF (( klev > 0 ).AND. & 1041 &(ABS(fbdata%pob(jlev,jobs,jvar)) < 9000 )) THEN 1042 DO jt=1,ntyp 1043 IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 1044 IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 1045 ENDIF 1046 inuma(klev,jboxl,jvar,jt) = inuma(klev,jboxl,jvar,jt) + 1 1047 zoamean(klev,jboxl,jvar,jt) = zoamean(klev,jboxl,jvar,jt) + & 1048 & fbdata%pob(jlev,jobs,jvar) 1049 ENDDO 1050 ENDIF 1051 IF ( fbdata%ivlqc(jlev,jobs,jvar) < 0 ) CYCLE 437 1052 IF ( fbdata%ivlqc(jlev,jobs,jvar) > kqc ) CYCLE 438 1053 IF (( klev > 0 ).AND. & 439 1054 &(ABS(fbdata%pob(jlev,jobs,jvar)) < 9000 )) THEN 440 DO jadd = 1, fbdata%nadd 441 IF ( ABS(fbdata%padd(jlev,jobs,jadd,jvar)) < 9000 ) THEN 442 zdiff = ( fbdata%padd(jlev,jobs,jadd,jvar) - & 1055 jadd = 0 1056 DO ja = 1, fbdata%nadd 1057 IF ( fbdata%caddname(ja)(1:2) /= 'Hx' ) CYCLE 1058 jadd = jadd + 1 1059 IF ( ABS(fbdata%padd(jlev,jobs,ja,jvar)) < 9000 ) THEN 1060 zdiff = ( fbdata%padd(jlev,jobs,ja,jvar) - & 443 1061 & fbdata%pob(jlev,jobs,jvar) ) 444 inum(klev,jbox,jadd,jvar) = inum(klev,jbox,jadd,jvar) + 1 445 zmean(klev,jbox,jadd,jvar) = zmean(klev,jbox,jadd,jvar) + & 446 & zdiff 447 zrms(klev,jbox,jadd,jvar) = zrms(klev,jbox,jadd,jvar) + & 448 & zdiff * zdiff 1062 DO jt=1,ntyp 1063 IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 1064 IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 1065 ENDIF 1066 inum(klev,jboxl,jadd,jvar,jt) = inum(klev,jboxl,jadd,jvar,jt) + 1 1067 zbias(klev,jboxl,jadd,jvar,jt) = zbias(klev,jboxl,jadd,jvar,jt) + & 1068 & zdiff 1069 zrms(klev,jboxl,jadd,jvar,jt) = zrms(klev,jboxl,jadd,jvar,jt) + & 1070 & zdiff * zdiff 1071 zomean(klev,jboxl,jadd,jvar,jt) = zomean(klev,jboxl,jadd,jvar,jt) + & 1072 & fbdata%pob(jlev,jobs,jvar) 1073 zmmean(klev,jboxl,jadd,jvar,jt) = zmmean(klev,jboxl,jadd,jvar,jt) + & 1074 & fbdata%padd(jlev,jobs,ja,jvar) 1075 ENDDO 449 1076 IF (ABS(zdiff)>zcheck(jvar)) THEN 450 1077 WRITE(*,*)'Departure outside check range ',& … … 459 1086 WRITE(*,*)'Depth = ',fbdata%pdep(jlev,jobs) 460 1087 WRITE(*,*)'Obs = ',fbdata%pob(jlev,jobs,jvar) 461 WRITE(*,*)'Var = ',fbdata%padd(jlev,jobs,ja dd,jvar)1088 WRITE(*,*)'Var = ',fbdata%padd(jlev,jobs,ja,jvar) 462 1089 WRITE(*,*)'QC = ',fbdata%ivlqc(jlev,jobs,jvar) 463 1090 WRITE(*,*)'QCflag= ',fbdata%ivlqcf(:,jlev,jobs,jvar) … … 466 1093 ih=NINT((zdiff-zhistmin(jvar))/zhiststep(jvar))+1 467 1094 IF ((ih>=1).AND.(ih<=hist(jvar)%npoints)) THEN 468 hist(jvar)%nhist(ih,klev,jbox,jadd) = & 469 hist(jvar)%nhist(ih,klev,jbox,jadd) +1 1095 DO jt=1,ntyp 1096 IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 1097 IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 1098 ENDIF 1099 hist(jvar)%nhist(ih,klev,jboxl,jadd,jt) = & 1100 hist(jvar)%nhist(ih,klev,jboxl,jadd,jt) +1 1101 ENDDO 470 1102 ELSE 471 1103 WRITE(*,*)'Histogram value outside range for ',& … … 476 1108 WRITE(*,*)'Step = ',zhiststep(jvar) 477 1109 WRITE(*,*)'Index = ',ih 478 WRITE(*,*)'Id = ',fbdata%cdwmo(jobs) 1110 WRITE(*,*)'Id = ',TRIM(fbdata%cdwmo(jobs)) 1111 WRITE(*,*)'Typ = ',TRIM(fbdata%cdtyp(jobs)) 1112 WRITE(*,*)'Lat = ',fbdata%pphi(jobs) 1113 WRITE(*,*)'Lon = ',fbdata%plam(jobs) 1114 WRITE(*,*)'Tim = ',fbdata%ptim(jobs) 1115 WRITE(*,*)'Depth = ',fbdata%pdep(jlev,jobs) 1116 WRITE(*,*)'Obs = ',fbdata%pob(jlev,jobs,jvar) 1117 WRITE(*,*)'Var = ',fbdata%padd(jlev,jobs,jadd,jvar) 1118 WRITE(*,*)'QC = ',fbdata%ivlqc(jlev,jobs,jvar) 1119 WRITE(*,*)'QCflag= ',fbdata%ivlqcf(:,jlev,jobs,jvar) 1120 ENDIF 1121 ENDIF 1122 IF (lxyplot) THEN 1123 ix=NINT((fbdata%pob(jlev,jobs,jvar)-zxymin(jvar))/& 1124 & zxystep(jvar))+1 1125 iy=NINT((fbdata%padd(jlev,jobs,ja,jvar)-zxymin(jvar))/& 1126 & zxystep(jvar))+1 1127 IF ((ix>=1).AND.(ix<=xy(jvar)%npoints).AND. & 1128 &(iy>=1).AND.(iy<=xy(jvar)%npoints)) THEN 1129 DO jt=1,ntyp 1130 IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 1131 IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 1132 ENDIF 1133 xy(jvar)%nxy(ix,iy,klev,jboxl,jadd,jt) = & 1134 xy(jvar)%nxy(ix,iy,klev,jboxl,jadd,jt) +1 1135 ENDDO 1136 ELSE 1137 WRITE(*,*)'xy plot values outside range for ',& 1138 & TRIM(fbdata%cname(jvar)),' entry ',& 1139 & fbdata%caddname(jadd) 1140 WRITE(*,*)'Obs = ',fbdata%pob(jlev,jobs,jvar) 1141 WRITE(*,*)'Model = ',fbdata%padd(jlev,jobs,ja,jvar) 1142 WRITE(*,*)'Range = ',zxymin(jvar),zxymax(jvar) 1143 WRITE(*,*)'Step = ',zxystep(jvar) 1144 WRITE(*,*)'Index = ',ih 1145 WRITE(*,*)'Id = ',TRIM(fbdata%cdwmo(jobs)) 1146 WRITE(*,*)'Typ = ',TRIM(fbdata%cdtyp(jobs)) 479 1147 WRITE(*,*)'Lat = ',fbdata%pphi(jobs) 480 1148 WRITE(*,*)'Lon = ',fbdata%plam(jobs) … … 489 1157 ENDIF 490 1158 ENDDO 1159 jadd = 0 1160 DO ja = 1, fbdata%nadd 1161 IF ( fbdata%caddname(ja)(1:3) /= 'OBE' ) CYCLE 1162 jadd = jadd + 1 1163 IF ( ABS(fbdata%padd(jlev,jobs,ja,jvar)) < 9000 ) THEN 1164 zvar = fbdata%padd(jlev,jobs,ja,jvar)*fbdata%padd(jlev,jobs,ja,jvar) 1165 DO jt=1,ntyp 1166 IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 1167 IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 1168 ENDIF 1169 inumov(klev,jboxl,jadd,jvar,jt) = inumov(klev,jboxl,jadd,jvar,jt) + 1 1170 zoemea(klev,jboxl,jadd,jvar,jt) = zoemea(klev,jboxl,jadd,jvar,jt) + & 1171 & fbdata%padd(jlev,jobs,ja,jvar) 1172 zovmea(klev,jboxl,jadd,jvar,jt) = zovmea(klev,jboxl,jadd,jvar,jt) + zvar 1173 ENDDO 1174 ENDIF 1175 ENDDO 1176 jadd = 0 1177 DO ja = 1, fbdata%nadd 1178 IF ( fbdata%caddname(ja)(1:3) /= 'BGE' ) CYCLE 1179 jadd = jadd + 1 1180 IF ( ABS(fbdata%padd(jlev,jobs,ja,jvar)) < 9000 ) THEN 1181 zvar = fbdata%padd(jlev,jobs,ja,jvar)*fbdata%padd(jlev,jobs,ja,jvar) 1182 DO jt=1,ntyp 1183 IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 1184 IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 1185 ENDIF 1186 inumbv(klev,jboxl,jadd,jvar,jt) = inumbv(klev,jboxl,jadd,jvar,jt) + 1 1187 zbemea(klev,jboxl,jadd,jvar,jt) = zbemea(klev,jboxl,jadd,jvar,jt) + & 1188 & fbdata%padd(jlev,jobs,ja,jvar) 1189 zbvmea(klev,jboxl,jadd,jvar,jt) = zbvmea(klev,jboxl,jadd,jvar,jt) + zvar 1190 ENDDO 1191 ENDIF 1192 ENDDO 491 1193 ENDIF 492 1194 ENDDO … … 495 1197 ENDDO 496 1198 ENDDO 1199 !$omp end parallel do 497 1200 498 1201 END SUBROUTINE fb_stat 1202 1203 SUBROUTINE fb_rmmean(fbdata) 1204 TYPE(obfbdata) :: fbdata 1205 INTEGER :: jadd,jmean 1206 1207 jmean=0 1208 DO jadd=1,fbdata%nadd 1209 IF (fbdata%caddname(jadd)(1:4)=='MEAN') THEN 1210 jmean=jadd 1211 EXIT 1212 ENDIF 1213 ENDDO 1214 IF (jmean==0) THEN 1215 WRITE(*,*)'Warning: MEAN additional variable not found' 1216 RETURN 1217 ENDIF 1218 IF (fbdata%nobs>0) THEN 1219 DO jadd=1,fbdata%nadd 1220 IF (fbdata%caddname(jadd)(1:2)=='Hx') THEN 1221 fbdata%padd(:,:,jadd,:)=fbdata%padd(:,:,jadd,:)& 1222 & +fbdata%padd(:,:,jmean,:) 1223 ENDIF 1224 ENDDO 1225 ENDIF 1226 1227 END SUBROUTINE fb_rmmean 499 1228 500 1229 SUBROUTINE getlevsmean(nmlev,zlev) -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbthin.F90
r2945 r3000 1 1 PROGRAM fbthin 2 !!--------------------------------------------------------------------- 3 !! 4 !! ** PROGRAM fbthin ** 5 !! 6 !! ** Purpose : Thin the data to 1 degree resolution 7 !! 8 !! ** Method : Use of utilities from obs_fbm. 9 !! 10 !! ** Action : 11 !! 12 !! Usage: 13 !! fbthin inputfile outputfile 14 !! 15 !! Required: 16 !! namelist = namthin.in 17 !! 18 !! History : 19 !! ! 2010 (K. Mogensen) Initial version 20 !!---------------------------------------------------------------------- 2 21 USE obs_fbm 3 22 IMPLICIT NONE … … 5 24 ! Command line arguments for output file and input file 6 25 ! 7 #ifndef NOIARG THINROTO26 #ifndef NOIARGCPROTO 8 27 INTEGER,EXTERNAL :: iargc 9 28 #endif … … 50 69 SUBROUTINE fb_thin( fbdata ) 51 70 ! 52 ! Observation thinning stub71 ! Observation thinning 53 72 ! 54 73 IMPLICIT NONE 55 74 TYPE(obfbdata) :: fbdata 56 REAL :: dlat = 1.0 57 REAL :: dlon = 1.0 58 LOGICAL :: lred = .TRUE. 59 INTEGER, ALLOCATABLE :: thinobs(:,:), thinqc(:,:) 60 REAL, ALLOCATABLE :: thindist(:,:), thingridlat(:), thingridlon(:,:) 61 INTEGER :: nlon,nlat 62 INTEGER :: ii,ij,iv,ilon,ilat,iqc,iobs,irej 63 REAL :: zlon,zdlon,zrpi,zdist 64 LOGICAL :: lexists 65 NAMELIST/namthin/dlat,dlon,lred 75 ! Namelist parameters 76 INTEGER, PARAMETER :: nmaxtypes = 10 77 CHARACTER(len=ilentyp), DIMENSION(nmaxtypes) :: thintypes 78 REAL, DIMENSION(nmaxtypes) :: thindists, thindtime 79 ! Local variables 80 NAMELIST/namthin/thintypes, thindists, thindtime 81 INTEGER :: it,ii,ij,iv,iobs,irej 82 REAL :: zdist 83 84 ! Get namelist 85 thintypes(:) = 'XXXX' 86 ! Distance in km 87 thindists(:) = 100.0 88 ! Time difference in days 89 thindtime(:) = 0.99999999 90 OPEN(10,file='namthin.in') 91 READ(10,namthin) 92 CLOSE(10) 93 WRITE(*,namthin) 66 94 67 INQUIRE(file='namthin.in',exist=lexists) 68 IF (lexists) THEN 69 OPEN(10,file='namthin.in') 70 READ(10,namthin) 71 CLOSE(10) 72 ENDIF 73 WRITE(*,namthin) 95 ! Convert to meters 96 thindists(:) = thindists(:) * 1000.0 74 97 75 nlon=360/dlon 76 nlat=180/dlat+1 77 ALLOCATE(thinobs(nlon,nlat)) 78 ALLOCATE(thinqc(nlon,nlat)) 79 ALLOCATE(thindist(nlon,nlat)) 80 ALLOCATE(thingridlat(nlat)) 81 ALLOCATE(thingridlon(nlon,nlat)) 82 thinobs(:,:)=0 83 thinqc(:,:)=0 84 thindist(:,:)=0 85 zrpi=ATAN(1.0)/45. 86 DO ij=1,nlat 87 thingridlat(ij)=(ij-1)*dlat-90.0 88 IF (lred) THEN 89 zdlon=MIN(dlon/MAX(COS(ABS(zrpi*thingridlat(ij))),0.0001),360.0) 90 ELSE 91 zdlon=dlon 92 ENDIF 93 DO ii=1,nlon 94 thingridlon(ii,ij)=(ii-1)*zdlon 95 ENDDO 98 DO it = 1, nmaxtypes 99 100 IF ( TRIM(thintypes(it)) == 'XXXX' ) CYCLE 101 102 iobs = 0 103 irej = 0 104 105 master_loop: DO ii= 1, fbdata%nobs 106 107 IF ( TRIM(ADJUSTL(thintypes(it))) /= 'all' ) THEN 108 IF ( TRIM(ADJUSTL(fbdata%cdtyp(ii))) /= & 109 & TRIM(ADJUSTL(thintypes(it))) ) CYCLE 110 ENDIF 111 112 iobs = iobs + 1 113 114 ! Skip data with missing lon and lat and observation flag rejected. 115 116 IF (fbdata%plam(ii)==fbrmdi) CYCLE 117 IF (fbdata%pphi(ii)==fbrmdi) CYCLE 118 IF (fbdata%ioqc(ii)>2) CYCLE 119 120 DO ij=ii+1, fbdata%nobs 121 122 ! Skip data with missing lon and lat and observation flag rejected. 123 124 IF (fbdata%plam(ij)==fbrmdi) CYCLE 125 IF (fbdata%pphi(ij)==fbrmdi) CYCLE 126 IF (fbdata%ioqc(ij)>2) CYCLE 127 128 ! Skip different type unless thintypes is 'all' 129 130 IF ( TRIM(ADJUSTL(thintypes(it))) /= 'all' ) THEN 131 IF ( TRIM(ADJUSTL(fbdata%cdtyp(ij))) /= & 132 & TRIM(ADJUSTL(thintypes(it))) ) CYCLE 133 ENDIF 134 135 IF ( ABS( fbdata%ptim(ij) - fbdata%ptim(ii) ) & 136 & >= thindtime(it) ) CYCLE 137 138 zdist = distance( fbdata%plam(ii), fbdata%pphi(ii), & 139 & fbdata%plam(ij), fbdata%pphi(ij) ) 140 141 IF ( zdist < thindists(it) ) THEN 142 143 irej = irej + 1 144 fbdata%ioqc(ij) = 4 145 fbdata%ioqcf(2,ij) = fbdata%ioqcf(2,ij) + 32 146 147 ENDIF 148 ENDDO 149 150 ENDDO master_loop 151 152 WRITE(*,*)'For type = ',TRIM(thintypes(it)) 153 WRITE(*,*)'Observations considered = ',iobs 154 WRITE(*,*)'Observations rejected = ',irej 155 96 156 ENDDO 97 irej=098 iobs=099 157 100 DO ii=1,fbdata%nobs101 158 102 ! Skip data with missing lon and lat. 103 IF (fbdata%plam(ii)==fbrmdi) CYCLE 104 IF (fbdata%pphi(ii)==fbrmdi) CYCLE 105 106 ! Count number of observations with qcflag<=2. 107 iqc=0 108 DO iv=1,fbdata%nvar 109 DO ij=1,fbdata%nlev 110 IF(fbdata%ivlqc(ij,ii,iv)<=2) iqc=iqc+1 111 ENDDO 112 ENDDO 113 114 ! Find ilat,ilon positions 115 zlon=fbdata%plam(ii) 116 IF (zlon>=360.0) zlon=zlon-360 117 IF (zlon<0.0) zlon=zlon+360 118 ! If reduced grid change zdlon accordingly 119 IF (lred) THEN 120 zdlon=MIN(dlon/MAX(COS(ABS(zrpi*fbdata%pphi(ii))),0.0001),360.0) 121 ELSE 122 zdlon=dlon 123 ENDIF 124 ilon=INT(zlon/zdlon)+1 125 ilat=INT((fbdata%pphi(ii)+90.0)/dlat)+1 126 iobs=iobs+1 127 ! Check which observation to pick based on number of valid obs. 128 IF (thinobs(ilon,ilat)>0) THEN 129 irej=irej+1 130 IF (iqc>=thinqc(ilon,ilat)) THEN 131 zdist=distance(zrpi,zlon,fbdata%pphi(ii),& 132 & thingridlon(ilon,ilat),thingridlat(ilat)) 133 IF(iqc==thinqc(ilon,ilat)) THEN 134 IF (zdist<thindist(ilon,ilat)) THEN 135 fbdata%ivlqc(:,thinobs(ilon,ilat),:)=4 136 thinobs(ilon,ilat)=ii 137 thinqc(ilon,ilat)=iqc 138 thindist(ilon,ilat)=zdist 139 ELSE 140 fbdata%ivlqc(:,ii,:)=4 141 ENDIF 142 ELSE 143 fbdata%ivlqc(:,thinobs(ilon,ilat),:)=4 144 thinobs(ilon,ilat)=ii 145 thinqc(ilon,ilat)=iqc 146 thindist(ilon,ilat)=zdist 147 ENDIF 148 ELSE 149 fbdata%ivlqc(:,ii,:)=4 150 ENDIF 151 ELSE 152 thinobs(ilon,ilat)=ii 153 thinqc(ilon,ilat)=iqc 154 thindist(ilon,ilat)=distance(zrpi,zlon,fbdata%pphi(ii),& 155 & thingridlon(ilon,ilat),thingridlat(ilat)) 156 ENDIF 157 ENDDO 158 WRITE(*,*)'Observations considered = ',iobs 159 WRITE(*,*)'Observations rejected = ',irej 160 161 DEALLOCATE(thinobs) 162 DEALLOCATE(thinqc) 163 DEALLOCATE(thindist) 164 DEALLOCATE(thingridlat) 165 DEALLOCATE(thingridlon) 166 159 167 160 END SUBROUTINE fb_thin 168 161 169 REAL FUNCTION distance( prpi, plon, plat, gridlon, gridlat ) 170 REAL :: prpi,plon,plat,gridlat,gridlon 171 REAL :: zplat,zplon,zgridlat,zgridlon 172 REAL :: za1,za2,zb1,zb2,zc1,zc2,zcos1,zcos2 173 174 zplon=plon 175 zgridlon=gridlon 176 IF (zplon<-180) zplon=zplon+360.0 177 IF (zplon>=180) zplon=zplon-360.0 178 IF (zgridlon<-180) zgridlon=zgridlon+360.0 179 IF (zgridlon>=180) zgridlon=zgridlon-360.0 180 zplon=zplon*prpi 181 zgridlon=zgridlon*prpi 182 zplat=plat*prpi 183 zgridlat=gridlat*prpi 184 zcos1=COS(zplat) 185 zcos2=COS(zgridlat) 186 za1=SIN(zplat) 187 za2=SIN(zgridlat) 188 zb1=zcos1*COS(zplon) 189 zb2=zcos2*COS(zgridlon) 190 zc1=zcos1*SIN(zplon) 191 zc2=zcos2*SIN(zgridlon) 192 193 distance=ASIN(SQRT(1.0-(za1*za2+zb1*zb2+zc1*zc2)**2)) 194 195 END FUNCTION distance 162 #include "distance.h90" 196 163 197 164 END PROGRAM fbthin -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/sla2fb.F90
r2945 r3000 1 1 PROGRAM sla2fb 2 !!--------------------------------------------------------------------- 3 !! 4 !! ** PROGRAM sla2fb ** 5 !! 6 !! ** Purpose : Convert AVISO SLA format to feedback format 7 !! 8 !! ** Method : Use of utilities from obs_fbm. 9 !! 10 !! ** Action : 11 !! 12 !! Usage: 13 !! sla2fb [-s type] outputfile inputfile1 inputfile2 ... 14 !! Option: 15 !! -s Select altimeter data_source 16 !! 17 !! History : 18 !! ! 2010 (K. Mogensen) Initial version 19 !!---------------------------------------------------------------------- 2 20 USE obs_fbm 3 21 USE obs_sla_io … … 13 31 CHARACTER(len=256) :: cdoutfile 14 32 CHARACTER(len=256),ALLOCATABLE :: cdinfile(:) 33 CHARACTER(len=256) :: cdtmp 34 CHARACTER(len=5) :: cdsource 15 35 ! 16 36 ! Input data … … 25 45 ! Loop variables 26 46 ! 27 INTEGER :: ip,ia,ji,jk 47 INTEGER :: ip,ia,ji,jk,noff 28 48 ! 29 49 ! Get number of command line arguments … … 32 52 IF (nargs < 1) THEN 33 53 WRITE(*,'(A)')'Usage:' 34 WRITE(*,'(A)')'sla2fb outputfile inputfile1 inputfile2 ...'54 WRITE(*,'(A)')'sla2fb [-s type] outputfile inputfile1 inputfile2 ...' 35 55 CALL abort() 36 56 ENDIF 37 CALL getarg(1,cdoutfile)57 cdsource='' 38 58 ! 39 59 ! Get input data 40 60 ! 41 ALLOCATE( slaf(MAX(nargs-1,1)) ) 42 ALLOCATE( cdinfile(nargs-1) ) 61 noff=1 62 IF ( nargs > 1 ) THEN 63 CALL getarg(1,cdtmp) 64 IF (TRIM(cdtmp)=='-s') THEN 65 IF ( nargs < 3 ) THEN 66 WRITE(*,*)'Missing arguments to -s <datasource>' 67 CALL abort 68 ENDIF 69 CALL getarg(2,cdsource) 70 noff=3 71 ENDIF 72 ENDIF 73 CALL getarg(noff,cdoutfile) 74 ninfiles = nargs - noff 75 ALLOCATE( slaf(MAX(nargs-noff,1)) ) 76 ALLOCATE( cdinfile(nargs-noff) ) 43 77 ntotobs = 0 44 ninfiles = nargs - 145 78 DO ia=1,ninfiles 46 CALL getarg( ia + 1, cdinfile(ia) )79 CALL getarg( ia + noff, cdinfile(ia) ) 47 80 WRITE(*,'(2A)')'File = ',TRIM(cdinfile(ia)) 48 81 CALL read_avisofile( TRIM(cdinfile(ia)), slaf(ia), 6, .TRUE., .FALSE. ) 49 82 WRITE(*,'(A,I9,A)')'has',slaf(ia)%nobs,' observations' 83 IF (LEN_TRIM(cdsource)>0) THEN 84 DO ji=1,slaf(ia)%nobs 85 slaf(ia)%cdwmo(ji)=TRIM(slaf(ia)%cdwmo(ji))//'_'//TRIM(cdsource) 86 ENDDO 87 ENDIF 50 88 ntotobs = ntotobs + slaf(ia)%nobs 51 89 ENDDO -
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/vel2fb.F90
r2945 r3000 1 1 PROGRAM vel2fb 2 !!--------------------------------------------------------------------- 3 !! 4 !! ** PROGRAM vel2fb ** 5 !! 6 !! ** Purpose : Convert TAO/PIRATA/RAMA currents to feedback format 7 !! 8 !! ** Method : Use of utilities from obs_fbm. 9 !! 10 !! ** Action : 11 !! 12 !! Usage: 13 !! vel2fb outputfile inputfile1 inputfile2 ... 14 !! 15 !! History : 16 !! ! 2010 (K. Mogensen) Initial version 17 !!---------------------------------------------------------------------- 2 18 USE obs_fbm 3 19 USE obs_vel_io
Note: See TracChangeset
for help on using the changeset viewer.