Changeset 6225 for branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_prof.F90
- Timestamp:
- 2016-01-08T10:35:19+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_prof.F90
r4292 r6225 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 & ldvar1, ldvar2, 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, INTENT(IN) :: ldvar1 ! Observed variables switches 77 LOGICAL, INTENT(IN) :: ldvar2 78 LOGICAL, INTENT(IN) :: ldignmis ! Ignore missing files 79 LOGICAL, INTENT(IN) :: ldsatt ! Compute salinity at all temperature points 80 LOGICAL, INTENT(IN) :: ldmod ! Initialize model from input data 81 REAL(dp), INTENT(IN) :: ddobsini ! Obs. ini time in YYYYMMDD.HHMMSS 82 REAL(dp), INTENT(IN) :: ddobsend ! Obs. end time in YYYYMMDD.HHMMSS 87 83 INTEGER, DIMENSION(imaxavtypes), OPTIONAL :: & 88 & kdailyavtypes 84 & kdailyavtypes ! Types of daily average observations 89 85 90 86 !! * Local declarations 91 CHARACTER(LEN=15), PARAMETER :: cpname='obs_rea_pro_dri' 87 CHARACTER(LEN=15), PARAMETER :: cpname='obs_rea_prof' 88 CHARACTER(len=8) :: clrefdate 89 CHARACTER(len=6), DIMENSION(:), ALLOCATABLE :: clvars 92 90 INTEGER :: jvar 93 91 INTEGER :: ji … … 105 103 INTEGER :: imin 106 104 INTEGER :: isec 105 INTEGER :: iprof 106 INTEGER :: iproftot 107 INTEGER :: ivar1t0 108 INTEGER :: ivar2t0 109 INTEGER :: ivar1t 110 INTEGER :: ivar2t 111 INTEGER :: ip3dt 112 INTEGER :: ios 113 INTEGER :: ioserrcount 114 INTEGER :: ivar1tmpp 115 INTEGER :: ivar2tmpp 116 INTEGER :: ip3dtmpp 117 INTEGER :: itype 107 118 INTEGER, DIMENSION(knumfiles) :: & 108 119 & irefdate 109 120 INTEGER, DIMENSION(ntyp1770+1) :: & 110 & itypt, & 111 & ityptmpp, & 112 & ityps, & 113 & itypsmpp 114 INTEGER :: it3dtmpp 115 INTEGER :: is3dtmpp 116 INTEGER :: ip3dtmpp 121 & itypvar1, & 122 & itypvar1mpp, & 123 & itypvar2, & 124 & itypvar2mpp 117 125 INTEGER, DIMENSION(:), ALLOCATABLE :: & 118 & iobsi, & 119 & iobsj, & 120 & iproc, & 126 & iobsi1, & 127 & iobsj1, & 128 & iproc1, & 129 & iobsi2, & 130 & iobsj2, & 131 & iproc2, & 121 132 & iindx, & 122 133 & ifileidx, & 123 134 & iprofidx 124 INTEGER :: itype125 135 INTEGER, DIMENSION(imaxavtypes) :: & 126 136 & idailyavtypes 137 INTEGER, DIMENSION(kvars) :: & 138 & iv3dt 127 139 REAL(wp), DIMENSION(:), ALLOCATABLE :: & 128 140 & zphi, & 129 141 & zlam 130 REAL( dp), DIMENSION(:), ALLOCATABLE :: &142 REAL(wp), DIMENSION(:), ALLOCATABLE :: & 131 143 & zdat 144 REAL(wp), DIMENSION(knumfiles) :: & 145 & djulini, & 146 & djulend 132 147 LOGICAL :: llvalprof 148 LOGICAL :: lldavtimset 133 149 TYPE(obfbdata), POINTER, DIMENSION(:) :: & 134 150 & inpfiles 135 REAL(dp), 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, DIMENSION(kvars) :: & 146 & iv3dt 147 CHARACTER(len=8) :: cl_refdate 148 151 149 152 ! Local initialization 150 153 iprof = 0 151 i t3dt0 = 0152 i s3dt0 = 0154 ivar1t0 = 0 155 ivar2t0 = 0 153 156 ip3dt = 0 154 157 155 158 ! Daily average types 159 lldavtimset = .FALSE. 156 160 IF ( PRESENT(kdailyavtypes) ) THEN 157 161 idailyavtypes(:) = kdailyavtypes(:) 162 IF ( ANY (idailyavtypes(:) /= -1) ) lldavtimset = .TRUE. 158 163 ELSE 159 164 idailyavtypes(:) = -1 … … 161 166 162 167 !----------------------------------------------------------------------- 163 ! Check data the model part is just with feedback data files164 !-----------------------------------------------------------------------165 IF ( ldmod .AND. ( kformat /= 0 ) ) THEN166 CALL ctl_stop( 'Model can only be read from feedback data' )167 RETURN168 ENDIF169 170 !-----------------------------------------------------------------------171 168 ! Count the number of files needed and allocate the obfbdata type 172 169 !----------------------------------------------------------------------- 173 170 174 171 inobf = knumfiles 175 172 176 173 ALLOCATE( inpfiles(inobf) ) 177 174 178 175 prof_files : DO jj = 1, inobf 179 176 180 177 !--------------------------------------------------------------------- 181 178 ! Prints … … 184 181 WRITE(numout,*) 185 182 WRITE(numout,*) ' obs_rea_pro_dri : Reading from file = ', & 186 & TRIM( TRIM( c filenames(jj) ) )183 & TRIM( TRIM( cdfilenames(jj) ) ) 187 184 WRITE(numout,*) ' ~~~~~~~~~~~~~~~' 188 185 WRITE(numout,*) … … 192 189 ! Initialization: Open file and get dimensions only 193 190 !--------------------------------------------------------------------- 194 195 iflag = nf90_open( TRIM( TRIM( cfilenames(jj)) ), nf90_nowrite, &191 192 iflag = nf90_open( TRIM( cdfilenames(jj) ), nf90_nowrite, & 196 193 & i_file_id ) 197 194 198 195 IF ( iflag /= nf90_noerr ) THEN 199 196 200 197 IF ( ldignmis ) THEN 201 198 inpfiles(jj)%nobs = 0 202 CALL ctl_warn( 'File ' // TRIM( TRIM( cfilenames(jj)) ) // &199 CALL ctl_warn( 'File ' // TRIM( cdfilenames(jj) ) // & 203 200 & ' not found' ) 204 201 ELSE 205 CALL ctl_stop( 'File ' // TRIM( TRIM( cfilenames(jj)) ) // &202 CALL ctl_stop( 'File ' // TRIM( cdfilenames(jj) ) // & 206 203 & ' not found' ) 207 204 ENDIF 208 205 209 206 ELSE 210 207 211 208 !------------------------------------------------------------------ 212 ! Close the file since it is opened in read_ proffile209 ! Close the file since it is opened in read_obfbdata 213 210 !------------------------------------------------------------------ 214 211 215 212 iflag = nf90_close( i_file_id ) 216 213 … … 218 215 ! Read the profile file into inpfiles 219 216 !------------------------------------------------------------------ 220 IF ( kformat == 0 ) THEN 221 CALL init_obfbdata( inpfiles(jj) ) 222 IF(lwp) THEN 223 WRITE(numout,*) 224 WRITE(numout,*)'Reading from feedback file :', & 225 & TRIM( cfilenames(jj) ) 226 ENDIF 227 CALL read_obfbdata( TRIM( cfilenames(jj) ), inpfiles(jj), & 228 & ldgrid = .TRUE. ) 229 IF ( inpfiles(jj)%nvar < 2 ) THEN 230 CALL ctl_stop( 'Feedback format error' ) 231 RETURN 232 ENDIF 233 IF ( TRIM(inpfiles(jj)%cname(1)) /= 'POTM' ) THEN 234 CALL ctl_stop( 'Feedback format error' ) 235 RETURN 236 ENDIF 237 IF ( TRIM(inpfiles(jj)%cname(2)) /= 'PSAL' ) THEN 238 CALL ctl_stop( 'Feedback format error' ) 239 RETURN 240 ENDIF 241 IF ( ldmod .AND. ( inpfiles(jj)%nadd == 0 ) ) THEN 242 CALL ctl_stop( 'Model not in input data' ) 243 RETURN 244 ENDIF 245 ELSEIF ( kformat == 1 ) THEN 246 CALL read_enactfile( TRIM( cfilenames(jj) ), inpfiles(jj), & 247 & numout, lwp, .TRUE. ) 248 ELSEIF ( kformat == 2 ) THEN 249 CALL read_coriofile( TRIM( cfilenames(jj) ), inpfiles(jj), & 250 & numout, lwp, .TRUE. ) 217 CALL init_obfbdata( inpfiles(jj) ) 218 CALL read_obfbdata( TRIM( cdfilenames(jj) ), inpfiles(jj), & 219 & ldgrid = .TRUE. ) 220 221 IF ( inpfiles(jj)%nvar < 2 ) THEN 222 CALL ctl_stop( 'Feedback format error: ', & 223 & ' less than 2 vars in profile file' ) 224 ENDIF 225 226 IF ( ldmod .AND. ( inpfiles(jj)%nadd == 0 ) ) THEN 227 CALL ctl_stop( 'Model not in input data' ) 228 ENDIF 229 230 IF ( jj == 1 ) THEN 231 ALLOCATE( clvars( inpfiles(jj)%nvar ) ) 232 DO ji = 1, inpfiles(jj)%nvar 233 clvars(ji) = inpfiles(jj)%cname(ji) 234 END DO 251 235 ELSE 252 CALL ctl_stop( 'File format unknown' ) 253 ENDIF 254 236 DO ji = 1, inpfiles(jj)%nvar 237 IF ( inpfiles(jj)%cname(ji) /= clvars(ji) ) THEN 238 CALL ctl_stop( 'Feedback file variables not consistent', & 239 & ' with previous files for this type' ) 240 ENDIF 241 END DO 242 ENDIF 243 255 244 !------------------------------------------------------------------ 256 245 ! Change longitude (-180,180) … … 270 259 ! Calculate the date (change eventually) 271 260 !------------------------------------------------------------------ 272 cl _refdate=inpfiles(jj)%cdjuldref(1:8)273 READ(cl _refdate,'(I8)') irefdate(jj)274 261 clrefdate=inpfiles(jj)%cdjuldref(1:8) 262 READ(clrefdate,'(I8)') irefdate(jj) 263 275 264 CALL ddatetoymdhms( ddobsini, iyea, imon, iday, ihou, imin, isec ) 276 265 CALL greg2jul( isec, imin, ihou, iday, imon, iyea, djulini(jj), & … … 280 269 & krefdate = irefdate(jj) ) 281 270 282 IF ( ldavtimset ) THEN 271 ioserrcount=0 272 IF ( lldavtimset ) THEN 273 274 IF ( ANY ( idailyavtypes(:) /= -1 ) .AND. lwp) THEN 275 WRITE(numout,*)' Resetting time of daily averaged', & 276 & ' observations to the end of the day' 277 ENDIF 278 283 279 DO ji = 1, inpfiles(jj)%nobs 284 ! 285 ! for daily averaged data for example 286 ! MRB data (itype==820) force the time 287 ! to be the end of the day 288 ! 289 READ( inpfiles(jj)%cdtyp(ji), '(I4)' ) itype 290 IF ( ANY (idailyavtypes == itype ) ) THEN 291 inpfiles(jj)%ptim(ji) = & 292 & INT(inpfiles(jj)%ptim(ji)) + 1 293 ENDIF 280 READ( inpfiles(jj)%cdtyp(ji), '(I4)', IOSTAT = ios, ERR = 900 ) itype 281 900 IF ( ios /= 0 ) THEN 282 ! Set type to zero if there is a problem in the string conversion 283 itype = 0 284 ENDIF 285 286 IF ( ANY ( idailyavtypes(:) == itype ) ) THEN 287 ! for daily averaged data force the time 288 ! to be the last time-step of the day, but still within the day. 289 IF ( inpfiles(jj)%ptim(ji) >= 0. ) THEN 290 inpfiles(jj)%ptim(ji) = & 291 & INT(inpfiles(jj)%ptim(ji)) + 0.9999 292 ELSE 293 inpfiles(jj)%ptim(ji) = & 294 & INT(inpfiles(jj)%ptim(ji)) - 0.0001 295 ENDIF 296 ENDIF 297 294 298 END DO 295 ENDIF 296 299 300 ENDIF 301 297 302 IF ( inpfiles(jj)%nobs > 0 ) THEN 298 inpfiles(jj)%iproc = -1299 inpfiles(jj)%iobsi = -1300 inpfiles(jj)%iobsj = -1303 inpfiles(jj)%iproc(:,:) = -1 304 inpfiles(jj)%iobsi(:,:) = -1 305 inpfiles(jj)%iobsj(:,:) = -1 301 306 ENDIF 302 307 inowin = 0 … … 312 317 ALLOCATE( zlam(inowin) ) 313 318 ALLOCATE( zphi(inowin) ) 314 ALLOCATE( iobsi(inowin) ) 315 ALLOCATE( iobsj(inowin) ) 316 ALLOCATE( iproc(inowin) ) 319 ALLOCATE( iobsi1(inowin) ) 320 ALLOCATE( iobsj1(inowin) ) 321 ALLOCATE( iproc1(inowin) ) 322 ALLOCATE( iobsi2(inowin) ) 323 ALLOCATE( iobsj2(inowin) ) 324 ALLOCATE( iproc2(inowin) ) 317 325 inowin = 0 318 326 DO ji = 1, inpfiles(jj)%nobs … … 328 336 END DO 329 337 330 CALL obs_grid_search( inowin, zlam, zphi, iobsi, iobsj, iproc, 'T' ) 338 IF ( TRIM( inpfiles(jj)%cname(1) ) == 'POTM' ) THEN 339 CALL obs_grid_search( inowin, zlam, zphi, iobsi1, iobsj1, & 340 & iproc1, 'T' ) 341 iobsi2(:) = iobsi1(:) 342 iobsj2(:) = iobsj1(:) 343 iproc2(:) = iproc1(:) 344 ELSEIF ( TRIM( inpfiles(jj)%cname(1) ) == 'UVEL' ) THEN 345 CALL obs_grid_search( inowin, zlam, zphi, iobsi1, iobsj1, & 346 & iproc1, 'U' ) 347 CALL obs_grid_search( inowin, zlam, zphi, iobsi2, iobsj2, & 348 & iproc2, 'V' ) 349 ENDIF 331 350 332 351 inowin = 0 … … 338 357 & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN 339 358 inowin = inowin + 1 340 inpfiles(jj)%iproc(ji,1) = iproc(inowin) 341 inpfiles(jj)%iobsi(ji,1) = iobsi(inowin) 342 inpfiles(jj)%iobsj(ji,1) = iobsj(inowin) 359 inpfiles(jj)%iproc(ji,1) = iproc1(inowin) 360 inpfiles(jj)%iobsi(ji,1) = iobsi1(inowin) 361 inpfiles(jj)%iobsj(ji,1) = iobsj1(inowin) 362 inpfiles(jj)%iproc(ji,2) = iproc2(inowin) 363 inpfiles(jj)%iobsi(ji,2) = iobsi2(inowin) 364 inpfiles(jj)%iobsj(ji,2) = iobsj2(inowin) 365 IF ( inpfiles(jj)%iproc(ji,1) /= & 366 & inpfiles(jj)%iproc(ji,2) ) THEN 367 CALL ctl_stop( 'Error in obs_read_prof:', & 368 & 'var1 and var2 observation on different processors') 369 ENDIF 343 370 ENDIF 344 371 END DO 345 DEALLOCATE( zlam, zphi, iobsi , iobsj, iproc)372 DEALLOCATE( zlam, zphi, iobsi1, iobsj1, iproc1, iobsi2, iobsj2, iproc2 ) 346 373 347 374 DO ji = 1, inpfiles(jj)%nobs … … 357 384 ENDIF 358 385 llvalprof = .FALSE. 359 IF ( ld t3d) THEN386 IF ( ldvar1 ) THEN 360 387 loop_t_count : DO ij = 1,inpfiles(jj)%nlev 361 388 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & … … 363 390 IF ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 364 391 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 365 i t3dt0 = it3dt0 + 1392 ivar1t0 = ivar1t0 + 1 366 393 ENDIF 367 394 END DO loop_t_count 368 395 ENDIF 369 IF ( ld s3d) THEN396 IF ( ldvar2 ) THEN 370 397 loop_s_count : DO ij = 1,inpfiles(jj)%nlev 371 398 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & … … 373 400 IF ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 374 401 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 375 i s3dt0 = is3dt0 + 1402 ivar2t0 = ivar2t0 + 1 376 403 ENDIF 377 404 END DO loop_s_count … … 382 409 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 383 410 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 384 & ld t3d) .OR. &411 & ldvar1 ) .OR. & 385 412 & ( ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 386 413 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 387 & ld s3d) ) THEN414 & ldvar2 ) ) THEN 388 415 ip3dt = ip3dt + 1 389 416 llvalprof = .TRUE. … … 399 426 400 427 END DO prof_files 401 428 402 429 !----------------------------------------------------------------------- 403 430 ! Get the time ordered indices of the input data … … 440 467 & zdat, & 441 468 & iindx ) 442 469 443 470 iv3dt(:) = -1 444 471 IF (ldsatt) THEN … … 446 473 iv3dt(2) = ip3dt 447 474 ELSE 448 iv3dt(1) = i t3dt0449 iv3dt(2) = i s3dt0475 iv3dt(1) = ivar1t0 476 iv3dt(2) = ivar2t0 450 477 ENDIF 451 478 CALL obs_prof_alloc( profdata, kvars, kextr, iprof, iv3dt, & 452 479 & kstp, jpi, jpj, jpk ) 453 480 454 481 ! * Read obs/positions, QC, all variable and assign to profdata 455 482 456 483 profdata%nprof = 0 457 484 profdata%nvprot(:) = 0 458 485 profdata%cvars(:) = clvars(:) 459 486 iprof = 0 460 487 461 488 ip3dt = 0 462 i t3dt = 0463 i s3dt = 0464 ityp t(:) = 0465 ityp tmpp(:) = 0466 467 ityp s(:) = 0468 ityp smpp(:) = 0469 470 489 ivar1t = 0 490 ivar2t = 0 491 itypvar1 (:) = 0 492 itypvar1mpp(:) = 0 493 494 itypvar2 (:) = 0 495 itypvar2mpp(:) = 0 496 497 ioserrcount = 0 471 498 DO jk = 1, iproftot 472 499 473 500 jj = ifileidx(iindx(jk)) 474 501 ji = iprofidx(iindx(jk)) … … 480 507 IF ( ( inpfiles(jj)%ptim(ji) > djulini(jj) ) .AND. & 481 508 & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN 482 509 483 510 IF ( nproc == 0 ) THEN 484 511 IF ( inpfiles(jj)%iproc(ji,1) > nproc ) CYCLE … … 486 513 IF ( inpfiles(jj)%iproc(ji,1) /= nproc ) CYCLE 487 514 ENDIF 488 515 489 516 llvalprof = .FALSE. 490 517 … … 495 522 496 523 loop_prof : DO ij = 1, inpfiles(jj)%nlev 497 524 498 525 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & 499 526 & CYCLE 500 527 501 528 IF ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 502 529 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 503 530 504 531 llvalprof = .TRUE. 505 532 EXIT loop_prof 506 533 507 534 ENDIF 508 535 509 536 IF ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 510 537 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 511 538 512 539 llvalprof = .TRUE. 513 540 EXIT loop_prof 514 541 515 542 ENDIF 516 543 517 544 END DO loop_prof 518 545 519 546 ! Set profile information 520 547 521 548 IF ( llvalprof ) THEN 522 549 523 550 iprof = iprof + 1 524 551 … … 539 566 profdata%nhou(iprof) = ihou 540 567 profdata%nmin(iprof) = imin 541 568 542 569 ! Profile space coordinates 543 570 profdata%rlam(iprof) = inpfiles(jj)%plam(ji) … … 545 572 546 573 ! Coordinate search parameters 547 profdata%mi (iprof,:) = inpfiles(jj)%iobsi(ji,1) 548 profdata%mj (iprof,:) = inpfiles(jj)%iobsj(ji,1) 549 574 profdata%mi (iprof,1) = inpfiles(jj)%iobsi(ji,1) 575 profdata%mj (iprof,1) = inpfiles(jj)%iobsj(ji,1) 576 profdata%mi (iprof,2) = inpfiles(jj)%iobsi(ji,2) 577 profdata%mj (iprof,2) = inpfiles(jj)%iobsj(ji,2) 578 550 579 ! Profile WMO number 551 580 profdata%cwmo(iprof) = inpfiles(jj)%cdwmo(ji) 552 581 553 582 ! Instrument type 554 READ( inpfiles(jj)%cdtyp(ji), '(I4)' ) itype 583 READ( inpfiles(jj)%cdtyp(ji), '(I4)', IOSTAT = ios, ERR = 901 ) itype 584 901 IF ( ios /= 0 ) THEN 585 IF (ioserrcount == 0) CALL ctl_warn ( 'Problem converting an instrument type to integer. Setting type to zero' ) 586 ioserrcount = ioserrcount + 1 587 itype = 0 588 ENDIF 589 555 590 profdata%ntyp(iprof) = itype 556 591 557 592 ! QC stuff 558 593 … … 573 608 profdata%nqc(iprof) = 0 !TODO 574 609 575 loop_p : DO ij = 1, inpfiles(jj)%nlev 576 610 loop_p : DO ij = 1, inpfiles(jj)%nlev 611 577 612 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & 578 613 & CYCLE … … 582 617 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 583 618 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 584 & ld t3d) .OR. &619 & ldvar1 ) .OR. & 585 620 & ( ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 586 621 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 587 & ld s3d) ) THEN622 & ldvar2 ) ) THEN 588 623 ip3dt = ip3dt + 1 589 624 ELSE 590 625 CYCLE 591 626 ENDIF 592 627 593 628 ENDIF 594 629 595 630 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 596 631 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 597 & ld t3d) .OR. ldsatt ) THEN598 632 & ldvar1 ) .OR. ldsatt ) THEN 633 599 634 IF (ldsatt) THEN 600 635 601 i t3dt = ip3dt636 ivar1t = ip3dt 602 637 603 638 ELSE 604 639 605 i t3dt = it3dt + 1606 640 ivar1t = ivar1t + 1 641 607 642 ENDIF 608 643 609 ! Depth of Tobservation610 profdata%var(1)%vdep(i t3dt) = &644 ! Depth of var1 observation 645 profdata%var(1)%vdep(ivar1t) = & 611 646 & inpfiles(jj)%pdep(ij,ji) 612 613 ! Depth of Tobservation QC614 profdata%var(1)%idqc(i t3dt) = &647 648 ! Depth of var1 observation QC 649 profdata%var(1)%idqc(ivar1t) = & 615 650 & inpfiles(jj)%idqc(ij,ji) 616 617 ! Depth of Tobservation QC flags618 profdata%var(1)%idqcf(:,i t3dt) = &651 652 ! Depth of var1 observation QC flags 653 profdata%var(1)%idqcf(:,ivar1t) = & 619 654 & inpfiles(jj)%idqcf(:,ij,ji) 620 655 621 656 ! Profile index 622 profdata%var(1)%nvpidx(i t3dt) = iprof623 657 profdata%var(1)%nvpidx(ivar1t) = iprof 658 624 659 ! Vertical index in original profile 625 profdata%var(1)%nvlidx(i t3dt) = ij626 627 ! Profile potential Tvalue660 profdata%var(1)%nvlidx(ivar1t) = ij 661 662 ! Profile var1 value 628 663 IF ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 629 664 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 630 profdata%var(1)%vobs(i t3dt) = &665 profdata%var(1)%vobs(ivar1t) = & 631 666 & inpfiles(jj)%pob(ij,ji,1) 632 667 IF ( ldmod ) THEN 633 profdata%var(1)%vmod(i t3dt) = &668 profdata%var(1)%vmod(ivar1t) = & 634 669 & inpfiles(jj)%padd(ij,ji,1,1) 635 670 ENDIF 636 ! Count number of profile Tdata as function of type637 ityp t( profdata%ntyp(iprof) + 1 ) = &638 & ityp t( profdata%ntyp(iprof) + 1 ) + 1671 ! Count number of profile var1 data as function of type 672 itypvar1( profdata%ntyp(iprof) + 1 ) = & 673 & itypvar1( profdata%ntyp(iprof) + 1 ) + 1 639 674 ELSE 640 profdata%var(1)%vobs(i t3dt) = fbrmdi675 profdata%var(1)%vobs(ivar1t) = fbrmdi 641 676 ENDIF 642 677 643 ! Profile Tqc644 profdata%var(1)%nvqc(i t3dt) = &678 ! Profile var1 qc 679 profdata%var(1)%nvqc(ivar1t) = & 645 680 & inpfiles(jj)%ivlqc(ij,ji,1) 646 681 647 ! Profile Tqc flags648 profdata%var(1)%nvqcf(:,i t3dt) = &682 ! Profile var1 qc flags 683 profdata%var(1)%nvqcf(:,ivar1t) = & 649 684 & inpfiles(jj)%ivlqcf(:,ij,ji,1) 650 685 651 686 ! Profile insitu T value 652 profdata%var(1)%vext(it3dt,1) = & 653 & inpfiles(jj)%pext(ij,ji,1) 654 655 ENDIF 656 687 IF ( TRIM( inpfiles(jj)%cname(1) ) == 'POTM' ) THEN 688 profdata%var(1)%vext(ivar1t,1) = & 689 & inpfiles(jj)%pext(ij,ji,1) 690 ENDIF 691 692 ENDIF 693 657 694 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 658 695 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 659 & ld s3d) .OR. ldsatt ) THEN660 696 & ldvar2 ) .OR. ldsatt ) THEN 697 661 698 IF (ldsatt) THEN 662 699 663 i s3dt = ip3dt700 ivar2t = ip3dt 664 701 665 702 ELSE 666 703 667 i s3dt = is3dt + 1668 704 ivar2t = ivar2t + 1 705 669 706 ENDIF 670 707 671 ! Depth of Sobservation672 profdata%var(2)%vdep(i s3dt) = &708 ! Depth of var2 observation 709 profdata%var(2)%vdep(ivar2t) = & 673 710 & inpfiles(jj)%pdep(ij,ji) 674 675 ! Depth of Sobservation QC676 profdata%var(2)%idqc(i s3dt) = &711 712 ! Depth of var2 observation QC 713 profdata%var(2)%idqc(ivar2t) = & 677 714 & inpfiles(jj)%idqc(ij,ji) 678 679 ! Depth of Sobservation QC flags680 profdata%var(2)%idqcf(:,i s3dt) = &715 716 ! Depth of var2 observation QC flags 717 profdata%var(2)%idqcf(:,ivar2t) = & 681 718 & inpfiles(jj)%idqcf(:,ij,ji) 682 719 683 720 ! Profile index 684 profdata%var(2)%nvpidx(i s3dt) = iprof685 721 profdata%var(2)%nvpidx(ivar2t) = iprof 722 686 723 ! Vertical index in original profile 687 profdata%var(2)%nvlidx(i s3dt) = ij688 689 ! Profile Svalue724 profdata%var(2)%nvlidx(ivar2t) = ij 725 726 ! Profile var2 value 690 727 IF ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 691 728 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 692 profdata%var(2)%vobs(i s3dt) = &729 profdata%var(2)%vobs(ivar2t) = & 693 730 & inpfiles(jj)%pob(ij,ji,2) 694 731 IF ( ldmod ) THEN 695 profdata%var(2)%vmod(i s3dt) = &732 profdata%var(2)%vmod(ivar2t) = & 696 733 & inpfiles(jj)%padd(ij,ji,1,2) 697 734 ENDIF 698 ! Count number of profile Sdata as function of type699 ityp s( profdata%ntyp(iprof) + 1 ) = &700 & ityp s( profdata%ntyp(iprof) + 1 ) + 1735 ! Count number of profile var2 data as function of type 736 itypvar2( profdata%ntyp(iprof) + 1 ) = & 737 & itypvar2( profdata%ntyp(iprof) + 1 ) + 1 701 738 ELSE 702 profdata%var(2)%vobs(i s3dt) = fbrmdi739 profdata%var(2)%vobs(ivar2t) = fbrmdi 703 740 ENDIF 704 705 ! Profile Sqc706 profdata%var(2)%nvqc(i s3dt) = &741 742 ! Profile var2 qc 743 profdata%var(2)%nvqc(ivar2t) = & 707 744 & inpfiles(jj)%ivlqc(ij,ji,2) 708 745 709 ! Profile Sqc flags710 profdata%var(2)%nvqcf(:,i s3dt) = &746 ! Profile var2 qc flags 747 profdata%var(2)%nvqcf(:,ivar2t) = & 711 748 & inpfiles(jj)%ivlqcf(:,ij,ji,2) 712 749 713 750 ENDIF 714 751 715 752 END DO loop_p 716 753 … … 724 761 ! Sum up over processors 725 762 !----------------------------------------------------------------------- 726 727 CALL obs_mpp_sum_integer ( i t3dt0, it3dtmpp )728 CALL obs_mpp_sum_integer ( i s3dt0, is3dtmpp )729 CALL obs_mpp_sum_integer ( ip3dt, ip3dtmpp)730 731 CALL obs_mpp_sum_integers( ityp t, ityptmpp, ntyp1770 + 1 )732 CALL obs_mpp_sum_integers( ityp s, itypsmpp, ntyp1770 + 1 )733 763 764 CALL obs_mpp_sum_integer ( ivar1t0, ivar1tmpp ) 765 CALL obs_mpp_sum_integer ( ivar2t0, ivar2tmpp ) 766 CALL obs_mpp_sum_integer ( ip3dt, ip3dtmpp ) 767 768 CALL obs_mpp_sum_integers( itypvar1, itypvar1mpp, ntyp1770 + 1 ) 769 CALL obs_mpp_sum_integers( itypvar2, itypvar2mpp, ntyp1770 + 1 ) 770 734 771 !----------------------------------------------------------------------- 735 772 ! Output number of observations. … … 737 774 IF(lwp) THEN 738 775 WRITE(numout,*) 739 WRITE(numout,'( 1X,A)') 'Profile data'776 WRITE(numout,'(A)') ' Profile data' 740 777 WRITE(numout,'(1X,A)') '------------' 741 778 WRITE(numout,*) 742 WRITE(numout,'(1X,A)') 'Profile T data'743 WRITE(numout,'(1X,A)') '-------------- '779 WRITE(numout,'(1X,A)') 'Profile data, '//TRIM( profdata%cvars(1) ) 780 WRITE(numout,'(1X,A)') '------------------------' 744 781 DO ji = 0, ntyp1770 745 IF ( ityp tmpp(ji+1) > 0 ) THEN782 IF ( itypvar1mpp(ji+1) > 0 ) THEN 746 783 WRITE(numout,'(1X,A3,1X,A48,A3,I8)') ctypshort(ji), & 747 784 & cwmonam1770(ji)(1:52),' = ', & 748 & ityp tmpp(ji+1)785 & itypvar1mpp(ji+1) 749 786 ENDIF 750 787 END DO … … 752 789 & '---------------------------------------------------------------' 753 790 WRITE(numout,'(1X,A55,I8)') & 754 & 'Total profile T data = ',&755 & it3dtmpp791 & 'Total profile data for variable '//TRIM( profdata%cvars(1) )// & 792 & ' = ', ivar1tmpp 756 793 WRITE(numout,'(1X,A)') & 757 794 & '---------------------------------------------------------------' 758 795 WRITE(numout,*) 759 WRITE(numout,'(1X,A)') 'Profile S data'760 WRITE(numout,'(1X,A)') '-------------- '796 WRITE(numout,'(1X,A)') 'Profile data, '//TRIM( profdata%cvars(2) ) 797 WRITE(numout,'(1X,A)') '------------------------' 761 798 DO ji = 0, ntyp1770 762 IF ( ityp smpp(ji+1) > 0 ) THEN799 IF ( itypvar2mpp(ji+1) > 0 ) THEN 763 800 WRITE(numout,'(1X,A3,1X,A48,A3,I8)') ctypshort(ji), & 764 801 & cwmonam1770(ji)(1:52),' = ', & 765 & ityp smpp(ji+1)802 & itypvar2mpp(ji+1) 766 803 ENDIF 767 804 END DO … … 769 806 & '---------------------------------------------------------------' 770 807 WRITE(numout,'(1X,A55,I8)') & 771 & 'Total profile S data = ',&772 & is3dtmpp808 & 'Total profile data for variable '//TRIM( profdata%cvars(2) )// & 809 & ' = ', ivar2tmpp 773 810 WRITE(numout,'(1X,A)') & 774 811 & '---------------------------------------------------------------' 775 812 WRITE(numout,*) 776 813 ENDIF 777 814 778 815 IF (ldsatt) THEN 779 816 profdata%nvprot(1) = ip3dt … … 782 819 profdata%nvprotmpp(2) = ip3dtmpp 783 820 ELSE 784 profdata%nvprot(1) = i t3dt785 profdata%nvprot(2) = i s3dt786 profdata%nvprotmpp(1) = i t3dtmpp787 profdata%nvprotmpp(2) = i s3dtmpp821 profdata%nvprot(1) = ivar1t 822 profdata%nvprot(2) = ivar2t 823 profdata%nvprotmpp(1) = ivar1tmpp 824 profdata%nvprotmpp(2) = ivar2tmpp 788 825 ENDIF 789 826 profdata%nprof = iprof … … 792 829 ! Model level search 793 830 !----------------------------------------------------------------------- 794 IF ( ld t3d) THEN831 IF ( ldvar1 ) THEN 795 832 CALL obs_level_search( jpk, gdept_1d, & 796 833 & profdata%nvprot(1), profdata%var(1)%vdep, & 797 834 & profdata%var(1)%mvk ) 798 835 ENDIF 799 IF ( ld s3d) THEN836 IF ( ldvar2 ) THEN 800 837 CALL obs_level_search( jpk, gdept_1d, & 801 838 & profdata%nvprot(2), profdata%var(2)%vdep, & 802 839 & profdata%var(2)%mvk ) 803 840 ENDIF 804 841 805 842 !----------------------------------------------------------------------- 806 843 ! Set model equivalent to 99999 … … 814 851 ! Deallocate temporary data 815 852 !----------------------------------------------------------------------- 816 DEALLOCATE( ifileidx, iprofidx, zdat )853 DEALLOCATE( ifileidx, iprofidx, zdat, clvars ) 817 854 818 855 !----------------------------------------------------------------------- … … 824 861 DEALLOCATE( inpfiles ) 825 862 826 END SUBROUTINE obs_rea_pro _dri863 END SUBROUTINE obs_rea_prof 827 864 828 865 END MODULE obs_read_prof
Note: See TracChangeset
for help on using the changeset viewer.