- Timestamp:
- 2019-07-01T12:44:06+02:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/r6232_obs_oper_update/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_prof.F90
r4990 r11202 25 25 USE netcdf ! NetCDF library 26 26 USE obs_oper ! Observation operators 27 USE obs_prof_io ! Profile files I/O (non-FB files)28 27 USE lib_mpp ! For ctl_warn/stop 28 USE obs_fbm ! Feedback routines 29 29 30 30 IMPLICIT NONE … … 33 33 PRIVATE 34 34 35 PUBLIC obs_rea_pro _dri! Read the profile observations35 PUBLIC obs_rea_prof ! Read the profile observations 36 36 37 37 !!---------------------------------------------------------------------- … … 42 42 43 43 CONTAINS 44 45 SUBROUTINE obs_rea_pro_dri( kformat, & 46 & profdata, knumfiles, cfilenames, & 47 & kvars, kextr, kstp, ddobsini, ddobsend, & 48 & ldt3d, lds3d, ldignmis, ldsatt, ldavtimset, & 49 & ldmod, kdailyavtypes ) 44 45 SUBROUTINE obs_rea_prof( profdata, knumfiles, cdfilenames, & 46 & kvars, kextr, kstp, ddobsini, ddobsend, & 47 & ldvar, ldignmis, ldsatt, & 48 & ldmod, kdailyavtypes ) 50 49 !!--------------------------------------------------------------------- 51 50 !! 52 !! *** ROUTINE obs_rea_pro _dri***51 !! *** ROUTINE obs_rea_prof *** 53 52 !! 54 53 !! ** Purpose : Read from file the profile observations 55 54 !! 56 !! ** Method : Depending on kformat either ENACT, CORIOLIS or57 !! feedback data files are read55 !! ** Method : Read feedback data in and transform to NEMO internal 56 !! profile data structure 58 57 !! 59 58 !! ** Action : … … 63 62 !! History : 64 63 !! ! : 2009-09 (K. Mogensen) : New merged version of old routines 64 !! ! : 2015-08 (M. Martin) : Merged profile and velocity routines 65 65 !!---------------------------------------------------------------------- 66 !! * Modules used 67 66 68 67 !! * Arguments 69 INTEGER :: kformat ! Format of input data 70 ! ! 1: ENACT 71 ! ! 2: Coriolis 72 TYPE(obs_prof), INTENT(OUT) :: profdata ! Profile data to be read 73 INTEGER, INTENT(IN) :: knumfiles ! Number of files to read in 68 TYPE(obs_prof), INTENT(OUT) :: & 69 & profdata ! Profile data to be read 70 INTEGER, INTENT(IN) :: knumfiles ! Number of files to read 74 71 CHARACTER(LEN=128), INTENT(IN) :: & 75 & c filenames(knumfiles)! File names to read in72 & cdfilenames(knumfiles) ! File names to read in 76 73 INTEGER, INTENT(IN) :: kvars ! Number of variables in profdata 77 INTEGER, INTENT(IN) :: kextr ! Number of extra fields for each var in profdata 78 INTEGER, INTENT(IN) :: kstp ! Ocean time-step index 79 LOGICAL, INTENT(IN) :: ldt3d ! Observed variables switches 80 LOGICAL, INTENT(IN) :: lds3d 81 LOGICAL, INTENT(IN) :: ldignmis ! Ignore missing files 82 LOGICAL, INTENT(IN) :: ldsatt ! Compute salinity at all temperature points 83 LOGICAL, INTENT(IN) :: ldavtimset ! Correct time for daily averaged data 84 LOGICAL, INTENT(IN) :: ldmod ! Initialize model from input data 85 REAL(KIND=dp), INTENT(IN) :: ddobsini ! Obs. ini time in YYYYMMDD.HHMMSS 86 REAL(KIND=dp), INTENT(IN) :: ddobsend ! Obs. end time in YYYYMMDD.HHMMSS 74 INTEGER, INTENT(IN) :: kextr ! Number of extra fields for each var 75 INTEGER, INTENT(IN) :: kstp ! Ocean time-step index 76 LOGICAL, DIMENSION(kvars), INTENT(IN) :: ldvar ! Observed variables switches 77 LOGICAL, INTENT(IN) :: ldignmis ! Ignore missing files 78 LOGICAL, INTENT(IN) :: ldsatt ! Compute salinity at all temperature points 79 LOGICAL, INTENT(IN) :: ldmod ! Initialize model from input data 80 REAL(dp), INTENT(IN) :: ddobsini ! Obs. ini time in YYYYMMDD.HHMMSS 81 REAL(dp), INTENT(IN) :: ddobsend ! Obs. end time in YYYYMMDD.HHMMSS 87 82 INTEGER, DIMENSION(imaxavtypes), OPTIONAL :: & 88 & kdailyavtypes 83 & kdailyavtypes ! Types of daily average observations 89 84 90 85 !! * Local declarations 91 CHARACTER(LEN=15), PARAMETER :: cpname='obs_rea_pro_dri' 86 CHARACTER(LEN=15), PARAMETER :: cpname='obs_rea_prof' 87 CHARACTER(len=8) :: clrefdate 88 CHARACTER(len=8), DIMENSION(:), ALLOCATABLE :: clvars 92 89 INTEGER :: jvar 93 90 INTEGER :: ji … … 105 102 INTEGER :: imin 106 103 INTEGER :: isec 104 INTEGER :: iprof 105 INTEGER :: iproftot 106 INTEGER, DIMENSION(kvars) :: ivart0 107 INTEGER, DIMENSION(kvars) :: ivart 108 INTEGER :: ip3dt 109 INTEGER :: ios 110 INTEGER :: ioserrcount 111 INTEGER, DIMENSION(kvars) :: ivartmpp 112 INTEGER :: ip3dtmpp 113 INTEGER :: itype 107 114 INTEGER, DIMENSION(knumfiles) :: & 108 115 & irefdate 109 INTEGER, DIMENSION(ntyp1770+1) :: & 110 & itypt, & 111 & ityptmpp, & 112 & ityps, & 113 & itypsmpp 114 INTEGER :: it3dtmpp 115 INTEGER :: is3dtmpp 116 INTEGER :: ip3dtmpp 117 INTEGER, DIMENSION(:), ALLOCATABLE :: & 116 INTEGER, DIMENSION(ntyp1770+1,kvars) :: & 117 & itypvar, & 118 & itypvarmpp 119 INTEGER, DIMENSION(:,:), ALLOCATABLE :: & 118 120 & iobsi, & 119 121 & iobsj, & 120 & iproc, & 122 & iproc 123 INTEGER, DIMENSION(:), ALLOCATABLE :: & 121 124 & iindx, & 122 125 & ifileidx, & 123 126 & iprofidx 124 INTEGER :: itype125 127 INTEGER, DIMENSION(imaxavtypes) :: & 126 128 & idailyavtypes 129 INTEGER, DIMENSION(kvars) :: & 130 & iv3dt 127 131 REAL(wp), DIMENSION(:), ALLOCATABLE :: & 128 132 & zphi, & 129 133 & zlam 130 real(wp), DIMENSION(:), ALLOCATABLE :: &134 REAL(wp), DIMENSION(:), ALLOCATABLE :: & 131 135 & zdat 136 REAL(wp), DIMENSION(knumfiles) :: & 137 & djulini, & 138 & djulend 132 139 LOGICAL :: llvalprof 140 LOGICAL :: lldavtimset 141 LOGICAL :: llcycle 133 142 TYPE(obfbdata), POINTER, DIMENSION(:) :: & 134 143 & inpfiles 135 real(wp), DIMENSION(knumfiles) :: & 136 & djulini, & 137 & djulend 138 INTEGER :: iprof 139 INTEGER :: iproftot 140 INTEGER :: it3dt0 141 INTEGER :: is3dt0 142 INTEGER :: it3dt 143 INTEGER :: is3dt 144 INTEGER :: ip3dt 145 INTEGER :: ios 146 INTEGER :: ioserrcount 147 INTEGER, DIMENSION(kvars) :: & 148 & iv3dt 149 CHARACTER(len=8) :: cl_refdate 150 144 151 145 ! Local initialization 152 146 iprof = 0 153 it3dt0 = 0 154 is3dt0 = 0 147 ivart0(:) = 0 155 148 ip3dt = 0 156 149 157 150 ! Daily average types 151 lldavtimset = .FALSE. 158 152 IF ( PRESENT(kdailyavtypes) ) THEN 159 153 idailyavtypes(:) = kdailyavtypes(:) 154 IF ( ANY (idailyavtypes(:) /= -1) ) lldavtimset = .TRUE. 160 155 ELSE 161 156 idailyavtypes(:) = -1 … … 163 158 164 159 !----------------------------------------------------------------------- 165 ! Check data the model part is just with feedback data files166 !-----------------------------------------------------------------------167 IF ( ldmod .AND. ( kformat /= 0 ) ) THEN168 CALL ctl_stop( 'Model can only be read from feedback data' )169 RETURN170 ENDIF171 172 !-----------------------------------------------------------------------173 160 ! Count the number of files needed and allocate the obfbdata type 174 161 !----------------------------------------------------------------------- 175 162 176 163 inobf = knumfiles 177 164 178 165 ALLOCATE( inpfiles(inobf) ) 179 166 180 167 prof_files : DO jj = 1, inobf 181 168 182 169 !--------------------------------------------------------------------- 183 170 ! Prints … … 186 173 WRITE(numout,*) 187 174 WRITE(numout,*) ' obs_rea_pro_dri : Reading from file = ', & 188 & TRIM( TRIM( c filenames(jj) ) )175 & TRIM( TRIM( cdfilenames(jj) ) ) 189 176 WRITE(numout,*) ' ~~~~~~~~~~~~~~~' 190 177 WRITE(numout,*) … … 194 181 ! Initialization: Open file and get dimensions only 195 182 !--------------------------------------------------------------------- 196 197 iflag = nf90_open( TRIM( TRIM( cfilenames(jj)) ), nf90_nowrite, &183 184 iflag = nf90_open( TRIM( cdfilenames(jj) ), nf90_nowrite, & 198 185 & i_file_id ) 199 186 200 187 IF ( iflag /= nf90_noerr ) THEN 201 188 202 189 IF ( ldignmis ) THEN 203 190 inpfiles(jj)%nobs = 0 204 CALL ctl_warn( 'File ' // TRIM( TRIM( cfilenames(jj)) ) // &191 CALL ctl_warn( 'File ' // TRIM( cdfilenames(jj) ) // & 205 192 & ' not found' ) 206 193 ELSE 207 CALL ctl_stop( 'File ' // TRIM( TRIM( cfilenames(jj)) ) // &194 CALL ctl_stop( 'File ' // TRIM( cdfilenames(jj) ) // & 208 195 & ' not found' ) 209 196 ENDIF 210 197 211 198 ELSE 212 199 213 200 !------------------------------------------------------------------ 214 ! Close the file since it is opened in read_ proffile201 ! Close the file since it is opened in read_obfbdata 215 202 !------------------------------------------------------------------ 216 203 217 204 iflag = nf90_close( i_file_id ) 218 205 … … 220 207 ! Read the profile file into inpfiles 221 208 !------------------------------------------------------------------ 222 IF ( kformat == 0 ) THEN 223 CALL init_obfbdata( inpfiles(jj) ) 224 IF(lwp) THEN 225 WRITE(numout,*) 226 WRITE(numout,*)'Reading from feedback file :', & 227 & TRIM( cfilenames(jj) ) 228 ENDIF 229 CALL read_obfbdata( TRIM( cfilenames(jj) ), inpfiles(jj), & 230 & ldgrid = .TRUE. ) 231 IF ( inpfiles(jj)%nvar < 2 ) THEN 232 CALL ctl_stop( 'Feedback format error' ) 233 RETURN 234 ENDIF 235 IF ( TRIM(inpfiles(jj)%cname(1)) /= 'POTM' ) THEN 236 CALL ctl_stop( 'Feedback format error' ) 237 RETURN 238 ENDIF 239 IF ( TRIM(inpfiles(jj)%cname(2)) /= 'PSAL' ) THEN 240 CALL ctl_stop( 'Feedback format error' ) 241 RETURN 242 ENDIF 243 IF ( ldmod .AND. ( inpfiles(jj)%nadd == 0 ) ) THEN 244 CALL ctl_stop( 'Model not in input data' ) 245 RETURN 246 ENDIF 247 ELSEIF ( kformat == 1 ) THEN 248 CALL read_enactfile( TRIM( cfilenames(jj) ), inpfiles(jj), & 249 & numout, lwp, .TRUE. ) 250 ELSEIF ( kformat == 2 ) THEN 251 CALL read_coriofile( TRIM( cfilenames(jj) ), inpfiles(jj), & 252 & numout, lwp, .TRUE. ) 209 CALL init_obfbdata( inpfiles(jj) ) 210 CALL read_obfbdata( TRIM( cdfilenames(jj) ), inpfiles(jj), & 211 & ldgrid = .TRUE. ) 212 213 IF ( inpfiles(jj)%nvar /= kvars ) THEN 214 CALL ctl_stop( 'Feedback format error: ', & 215 & ' unexpected number of vars in profile file' ) 216 ENDIF 217 218 IF ( ldmod .AND. ( inpfiles(jj)%nadd == 0 ) ) THEN 219 CALL ctl_stop( 'Model not in input data' ) 220 ENDIF 221 222 IF ( jj == 1 ) THEN 223 ALLOCATE( clvars( inpfiles(jj)%nvar ) ) 224 DO ji = 1, inpfiles(jj)%nvar 225 clvars(ji) = inpfiles(jj)%cname(ji) 226 END DO 253 227 ELSE 254 CALL ctl_stop( 'File format unknown' ) 255 ENDIF 256 228 DO ji = 1, inpfiles(jj)%nvar 229 IF ( inpfiles(jj)%cname(ji) /= clvars(ji) ) THEN 230 CALL ctl_stop( 'Feedback file variables not consistent', & 231 & ' with previous files for this type' ) 232 ENDIF 233 END DO 234 ENDIF 235 257 236 !------------------------------------------------------------------ 258 237 ! Change longitude (-180,180) … … 272 251 ! Calculate the date (change eventually) 273 252 !------------------------------------------------------------------ 274 cl _refdate=inpfiles(jj)%cdjuldref(1:8)275 READ(cl _refdate,'(I8)') irefdate(jj)276 253 clrefdate=inpfiles(jj)%cdjuldref(1:8) 254 READ(clrefdate,'(I8)') irefdate(jj) 255 277 256 CALL ddatetoymdhms( ddobsini, iyea, imon, iday, ihou, imin, isec ) 278 257 CALL greg2jul( isec, imin, ihou, iday, imon, iyea, djulini(jj), & … … 283 262 284 263 ioserrcount=0 285 IF ( ldavtimset ) THEN 264 IF ( lldavtimset ) THEN 265 266 IF ( ANY ( idailyavtypes(:) /= -1 ) .AND. lwp) THEN 267 WRITE(numout,*)' Resetting time of daily averaged', & 268 & ' observations to the end of the day' 269 ENDIF 270 286 271 DO ji = 1, inpfiles(jj)%nobs 287 !288 ! for daily averaged data for example289 ! MRB data (itype==820) force the time290 ! to be the end of the day291 !292 272 READ( inpfiles(jj)%cdtyp(ji), '(I4)', IOSTAT = ios, ERR = 900 ) itype 293 273 900 IF ( ios /= 0 ) THEN 294 itype = 0 ! Set type to zero if there is a problem in the string conversion 295 ENDIF 296 IF ( ANY (idailyavtypes == itype ) ) THEN 297 inpfiles(jj)%ptim(ji) = & 298 & INT(inpfiles(jj)%ptim(ji)) + 1 299 ENDIF 274 ! Set type to zero if there is a problem in the string conversion 275 itype = 0 276 ENDIF 277 278 IF ( ANY ( idailyavtypes(:) == itype ) ) THEN 279 ! for daily averaged data force the time 280 ! to be the last time-step of the day, but still within the day. 281 IF ( inpfiles(jj)%ptim(ji) >= 0. ) THEN 282 inpfiles(jj)%ptim(ji) = & 283 & INT(inpfiles(jj)%ptim(ji)) + 0.9999 284 ELSE 285 inpfiles(jj)%ptim(ji) = & 286 & INT(inpfiles(jj)%ptim(ji)) - 0.0001 287 ENDIF 288 ENDIF 289 300 290 END DO 301 ENDIF 302 291 292 ENDIF 293 303 294 IF ( inpfiles(jj)%nobs > 0 ) THEN 304 inpfiles(jj)%iproc = -1305 inpfiles(jj)%iobsi = -1306 inpfiles(jj)%iobsj = -1295 inpfiles(jj)%iproc(:,:) = -1 296 inpfiles(jj)%iobsi(:,:) = -1 297 inpfiles(jj)%iobsj(:,:) = -1 307 298 ENDIF 308 299 inowin = 0 309 300 DO ji = 1, inpfiles(jj)%nobs 310 IF ( inpfiles(jj)%ioqc(ji) > 2 ) CYCLE 311 IF ( ( inpfiles(jj)%ivqc(ji,1) > 2 ) .AND. & 312 & ( inpfiles(jj)%ivqc(ji,2) > 2 )) CYCLE 301 IF ( BTEST(inpfiles(jj)%ioqc(ji),2 ) ) CYCLE 302 llcycle = .TRUE. 303 DO jvar = 1, kvars 304 IF ( .NOT. ( BTEST(inpfiles(jj)%ivqc(ji,jvar),2) ) ) THEN 305 llcycle = .FALSE. 306 EXIT 307 ENDIF 308 END DO 309 IF ( llcycle ) CYCLE 313 310 IF ( ( inpfiles(jj)%ptim(ji) > djulini(jj) ) .AND. & 314 311 & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN … … 318 315 ALLOCATE( zlam(inowin) ) 319 316 ALLOCATE( zphi(inowin) ) 320 ALLOCATE( iobsi(inowin ) )321 ALLOCATE( iobsj(inowin ) )322 ALLOCATE( iproc(inowin ) )317 ALLOCATE( iobsi(inowin,kvars) ) 318 ALLOCATE( iobsj(inowin,kvars) ) 319 ALLOCATE( iproc(inowin,kvars) ) 323 320 inowin = 0 324 321 DO ji = 1, inpfiles(jj)%nobs 325 IF ( inpfiles(jj)%ioqc(ji) > 2 ) CYCLE 326 IF ( ( inpfiles(jj)%ivqc(ji,1) > 2 ) .AND. & 327 & ( inpfiles(jj)%ivqc(ji,2) > 2 )) CYCLE 322 IF ( BTEST(inpfiles(jj)%ioqc(ji),2 ) ) CYCLE 323 llcycle = .TRUE. 324 DO jvar = 1, kvars 325 IF ( .NOT. ( BTEST(inpfiles(jj)%ivqc(ji,jvar),2) ) ) THEN 326 llcycle = .FALSE. 327 EXIT 328 ENDIF 329 END DO 330 IF ( llcycle ) CYCLE 328 331 IF ( ( inpfiles(jj)%ptim(ji) > djulini(jj) ) .AND. & 329 332 & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN … … 334 337 END DO 335 338 336 CALL obs_grid_search( inowin, zlam, zphi, iobsi, iobsj, iproc, 'T' ) 339 ! Assume anything other than velocity is on T grid 340 IF ( TRIM( inpfiles(jj)%cname(1) ) == 'UVEL' ) THEN 341 CALL obs_grid_search( inowin, zlam, zphi, iobsi(:,1), iobsj(:,1), & 342 & iproc(:,1), 'U' ) 343 CALL obs_grid_search( inowin, zlam, zphi, iobsi(:,2), iobsj(:,2), & 344 & iproc(:,2), 'V' ) 345 ELSE 346 CALL obs_grid_search( inowin, zlam, zphi, iobsi(:,1), iobsj(:,1), & 347 & iproc(:,1), 'T' ) 348 IF ( kvars > 1 ) THEN 349 DO jvar = 2, kvars 350 iobsi(:,jvar) = iobsi(:,1) 351 iobsj(:,jvar) = iobsj(:,1) 352 iproc(:,jvar) = iproc(:,1) 353 END DO 354 ENDIF 355 ENDIF 337 356 338 357 inowin = 0 339 358 DO ji = 1, inpfiles(jj)%nobs 340 IF ( inpfiles(jj)%ioqc(ji) > 2 ) CYCLE 341 IF ( ( inpfiles(jj)%ivqc(ji,1) > 2 ) .AND. & 342 & ( inpfiles(jj)%ivqc(ji,2) > 2 )) CYCLE 359 IF ( BTEST(inpfiles(jj)%ioqc(ji),2 ) ) CYCLE 360 llcycle = .TRUE. 361 DO jvar = 1, kvars 362 IF ( .NOT. ( BTEST(inpfiles(jj)%ivqc(ji,jvar),2) ) ) THEN 363 llcycle = .FALSE. 364 EXIT 365 ENDIF 366 END DO 367 IF ( llcycle ) CYCLE 343 368 IF ( ( inpfiles(jj)%ptim(ji) > djulini(jj) ) .AND. & 344 369 & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN 345 370 inowin = inowin + 1 346 inpfiles(jj)%iproc(ji,1) = iproc(inowin) 347 inpfiles(jj)%iobsi(ji,1) = iobsi(inowin) 348 inpfiles(jj)%iobsj(ji,1) = iobsj(inowin) 371 DO jvar = 1, kvars 372 inpfiles(jj)%iproc(ji,jvar) = iproc(inowin,jvar) 373 inpfiles(jj)%iobsi(ji,jvar) = iobsi(inowin,jvar) 374 inpfiles(jj)%iobsj(ji,jvar) = iobsj(inowin,jvar) 375 END DO 376 IF ( kvars > 1 ) THEN 377 DO jvar = 2, kvars 378 IF ( inpfiles(jj)%iproc(ji,jvar) /= & 379 & inpfiles(jj)%iproc(ji,1) ) THEN 380 CALL ctl_stop( 'Error in obs_read_prof:', & 381 & 'observation on different processors for different vars') 382 ENDIF 383 END DO 384 ENDIF 349 385 ENDIF 350 386 END DO … … 352 388 353 389 DO ji = 1, inpfiles(jj)%nobs 354 IF ( inpfiles(jj)%ioqc(ji) > 2 ) CYCLE 355 IF ( ( inpfiles(jj)%ivqc(ji,1) > 2 ) .AND. & 356 & ( inpfiles(jj)%ivqc(ji,2) > 2 )) CYCLE 390 IF ( BTEST(inpfiles(jj)%ioqc(ji),2 ) ) CYCLE 391 llcycle = .TRUE. 392 DO jvar = 1, kvars 393 IF ( .NOT. ( BTEST(inpfiles(jj)%ivqc(ji,jvar),2) ) ) THEN 394 llcycle = .FALSE. 395 EXIT 396 ENDIF 397 END DO 398 IF ( llcycle ) CYCLE 357 399 IF ( ( inpfiles(jj)%ptim(ji) > djulini(jj) ) .AND. & 358 400 & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN … … 363 405 ENDIF 364 406 llvalprof = .FALSE. 365 IF ( ldt3d ) THEN 366 loop_t_count : DO ij = 1,inpfiles(jj)%nlev 367 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & 368 & CYCLE 369 IF ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 370 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 371 it3dt0 = it3dt0 + 1 372 ENDIF 373 END DO loop_t_count 374 ENDIF 375 IF ( lds3d ) THEN 376 loop_s_count : DO ij = 1,inpfiles(jj)%nlev 377 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & 378 & CYCLE 379 IF ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 380 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 381 is3dt0 = is3dt0 + 1 382 ENDIF 383 END DO loop_s_count 384 ENDIF 385 loop_p_count : DO ij = 1,inpfiles(jj)%nlev 407 DO jvar = 1, kvars 408 IF ( ldvar(jvar) ) THEN 409 DO ij = 1,inpfiles(jj)%nlev 410 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & 411 & CYCLE 412 IF ( .NOT. BTEST(inpfiles(jj)%ivlqc(ij,ji,jvar),2) .AND. & 413 & .NOT. BTEST(inpfiles(jj)%idqc(ij,ji),2) ) THEN 414 ivart0(jvar) = ivart0(jvar) + 1 415 ENDIF 416 END DO 417 ENDIF 418 END DO 419 DO ij = 1,inpfiles(jj)%nlev 386 420 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & 387 421 & CYCLE 388 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. &389 & ( inpfiles(jj)%idqc(ij,ji) <= 2 )) .AND. &390 & ldt3d ) .OR. &391 & ( ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. &392 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. &393 & lds3d ) ) THEN394 ip3dt = ip3dt + 1395 llvalprof = .TRUE.396 END IF397 END DO loop_p_count422 DO jvar = 1, kvars 423 IF ( ( .NOT. BTEST(inpfiles(jj)%ivlqc(ij,ji,jvar),2) .AND. & 424 & .NOT. BTEST(inpfiles(jj)%idqc(ij,ji),2) .AND. & 425 & ldvar(jvar) ) ) THEN 426 ip3dt = ip3dt + 1 427 llvalprof = .TRUE. 428 EXIT 429 ENDIF 430 END DO 431 END DO 398 432 399 433 IF ( llvalprof ) iprof = iprof + 1 … … 405 439 406 440 END DO prof_files 407 441 408 442 !----------------------------------------------------------------------- 409 443 ! Get the time ordered indices of the input data … … 416 450 DO jj = 1, inobf 417 451 DO ji = 1, inpfiles(jj)%nobs 418 IF ( inpfiles(jj)%ioqc(ji) > 2 ) CYCLE 419 IF ( ( inpfiles(jj)%ivqc(ji,1) > 2 ) .AND. & 420 & ( inpfiles(jj)%ivqc(ji,2) > 2 )) CYCLE 452 IF ( BTEST(inpfiles(jj)%ioqc(ji),2 ) ) CYCLE 453 llcycle = .TRUE. 454 DO jvar = 1, kvars 455 IF ( .NOT. ( BTEST(inpfiles(jj)%ivqc(ji,jvar),2) ) ) THEN 456 llcycle = .FALSE. 457 EXIT 458 ENDIF 459 END DO 460 IF ( llcycle ) CYCLE 421 461 IF ( ( inpfiles(jj)%ptim(ji) > djulini(jj) ) .AND. & 422 462 & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN … … 431 471 DO jj = 1, inobf 432 472 DO ji = 1, inpfiles(jj)%nobs 433 IF ( inpfiles(jj)%ioqc(ji) > 2 ) CYCLE 434 IF ( ( inpfiles(jj)%ivqc(ji,1) > 2 ) .AND. & 435 & ( inpfiles(jj)%ivqc(ji,2) > 2 )) CYCLE 473 IF ( BTEST(inpfiles(jj)%ioqc(ji),2 ) ) CYCLE 474 llcycle = .TRUE. 475 DO jvar = 1, kvars 476 IF ( .NOT. ( BTEST(inpfiles(jj)%ivqc(ji,jvar),2) ) ) THEN 477 llcycle = .FALSE. 478 EXIT 479 ENDIF 480 END DO 481 IF ( llcycle ) CYCLE 436 482 IF ( ( inpfiles(jj)%ptim(ji) > djulini(jj) ) .AND. & 437 483 & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN … … 446 492 & zdat, & 447 493 & iindx ) 448 494 449 495 iv3dt(:) = -1 450 496 IF (ldsatt) THEN 451 iv3dt(1) = ip3dt 452 iv3dt(2) = ip3dt 497 iv3dt(:) = ip3dt 453 498 ELSE 454 iv3dt(1) = it3dt0 455 iv3dt(2) = is3dt0 499 iv3dt(:) = ivart0(:) 456 500 ENDIF 457 501 CALL obs_prof_alloc( profdata, kvars, kextr, iprof, iv3dt, & 458 502 & kstp, jpi, jpj, jpk ) 459 503 460 504 ! * Read obs/positions, QC, all variable and assign to profdata 461 505 462 506 profdata%nprof = 0 463 507 profdata%nvprot(:) = 0 464 508 profdata%cvars(:) = clvars(:) 465 509 iprof = 0 466 510 467 511 ip3dt = 0 468 it3dt = 0 469 is3dt = 0 470 itypt (:) = 0 471 ityptmpp(:) = 0 472 473 ityps (:) = 0 474 itypsmpp(:) = 0 475 476 ioserrcount = 0 512 ivart(:) = 0 513 itypvar (:,:) = 0 514 itypvarmpp(:,:) = 0 515 516 ioserrcount = 0 477 517 DO jk = 1, iproftot 478 518 479 519 jj = ifileidx(iindx(jk)) 480 520 ji = iprofidx(iindx(jk)) 481 521 482 IF ( inpfiles(jj)%ioqc(ji) > 2 ) CYCLE 483 IF ( ( inpfiles(jj)%ivqc(ji,1) > 2 ) .AND. & 484 & ( inpfiles(jj)%ivqc(ji,2) > 2 )) CYCLE 522 IF ( BTEST(inpfiles(jj)%ioqc(ji),2 ) ) CYCLE 523 llcycle = .TRUE. 524 DO jvar = 1, kvars 525 IF ( .NOT. ( BTEST(inpfiles(jj)%ivqc(ji,jvar),2) ) ) THEN 526 llcycle = .FALSE. 527 EXIT 528 ENDIF 529 END DO 530 IF ( llcycle ) CYCLE 485 531 486 532 IF ( ( inpfiles(jj)%ptim(ji) > djulini(jj) ) .AND. & 487 533 & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN 488 534 489 535 IF ( nproc == 0 ) THEN 490 536 IF ( inpfiles(jj)%iproc(ji,1) > nproc ) CYCLE … … 492 538 IF ( inpfiles(jj)%iproc(ji,1) /= nproc ) CYCLE 493 539 ENDIF 494 540 495 541 llvalprof = .FALSE. 496 542 497 543 IF ( inpfiles(jj)%ioqc(ji) > 2 ) CYCLE 498 544 499 IF ( ( inpfiles(jj)%ivqc(ji,1) > 2 ) .AND. & 500 & ( inpfiles(jj)%ivqc(ji,2) > 2 ) ) CYCLE 545 IF ( BTEST(inpfiles(jj)%ioqc(ji),2 ) ) CYCLE 546 llcycle = .TRUE. 547 DO jvar = 1, kvars 548 IF ( .NOT. ( BTEST(inpfiles(jj)%ivqc(ji,jvar),2) ) ) THEN 549 llcycle = .FALSE. 550 EXIT 551 ENDIF 552 END DO 553 IF ( llcycle ) CYCLE 501 554 502 555 loop_prof : DO ij = 1, inpfiles(jj)%nlev 503 556 504 557 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & 505 558 & CYCLE 506 507 IF ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 508 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 509 510 llvalprof = .TRUE. 511 EXIT loop_prof 512 513 ENDIF 514 515 IF ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 516 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 517 518 llvalprof = .TRUE. 519 EXIT loop_prof 520 521 ENDIF 522 559 560 DO jvar = 1, kvars 561 IF ( .NOT. BTEST(inpfiles(jj)%ivlqc(ij,ji,jvar),2) .AND. & 562 & .NOT. BTEST(inpfiles(jj)%idqc(ij,ji),2) ) THEN 563 564 llvalprof = .TRUE. 565 EXIT loop_prof 566 567 ENDIF 568 END DO 569 523 570 END DO loop_prof 524 571 525 572 ! Set profile information 526 573 527 574 IF ( llvalprof ) THEN 528 575 529 576 iprof = iprof + 1 530 577 … … 545 592 profdata%nhou(iprof) = ihou 546 593 profdata%nmin(iprof) = imin 547 594 548 595 ! Profile space coordinates 549 596 profdata%rlam(iprof) = inpfiles(jj)%plam(ji) … … 551 598 552 599 ! Coordinate search parameters 553 profdata%mi (iprof,:) = inpfiles(jj)%iobsi(ji,1) 554 profdata%mj (iprof,:) = inpfiles(jj)%iobsj(ji,1) 555 600 DO jvar = 1, kvars 601 profdata%mi (iprof,jvar) = inpfiles(jj)%iobsi(ji,jvar) 602 profdata%mj (iprof,jvar) = inpfiles(jj)%iobsj(ji,jvar) 603 END DO 604 556 605 ! Profile WMO number 557 606 profdata%cwmo(iprof) = inpfiles(jj)%cdwmo(ji) 558 607 559 608 ! Instrument type 560 609 READ( inpfiles(jj)%cdtyp(ji), '(I4)', IOSTAT = ios, ERR = 901 ) itype … … 564 613 itype = 0 565 614 ENDIF 566 615 567 616 profdata%ntyp(iprof) = itype 568 617 569 618 ! QC stuff 570 619 … … 585 634 profdata%nqc(iprof) = 0 !TODO 586 635 587 loop_p : DO ij = 1, inpfiles(jj)%nlev 588 636 loop_p : DO ij = 1, inpfiles(jj)%nlev 637 589 638 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & 590 639 & CYCLE … … 592 641 IF (ldsatt) THEN 593 642 594 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 595 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 596 & ldt3d ) .OR. & 597 & ( ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 598 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 599 & lds3d ) ) THEN 600 ip3dt = ip3dt + 1 601 ELSE 602 CYCLE 643 DO jvar = 1, kvars 644 IF ( ( .NOT. BTEST(inpfiles(jj)%ivlqc(ij,ji,jvar),2) .AND. & 645 & .NOT. BTEST(inpfiles(jj)%idqc(ij,ji),2) .AND. & 646 & ldvar(jvar) ) ) THEN 647 ip3dt = ip3dt + 1 648 EXIT 649 ELSE IF ( jvar == kvars ) THEN 650 CYCLE loop_p 651 ENDIF 652 END DO 653 654 ENDIF 655 656 DO jvar = 1, kvars 657 658 IF ( ( .NOT. BTEST(inpfiles(jj)%ivlqc(ij,ji,jvar),2) .AND. & 659 & .NOT. BTEST(inpfiles(jj)%idqc(ij,ji),2) .AND. & 660 & ldvar(jvar) ) .OR. ldsatt ) THEN 661 662 IF (ldsatt) THEN 663 664 ivart(jvar) = ip3dt 665 666 ELSE 667 668 ivart(jvar) = ivart(jvar) + 1 669 670 ENDIF 671 672 ! Depth of jvar observation 673 profdata%var(jvar)%vdep(ivart(jvar)) = & 674 & inpfiles(jj)%pdep(ij,ji) 675 676 ! Depth of jvar observation QC 677 profdata%var(jvar)%idqc(ivart(jvar)) = & 678 & inpfiles(jj)%idqc(ij,ji) 679 680 ! Depth of jvar observation QC flags 681 profdata%var(jvar)%idqcf(:,ivart(jvar)) = & 682 & inpfiles(jj)%idqcf(:,ij,ji) 683 684 ! Profile index 685 profdata%var(jvar)%nvpidx(ivart(jvar)) = iprof 686 687 ! Vertical index in original profile 688 profdata%var(jvar)%nvlidx(ivart(jvar)) = ij 689 690 ! Profile jvar value 691 IF ( .NOT. BTEST(inpfiles(jj)%ivlqc(ij,ji,jvar),2) .AND. & 692 & .NOT. BTEST(inpfiles(jj)%idqc(ij,ji),2) ) THEN 693 profdata%var(jvar)%vobs(ivart(jvar)) = & 694 & inpfiles(jj)%pob(ij,ji,jvar) 695 IF ( ldmod ) THEN 696 profdata%var(jvar)%vmod(ivart(jvar)) = & 697 & inpfiles(jj)%padd(ij,ji,1,jvar) 698 ENDIF 699 ! Count number of profile var1 data as function of type 700 itypvar( profdata%ntyp(iprof) + 1, jvar ) = & 701 & itypvar( profdata%ntyp(iprof) + 1, jvar ) + 1 702 ELSE 703 profdata%var(jvar)%vobs(ivart(jvar)) = fbrmdi 704 ENDIF 705 706 ! Profile jvar qc 707 profdata%var(jvar)%nvqc(ivart(jvar)) = & 708 & inpfiles(jj)%ivlqc(ij,ji,jvar) 709 710 ! Profile jvar qc flags 711 profdata%var(jvar)%nvqcf(:,ivart(jvar)) = & 712 & inpfiles(jj)%ivlqcf(:,ij,ji,jvar) 713 714 ! Profile insitu T value 715 IF ( TRIM( inpfiles(jj)%cname(jvar) ) == 'POTM' ) THEN 716 profdata%var(jvar)%vext(ivart(jvar),1) = & 717 & inpfiles(jj)%pext(ij,ji,1) 718 ENDIF 719 603 720 ENDIF 604 605 ENDIF606 607 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. &608 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. &609 & ldt3d ) .OR. ldsatt ) THEN610 611 IF (ldsatt) THEN612 613 it3dt = ip3dt614 615 ELSE616 617 it3dt = it3dt + 1618 619 ENDIF620 621 ! Depth of T observation622 profdata%var(1)%vdep(it3dt) = &623 & inpfiles(jj)%pdep(ij,ji)624 625 ! Depth of T observation QC626 profdata%var(1)%idqc(it3dt) = &627 & inpfiles(jj)%idqc(ij,ji)628 629 ! Depth of T observation QC flags630 profdata%var(1)%idqcf(:,it3dt) = &631 & inpfiles(jj)%idqcf(:,ij,ji)632 633 ! Profile index634 profdata%var(1)%nvpidx(it3dt) = iprof635 636 ! Vertical index in original profile637 profdata%var(1)%nvlidx(it3dt) = ij638 639 ! Profile potential T value640 IF ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. &641 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN642 profdata%var(1)%vobs(it3dt) = &643 & inpfiles(jj)%pob(ij,ji,1)644 IF ( ldmod ) THEN645 profdata%var(1)%vmod(it3dt) = &646 & inpfiles(jj)%padd(ij,ji,1,1)647 ENDIF648 ! Count number of profile T data as function of type649 itypt( profdata%ntyp(iprof) + 1 ) = &650 & itypt( profdata%ntyp(iprof) + 1 ) + 1651 ELSE652 profdata%var(1)%vobs(it3dt) = fbrmdi653 ENDIF654 655 ! Profile T qc656 profdata%var(1)%nvqc(it3dt) = &657 & inpfiles(jj)%ivlqc(ij,ji,1)658 659 ! Profile T qc flags660 profdata%var(1)%nvqcf(:,it3dt) = &661 & inpfiles(jj)%ivlqcf(:,ij,ji,1)662 663 ! Profile insitu T value664 profdata%var(1)%vext(it3dt,1) = &665 & inpfiles(jj)%pext(ij,ji,1)666 667 ENDIF668 721 669 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 670 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 671 & lds3d ) .OR. ldsatt ) THEN 672 673 IF (ldsatt) THEN 674 675 is3dt = ip3dt 676 677 ELSE 678 679 is3dt = is3dt + 1 680 681 ENDIF 682 683 ! Depth of S observation 684 profdata%var(2)%vdep(is3dt) = & 685 & inpfiles(jj)%pdep(ij,ji) 686 687 ! Depth of S observation QC 688 profdata%var(2)%idqc(is3dt) = & 689 & inpfiles(jj)%idqc(ij,ji) 690 691 ! Depth of S observation QC flags 692 profdata%var(2)%idqcf(:,is3dt) = & 693 & inpfiles(jj)%idqcf(:,ij,ji) 694 695 ! Profile index 696 profdata%var(2)%nvpidx(is3dt) = iprof 697 698 ! Vertical index in original profile 699 profdata%var(2)%nvlidx(is3dt) = ij 700 701 ! Profile S value 702 IF ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 703 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 704 profdata%var(2)%vobs(is3dt) = & 705 & inpfiles(jj)%pob(ij,ji,2) 706 IF ( ldmod ) THEN 707 profdata%var(2)%vmod(is3dt) = & 708 & inpfiles(jj)%padd(ij,ji,1,2) 709 ENDIF 710 ! Count number of profile S data as function of type 711 ityps( profdata%ntyp(iprof) + 1 ) = & 712 & ityps( profdata%ntyp(iprof) + 1 ) + 1 713 ELSE 714 profdata%var(2)%vobs(is3dt) = fbrmdi 715 ENDIF 716 717 ! Profile S qc 718 profdata%var(2)%nvqc(is3dt) = & 719 & inpfiles(jj)%ivlqc(ij,ji,2) 720 721 ! Profile S qc flags 722 profdata%var(2)%nvqcf(:,is3dt) = & 723 & inpfiles(jj)%ivlqcf(:,ij,ji,2) 724 725 ENDIF 726 722 END DO 723 727 724 END DO loop_p 728 725 … … 736 733 ! Sum up over processors 737 734 !----------------------------------------------------------------------- 738 739 CALL obs_mpp_sum_integer ( it3dt0, it3dtmpp ) 740 CALL obs_mpp_sum_integer ( is3dt0, is3dtmpp ) 741 CALL obs_mpp_sum_integer ( ip3dt, ip3dtmpp ) 742 743 CALL obs_mpp_sum_integers( itypt, ityptmpp, ntyp1770 + 1 ) 744 CALL obs_mpp_sum_integers( ityps, itypsmpp, ntyp1770 + 1 ) 745 735 736 DO jvar = 1, kvars 737 CALL obs_mpp_sum_integer ( ivart0(jvar), ivartmpp(jvar) ) 738 END DO 739 CALL obs_mpp_sum_integer ( ip3dt, ip3dtmpp ) 740 741 DO jvar = 1, kvars 742 CALL obs_mpp_sum_integers( itypvar(:,jvar), itypvarmpp(:,jvar), ntyp1770 + 1 ) 743 END DO 744 746 745 !----------------------------------------------------------------------- 747 746 ! Output number of observations. … … 749 748 IF(lwp) THEN 750 749 WRITE(numout,*) 751 WRITE(numout,'( 1X,A)') 'Profile data'750 WRITE(numout,'(A)') ' Profile data' 752 751 WRITE(numout,'(1X,A)') '------------' 753 752 WRITE(numout,*) 754 WRITE(numout,'(1X,A)') 'Profile T data' 755 WRITE(numout,'(1X,A)') '--------------' 756 DO ji = 0, ntyp1770 757 IF ( ityptmpp(ji+1) > 0 ) THEN 758 WRITE(numout,'(1X,A3,1X,A48,A3,I8)') ctypshort(ji), & 759 & cwmonam1770(ji)(1:52),' = ', & 760 & ityptmpp(ji+1) 761 ENDIF 753 DO jvar = 1, kvars 754 WRITE(numout,'(1X,A)') 'Profile data, '//TRIM( profdata%cvars(jvar) ) 755 WRITE(numout,'(1X,A)') '------------------------' 756 DO ji = 0, ntyp1770 757 IF ( itypvarmpp(ji+1,jvar) > 0 ) THEN 758 WRITE(numout,'(1X,A3,1X,A48,A3,I8)') ctypshort(ji), & 759 & cwmonam1770(ji)(1:52),' = ', & 760 & itypvarmpp(ji+1,jvar) 761 ENDIF 762 END DO 763 WRITE(numout,'(1X,A)') & 764 & '---------------------------------------------------------------' 765 WRITE(numout,'(1X,A55,I8)') & 766 & 'Total profile data for variable '//TRIM( profdata%cvars(jvar) )// & 767 & ' = ', ivartmpp(jvar) 768 WRITE(numout,'(1X,A)') & 769 & '---------------------------------------------------------------' 770 WRITE(numout,*) 762 771 END DO 763 WRITE(numout,'(1X,A)') & 764 & '---------------------------------------------------------------' 765 WRITE(numout,'(1X,A55,I8)') & 766 & 'Total profile T data = ',& 767 & it3dtmpp 768 WRITE(numout,'(1X,A)') & 769 & '---------------------------------------------------------------' 770 WRITE(numout,*) 771 WRITE(numout,'(1X,A)') 'Profile S data' 772 WRITE(numout,'(1X,A)') '--------------' 773 DO ji = 0, ntyp1770 774 IF ( itypsmpp(ji+1) > 0 ) THEN 775 WRITE(numout,'(1X,A3,1X,A48,A3,I8)') ctypshort(ji), & 776 & cwmonam1770(ji)(1:52),' = ', & 777 & itypsmpp(ji+1) 778 ENDIF 772 ENDIF 773 774 IF (ldsatt) THEN 775 profdata%nvprot(:) = ip3dt 776 profdata%nvprotmpp(:) = ip3dtmpp 777 ELSE 778 DO jvar = 1, kvars 779 profdata%nvprot(jvar) = ivart(jvar) 780 profdata%nvprotmpp(jvar) = ivartmpp(jvar) 779 781 END DO 780 WRITE(numout,'(1X,A)') &781 & '---------------------------------------------------------------'782 WRITE(numout,'(1X,A55,I8)') &783 & 'Total profile S data = ',&784 & is3dtmpp785 WRITE(numout,'(1X,A)') &786 & '---------------------------------------------------------------'787 WRITE(numout,*)788 ENDIF789 790 IF (ldsatt) THEN791 profdata%nvprot(1) = ip3dt792 profdata%nvprot(2) = ip3dt793 profdata%nvprotmpp(1) = ip3dtmpp794 profdata%nvprotmpp(2) = ip3dtmpp795 ELSE796 profdata%nvprot(1) = it3dt797 profdata%nvprot(2) = is3dt798 profdata%nvprotmpp(1) = it3dtmpp799 profdata%nvprotmpp(2) = is3dtmpp800 782 ENDIF 801 783 profdata%nprof = iprof … … 804 786 ! Model level search 805 787 !----------------------------------------------------------------------- 806 IF ( ldt3d ) THEN 807 CALL obs_level_search( jpk, gdept_1d, & 808 & profdata%nvprot(1), profdata%var(1)%vdep, & 809 & profdata%var(1)%mvk ) 810 ENDIF 811 IF ( lds3d ) THEN 812 CALL obs_level_search( jpk, gdept_1d, & 813 & profdata%nvprot(2), profdata%var(2)%vdep, & 814 & profdata%var(2)%mvk ) 815 ENDIF 816 788 DO jvar = 1, kvars 789 IF ( ldvar(jvar) ) THEN 790 CALL obs_level_search( jpk, gdept_1d, & 791 & profdata%nvprot(jvar), profdata%var(jvar)%vdep, & 792 & profdata%var(jvar)%mvk ) 793 ENDIF 794 END DO 795 817 796 !----------------------------------------------------------------------- 818 797 ! Set model equivalent to 99999 … … 826 805 ! Deallocate temporary data 827 806 !----------------------------------------------------------------------- 828 DEALLOCATE( ifileidx, iprofidx, zdat )807 DEALLOCATE( ifileidx, iprofidx, zdat, clvars ) 829 808 830 809 !----------------------------------------------------------------------- … … 836 815 DEALLOCATE( inpfiles ) 837 816 838 END SUBROUTINE obs_rea_pro _dri817 END SUBROUTINE obs_rea_prof 839 818 840 819 END MODULE obs_read_prof
Note: See TracChangeset
for help on using the changeset viewer.