Changeset 5682 for branches/2015/dev_r5072_UKMO2_OBS_simplification/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_prof.F90
- Timestamp:
- 2015-08-12T17:46:45+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_r5072_UKMO2_OBS_simplification/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_prof.F90
r5659 r5682 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 … … 42 42 43 43 CONTAINS 44 45 SUBROUTINE obs_rea_prof( profdata, knumfiles, c filenames, &44 45 SUBROUTINE obs_rea_prof( profdata, knumfiles, cdfilenames, & 46 46 & kvars, kextr, kstp, ddobsini, ddobsend, & 47 & ld t3d, lds3d, ldignmis, ldsatt, ldavtimset, &47 & ldvar1, ldvar2, ldignmis, ldsatt, & 48 48 & ldmod, kdailyavtypes ) 49 49 !!--------------------------------------------------------------------- … … 62 62 !! History : 63 63 !! ! : 2009-09 (K. Mogensen) : New merged version of old routines 64 !! ! : 2015-08 (M. Martin) : Merged profile and velocity routines 64 65 !!---------------------------------------------------------------------- 65 !! * Modules used 66 66 67 67 !! * Arguments 68 TYPE(obs_prof), INTENT(OUT) :: profdata ! Profile data to be read 69 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 70 71 CHARACTER(LEN=128), INTENT(IN) :: & 71 & c filenames(knumfiles)! File names to read in72 & cdfilenames(knumfiles) ! File names to read in 72 73 INTEGER, INTENT(IN) :: kvars ! Number of variables in profdata 73 INTEGER, INTENT(IN) :: kextr ! Number of extra fields for each var in profdata 74 INTEGER, INTENT(IN) :: kstp ! Ocean time-step index 75 LOGICAL, INTENT(IN) :: ldt3d ! Observed variables switches 76 LOGICAL, INTENT(IN) :: lds3d 77 LOGICAL, INTENT(IN) :: ldignmis ! Ignore missing files 78 LOGICAL, INTENT(IN) :: ldsatt ! Compute salinity at all temperature points 79 LOGICAL, INTENT(IN) :: ldavtimset ! Correct time for daily averaged data 80 LOGICAL, INTENT(IN) :: ldmod ! Initialize model from input data 81 REAL(KIND=dp), INTENT(IN) :: ddobsini ! Obs. ini time in YYYYMMDD.HHMMSS 82 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 83 83 INTEGER, DIMENSION(imaxavtypes), OPTIONAL :: & 84 & kdailyavtypes 84 & kdailyavtypes ! Types of daily average observations 85 85 86 86 !! * Local declarations 87 87 CHARACTER(LEN=15), PARAMETER :: cpname='obs_rea_prof' 88 CHARACTER(len=8) :: clrefdate 89 CHARACTER(len=6), DIMENSION(:), ALLOCATABLE :: clvars 88 90 INTEGER :: jvar 89 91 INTEGER :: ji … … 101 103 INTEGER :: imin 102 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 103 118 INTEGER, DIMENSION(knumfiles) :: & 104 119 & irefdate 105 120 INTEGER, DIMENSION(ntyp1770+1) :: & 106 & itypt, & 107 & ityptmpp, & 108 & ityps, & 109 & itypsmpp 110 INTEGER :: it3dtmpp 111 INTEGER :: is3dtmpp 112 INTEGER :: ip3dtmpp 121 & itypvar1, & 122 & itypvar1mpp, & 123 & itypvar2, & 124 & itypvar2mpp 113 125 INTEGER, DIMENSION(:), ALLOCATABLE :: & 114 126 & iobsi, & … … 118 130 & ifileidx, & 119 131 & iprofidx 120 INTEGER :: itype121 132 INTEGER, DIMENSION(imaxavtypes) :: & 122 133 & idailyavtypes 134 INTEGER, DIMENSION(kvars) :: & 135 & iv3dt 123 136 REAL(wp), DIMENSION(:), ALLOCATABLE :: & 124 137 & zphi, & 125 138 & zlam 126 real(wp), DIMENSION(:), ALLOCATABLE :: &139 REAL(wp), DIMENSION(:), ALLOCATABLE :: & 127 140 & zdat 141 REAL(wp), DIMENSION(knumfiles) :: & 142 & djulini, & 143 & djulend 128 144 LOGICAL :: llvalprof 145 LOGICAL :: lldavtimset 129 146 TYPE(obfbdata), POINTER, DIMENSION(:) :: & 130 147 & inpfiles 131 real(wp), DIMENSION(knumfiles) :: & 132 & djulini, & 133 & djulend 134 INTEGER :: iprof 135 INTEGER :: iproftot 136 INTEGER :: it3dt0 137 INTEGER :: is3dt0 138 INTEGER :: it3dt 139 INTEGER :: is3dt 140 INTEGER :: ip3dt 141 INTEGER :: ios 142 INTEGER :: ioserrcount 143 INTEGER, DIMENSION(kvars) :: & 144 & iv3dt 145 CHARACTER(len=8) :: cl_refdate 146 148 147 149 ! Local initialization 148 150 iprof = 0 149 i t3dt0 = 0150 i s3dt0 = 0151 ivar1t0 = 0 152 ivar2t0 = 0 151 153 ip3dt = 0 152 154 153 155 ! Daily average types 156 lldavtimset = .FALSE. 154 157 IF ( PRESENT(kdailyavtypes) ) THEN 155 158 idailyavtypes(:) = kdailyavtypes(:) 159 IF ( ANY (idailyavtypes(:) /= -1) ) lldavtimset = .TRUE. 156 160 ELSE 157 161 idailyavtypes(:) = -1 … … 159 163 160 164 !----------------------------------------------------------------------- 161 ! Check data the model part is just with feedback data files162 !-----------------------------------------------------------------------163 IF ( ldmod .AND. ( kformat /= 0 ) ) THEN164 CALL ctl_stop( 'Model can only be read from feedback data' )165 RETURN166 ENDIF167 168 !-----------------------------------------------------------------------169 165 ! Count the number of files needed and allocate the obfbdata type 170 166 !----------------------------------------------------------------------- 171 167 172 168 inobf = knumfiles 173 169 174 170 ALLOCATE( inpfiles(inobf) ) 175 171 176 172 prof_files : DO jj = 1, inobf 177 173 178 174 !--------------------------------------------------------------------- 179 175 ! Prints … … 182 178 WRITE(numout,*) 183 179 WRITE(numout,*) ' obs_rea_pro_dri : Reading from file = ', & 184 & TRIM( TRIM( c filenames(jj) ) )180 & TRIM( TRIM( cdfilenames(jj) ) ) 185 181 WRITE(numout,*) ' ~~~~~~~~~~~~~~~' 186 182 WRITE(numout,*) … … 190 186 ! Initialization: Open file and get dimensions only 191 187 !--------------------------------------------------------------------- 192 193 iflag = nf90_open( TRIM( c filenames(jj) ), nf90_nowrite, &188 189 iflag = nf90_open( TRIM( cdfilenames(jj) ), nf90_nowrite, & 194 190 & i_file_id ) 195 191 196 192 IF ( iflag /= nf90_noerr ) THEN 197 193 198 194 IF ( ldignmis ) THEN 199 195 inpfiles(jj)%nobs = 0 200 CALL ctl_warn( 'File ' // TRIM( c filenames(jj) ) // &196 CALL ctl_warn( 'File ' // TRIM( cdfilenames(jj) ) // & 201 197 & ' not found' ) 202 198 ELSE 203 CALL ctl_stop( 'File ' // TRIM( c filenames(jj) ) // &199 CALL ctl_stop( 'File ' // TRIM( cdfilenames(jj) ) // & 204 200 & ' not found' ) 205 201 ENDIF 206 202 207 203 ELSE 208 204 209 205 !------------------------------------------------------------------ 210 ! Close the file since it is opened in read_ proffile206 ! Close the file since it is opened in read_obfbdata 211 207 !------------------------------------------------------------------ 212 208 213 209 iflag = nf90_close( i_file_id ) 214 210 … … 217 213 !------------------------------------------------------------------ 218 214 CALL init_obfbdata( inpfiles(jj) ) 219 IF(lwp) THEN 220 WRITE(numout,*) 221 WRITE(numout,*)'Reading from feedback file :', & 222 & TRIM( cfilenames(jj) ) 223 ENDIF 224 CALL read_obfbdata( TRIM( cfilenames(jj) ), inpfiles(jj), & 215 CALL read_obfbdata( TRIM( cdfilenames(jj) ), inpfiles(jj), & 225 216 & ldgrid = .TRUE. ) 226 217 227 218 IF ( inpfiles(jj)%nvar < 2 ) THEN 228 CALL ctl_stop( 'Feedback format error' ) 229 RETURN 230 ENDIF 219 CALL ctl_stop( 'Feedback format error: ', & 220 & ' less than 2 vars in profile file' ) 221 ENDIF 222 231 223 IF ( ldmod .AND. ( inpfiles(jj)%nadd == 0 ) ) THEN 232 224 CALL ctl_stop( 'Model not in input data' ) 233 RETURN 234 ENDIF 235 225 ENDIF 226 227 IF ( jj == 1 ) THEN 228 ALLOCATE( clvars( inpfiles(jj)%nvar ) ) 229 DO ji = 1, inpfiles(jj)%nvar 230 clvars(ji) = inpfiles(jj)%cname(ji) 231 END DO 232 ELSE 233 DO ji = 1, inpfiles(jj)%nvar 234 IF ( inpfiles(jj)%cname(ji) /= clvars(ji) ) THEN 235 CALL ctl_stop( 'Feedback file variables not consistent', & 236 & ' with previous files for this type' ) 237 ENDIF 238 END DO 239 ENDIF 240 236 241 !------------------------------------------------------------------ 237 242 ! Change longitude (-180,180) … … 251 256 ! Calculate the date (change eventually) 252 257 !------------------------------------------------------------------ 253 cl _refdate=inpfiles(jj)%cdjuldref(1:8)254 READ(cl _refdate,'(I8)') irefdate(jj)255 258 clrefdate=inpfiles(jj)%cdjuldref(1:8) 259 READ(clrefdate,'(I8)') irefdate(jj) 260 256 261 CALL ddatetoymdhms( ddobsini, iyea, imon, iday, ihou, imin, isec ) 257 262 CALL greg2jul( isec, imin, ihou, iday, imon, iyea, djulini(jj), & … … 262 267 263 268 ioserrcount=0 264 IF ( ldavtimset ) THEN 269 IF ( lldavtimset ) THEN 270 271 IF ( ANY ( idailyavtypes(:) /= -1 ) .AND. lwp) THEN 272 WRITE(numout,*)' Resetting time of daily averaged', & 273 & ' observations to the end of the day' 274 ENDIF 275 265 276 DO ji = 1, inpfiles(jj)%nobs 266 !267 ! for daily averaged data for example268 ! MRB data (itype==820) force the time269 ! to be the end of the day270 !271 277 READ( inpfiles(jj)%cdtyp(ji), '(I4)', IOSTAT = ios, ERR = 900 ) itype 272 278 900 IF ( ios /= 0 ) THEN 273 itype = 0 ! Set type to zero if there is a problem in the string conversion 279 ! Set type to zero if there is a problem in the string conversion 280 itype = 0 274 281 ENDIF 275 IF ( ANY (idailyavtypes == itype ) ) THEN 276 inpfiles(jj)%ptim(ji) = & 277 & INT(inpfiles(jj)%ptim(ji)) + 1 282 283 IF ( ANY ( idailyavtypes(:) == itype ) ) THEN 284 ! for daily averaged data force the time 285 ! to be the last time-step of the day, but still within the day. 286 IF ( inpfiles(jj)%ptim(ji) >= 0. ) THEN 287 inpfiles(jj)%ptim(ji) = & 288 & INT(inpfiles(jj)%ptim(ji)) + 0.9999 289 ELSE 290 inpfiles(jj)%ptim(ji) = & 291 & INT(inpfiles(jj)%ptim(ji)) - 0.0001 292 ENDIF 278 293 ENDIF 294 279 295 END DO 280 ENDIF 281 296 297 ENDIF 298 282 299 IF ( inpfiles(jj)%nobs > 0 ) THEN 283 300 inpfiles(jj)%iproc = -1 … … 342 359 ENDIF 343 360 llvalprof = .FALSE. 344 IF ( ld t3d) THEN361 IF ( ldvar1 ) THEN 345 362 loop_t_count : DO ij = 1,inpfiles(jj)%nlev 346 363 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & … … 348 365 IF ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 349 366 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 350 i t3dt0 = it3dt0 + 1367 ivar1t0 = ivar1t0 + 1 351 368 ENDIF 352 369 END DO loop_t_count 353 370 ENDIF 354 IF ( ld s3d) THEN371 IF ( ldvar2 ) THEN 355 372 loop_s_count : DO ij = 1,inpfiles(jj)%nlev 356 373 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & … … 358 375 IF ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 359 376 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 360 i s3dt0 = is3dt0 + 1377 ivar2t0 = ivar2t0 + 1 361 378 ENDIF 362 379 END DO loop_s_count … … 367 384 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 368 385 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 369 & ld t3d) .OR. &386 & ldvar1 ) .OR. & 370 387 & ( ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 371 388 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 372 & ld s3d) ) THEN389 & ldvar2 ) ) THEN 373 390 ip3dt = ip3dt + 1 374 391 llvalprof = .TRUE. … … 384 401 385 402 END DO prof_files 386 403 387 404 !----------------------------------------------------------------------- 388 405 ! Get the time ordered indices of the input data … … 425 442 & zdat, & 426 443 & iindx ) 427 444 428 445 iv3dt(:) = -1 429 446 IF (ldsatt) THEN … … 431 448 iv3dt(2) = ip3dt 432 449 ELSE 433 iv3dt(1) = i t3dt0434 iv3dt(2) = i s3dt0450 iv3dt(1) = ivar1t0 451 iv3dt(2) = ivar2t0 435 452 ENDIF 436 453 CALL obs_prof_alloc( profdata, kvars, kextr, iprof, iv3dt, & 437 454 & kstp, jpi, jpj, jpk ) 438 455 439 456 ! * Read obs/positions, QC, all variable and assign to profdata 440 457 441 458 profdata%nprof = 0 442 459 profdata%nvprot(:) = 0 443 460 profdata%cvars(:) = clvars(:) 444 461 iprof = 0 445 462 446 463 ip3dt = 0 447 i t3dt = 0448 i s3dt = 0449 ityp t(:) = 0450 ityp tmpp(:) = 0451 452 ityp s(:) = 0453 ityp smpp(:) = 0454 455 ioserrcount = 0 464 ivar1t = 0 465 ivar2t = 0 466 itypvar1 (:) = 0 467 itypvar1mpp(:) = 0 468 469 itypvar2 (:) = 0 470 itypvar2mpp(:) = 0 471 472 ioserrcount = 0 456 473 DO jk = 1, iproftot 457 474 458 475 jj = ifileidx(iindx(jk)) 459 476 ji = iprofidx(iindx(jk)) … … 465 482 IF ( ( inpfiles(jj)%ptim(ji) > djulini(jj) ) .AND. & 466 483 & ( inpfiles(jj)%ptim(ji) <= djulend(jj) ) ) THEN 467 484 468 485 IF ( nproc == 0 ) THEN 469 486 IF ( inpfiles(jj)%iproc(ji,1) > nproc ) CYCLE … … 471 488 IF ( inpfiles(jj)%iproc(ji,1) /= nproc ) CYCLE 472 489 ENDIF 473 490 474 491 llvalprof = .FALSE. 475 492 … … 480 497 481 498 loop_prof : DO ij = 1, inpfiles(jj)%nlev 482 499 483 500 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & 484 501 & CYCLE 485 502 486 503 IF ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 487 504 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 488 505 489 506 llvalprof = .TRUE. 490 507 EXIT loop_prof 491 508 492 509 ENDIF 493 510 494 511 IF ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 495 512 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 496 513 497 514 llvalprof = .TRUE. 498 515 EXIT loop_prof 499 516 500 517 ENDIF 501 518 502 519 END DO loop_prof 503 520 504 521 ! Set profile information 505 522 506 523 IF ( llvalprof ) THEN 507 524 508 525 iprof = iprof + 1 509 526 … … 524 541 profdata%nhou(iprof) = ihou 525 542 profdata%nmin(iprof) = imin 526 543 527 544 ! Profile space coordinates 528 545 profdata%rlam(iprof) = inpfiles(jj)%plam(ji) … … 532 549 profdata%mi (iprof,:) = inpfiles(jj)%iobsi(ji,1) 533 550 profdata%mj (iprof,:) = inpfiles(jj)%iobsj(ji,1) 534 551 535 552 ! Profile WMO number 536 553 profdata%cwmo(iprof) = inpfiles(jj)%cdwmo(ji) 537 554 538 555 ! Instrument type 539 556 READ( inpfiles(jj)%cdtyp(ji), '(I4)', IOSTAT = ios, ERR = 901 ) itype … … 543 560 itype = 0 544 561 ENDIF 545 562 546 563 profdata%ntyp(iprof) = itype 547 564 548 565 ! QC stuff 549 566 … … 564 581 profdata%nqc(iprof) = 0 !TODO 565 582 566 loop_p : DO ij = 1, inpfiles(jj)%nlev 567 583 loop_p : DO ij = 1, inpfiles(jj)%nlev 584 568 585 IF ( inpfiles(jj)%pdep(ij,ji) >= 6000. ) & 569 586 & CYCLE … … 573 590 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 574 591 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 575 & ld t3d) .OR. &592 & ldvar1 ) .OR. & 576 593 & ( ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 577 594 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 578 & ld s3d) ) THEN595 & ldvar2 ) ) THEN 579 596 ip3dt = ip3dt + 1 580 597 ELSE 581 598 CYCLE 582 599 ENDIF 583 600 584 601 ENDIF 585 602 586 603 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 587 604 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 588 & ld t3d) .OR. ldsatt ) THEN589 605 & ldvar1 ) .OR. ldsatt ) THEN 606 590 607 IF (ldsatt) THEN 591 608 592 i t3dt = ip3dt609 ivar1t = ip3dt 593 610 594 611 ELSE 595 612 596 i t3dt = it3dt + 1597 613 ivar1t = ivar1t + 1 614 598 615 ENDIF 599 616 600 ! Depth of Tobservation601 profdata%var(1)%vdep(i t3dt) = &617 ! Depth of var1 observation 618 profdata%var(1)%vdep(ivar1t) = & 602 619 & inpfiles(jj)%pdep(ij,ji) 603 604 ! Depth of Tobservation QC605 profdata%var(1)%idqc(i t3dt) = &620 621 ! Depth of var1 observation QC 622 profdata%var(1)%idqc(ivar1t) = & 606 623 & inpfiles(jj)%idqc(ij,ji) 607 608 ! Depth of Tobservation QC flags609 profdata%var(1)%idqcf(:,i t3dt) = &624 625 ! Depth of var1 observation QC flags 626 profdata%var(1)%idqcf(:,ivar1t) = & 610 627 & inpfiles(jj)%idqcf(:,ij,ji) 611 628 612 629 ! Profile index 613 profdata%var(1)%nvpidx(i t3dt) = iprof614 630 profdata%var(1)%nvpidx(ivar1t) = iprof 631 615 632 ! Vertical index in original profile 616 profdata%var(1)%nvlidx(i t3dt) = ij617 618 ! Profile potential Tvalue633 profdata%var(1)%nvlidx(ivar1t) = ij 634 635 ! Profile potential var1 value 619 636 IF ( ( inpfiles(jj)%ivlqc(ij,ji,1) <= 2 ) .AND. & 620 637 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 621 profdata%var(1)%vobs(i t3dt) = &638 profdata%var(1)%vobs(ivar1t) = & 622 639 & inpfiles(jj)%pob(ij,ji,1) 623 640 IF ( ldmod ) THEN 624 profdata%var(1)%vmod(i t3dt) = &641 profdata%var(1)%vmod(ivar1t) = & 625 642 & inpfiles(jj)%padd(ij,ji,1,1) 626 643 ENDIF 627 ! Count number of profile Tdata as function of type628 ityp t( profdata%ntyp(iprof) + 1 ) = &629 & ityp t( profdata%ntyp(iprof) + 1 ) + 1644 ! Count number of profile var1 data as function of type 645 itypvar1( profdata%ntyp(iprof) + 1 ) = & 646 & itypvar1( profdata%ntyp(iprof) + 1 ) + 1 630 647 ELSE 631 profdata%var(1)%vobs(i t3dt) = fbrmdi648 profdata%var(1)%vobs(ivar1t) = fbrmdi 632 649 ENDIF 633 650 634 ! Profile Tqc635 profdata%var(1)%nvqc(i t3dt) = &651 ! Profile var1 qc 652 profdata%var(1)%nvqc(ivar1t) = & 636 653 & inpfiles(jj)%ivlqc(ij,ji,1) 637 654 638 ! Profile Tqc flags639 profdata%var(1)%nvqcf(:,i t3dt) = &655 ! Profile var1 qc flags 656 profdata%var(1)%nvqcf(:,ivar1t) = & 640 657 & inpfiles(jj)%ivlqcf(:,ij,ji,1) 641 658 642 659 ! Profile insitu T value 643 profdata%var(1)%vext(i t3dt,1) = &660 profdata%var(1)%vext(ivar1t,1) = & 644 661 & inpfiles(jj)%pext(ij,ji,1) 645 662 646 663 ENDIF 647 664 648 665 IF ( ( ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 649 666 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) .AND. & 650 & ld s3d) .OR. ldsatt ) THEN651 667 & ldvar2 ) .OR. ldsatt ) THEN 668 652 669 IF (ldsatt) THEN 653 670 654 i s3dt = ip3dt671 ivar2t = ip3dt 655 672 656 673 ELSE 657 674 658 i s3dt = is3dt + 1659 675 ivar2t = ivar2t + 1 676 660 677 ENDIF 661 678 662 ! Depth of Sobservation663 profdata%var(2)%vdep(i s3dt) = &679 ! Depth of var2 observation 680 profdata%var(2)%vdep(ivar2t) = & 664 681 & inpfiles(jj)%pdep(ij,ji) 665 666 ! Depth of Sobservation QC667 profdata%var(2)%idqc(i s3dt) = &682 683 ! Depth of var2 observation QC 684 profdata%var(2)%idqc(ivar2t) = & 668 685 & inpfiles(jj)%idqc(ij,ji) 669 670 ! Depth of Sobservation QC flags671 profdata%var(2)%idqcf(:,i s3dt) = &686 687 ! Depth of var2 observation QC flags 688 profdata%var(2)%idqcf(:,ivar2t) = & 672 689 & inpfiles(jj)%idqcf(:,ij,ji) 673 690 674 691 ! Profile index 675 profdata%var(2)%nvpidx(i s3dt) = iprof676 692 profdata%var(2)%nvpidx(ivar2t) = iprof 693 677 694 ! Vertical index in original profile 678 profdata%var(2)%nvlidx(i s3dt) = ij679 680 ! Profile Svalue695 profdata%var(2)%nvlidx(ivar2t) = ij 696 697 ! Profile var2 value 681 698 IF ( ( inpfiles(jj)%ivlqc(ij,ji,2) <= 2 ) .AND. & 682 699 & ( inpfiles(jj)%idqc(ij,ji) <= 2 ) ) THEN 683 profdata%var(2)%vobs(i s3dt) = &700 profdata%var(2)%vobs(ivar2t) = & 684 701 & inpfiles(jj)%pob(ij,ji,2) 685 702 IF ( ldmod ) THEN 686 profdata%var(2)%vmod(i s3dt) = &703 profdata%var(2)%vmod(ivar2t) = & 687 704 & inpfiles(jj)%padd(ij,ji,1,2) 688 705 ENDIF 689 ! Count number of profile Sdata as function of type690 ityp s( profdata%ntyp(iprof) + 1 ) = &691 & ityp s( profdata%ntyp(iprof) + 1 ) + 1706 ! Count number of profile var2 data as function of type 707 itypvar2( profdata%ntyp(iprof) + 1 ) = & 708 & itypvar2( profdata%ntyp(iprof) + 1 ) + 1 692 709 ELSE 693 profdata%var(2)%vobs(i s3dt) = fbrmdi710 profdata%var(2)%vobs(ivar2t) = fbrmdi 694 711 ENDIF 695 696 ! Profile Sqc697 profdata%var(2)%nvqc(i s3dt) = &712 713 ! Profile var2 qc 714 profdata%var(2)%nvqc(ivar2t) = & 698 715 & inpfiles(jj)%ivlqc(ij,ji,2) 699 716 700 ! Profile Sqc flags701 profdata%var(2)%nvqcf(:,i s3dt) = &717 ! Profile var2 qc flags 718 profdata%var(2)%nvqcf(:,ivar2t) = & 702 719 & inpfiles(jj)%ivlqcf(:,ij,ji,2) 703 720 704 721 ENDIF 705 722 706 723 END DO loop_p 707 724 … … 715 732 ! Sum up over processors 716 733 !----------------------------------------------------------------------- 717 718 CALL obs_mpp_sum_integer ( i t3dt0, it3dtmpp )719 CALL obs_mpp_sum_integer ( i s3dt0, is3dtmpp )720 CALL obs_mpp_sum_integer ( ip3dt, ip3dtmpp)721 722 CALL obs_mpp_sum_integers( ityp t, ityptmpp, ntyp1770 + 1 )723 CALL obs_mpp_sum_integers( ityp s, itypsmpp, ntyp1770 + 1 )724 734 735 CALL obs_mpp_sum_integer ( ivar1t0, ivar1tmpp ) 736 CALL obs_mpp_sum_integer ( ivar2t0, ivar2tmpp ) 737 CALL obs_mpp_sum_integer ( ip3dt, ip3dtmpp ) 738 739 CALL obs_mpp_sum_integers( itypvar1, itypvar1mpp, ntyp1770 + 1 ) 740 CALL obs_mpp_sum_integers( itypvar2, itypvar2mpp, ntyp1770 + 1 ) 741 725 742 !----------------------------------------------------------------------- 726 743 ! Output number of observations. … … 728 745 IF(lwp) THEN 729 746 WRITE(numout,*) 730 WRITE(numout,'( 1X,A)') 'Profile data'747 WRITE(numout,'(A)') ' Profile data' 731 748 WRITE(numout,'(1X,A)') '------------' 732 749 WRITE(numout,*) 733 WRITE(numout,'(1X,A)') 'Profile T data'734 WRITE(numout,'(1X,A)') '-------------- '750 WRITE(numout,'(1X,A)') 'Profile data, '//TRIM( profdata%cvars(1) ) 751 WRITE(numout,'(1X,A)') '------------------------' 735 752 DO ji = 0, ntyp1770 736 IF ( ityp tmpp(ji+1) > 0 ) THEN753 IF ( itypvar1mpp(ji+1) > 0 ) THEN 737 754 WRITE(numout,'(1X,A3,1X,A48,A3,I8)') ctypshort(ji), & 738 755 & cwmonam1770(ji)(1:52),' = ', & 739 & ityp tmpp(ji+1)756 & itypvar1mpp(ji+1) 740 757 ENDIF 741 758 END DO … … 743 760 & '---------------------------------------------------------------' 744 761 WRITE(numout,'(1X,A55,I8)') & 745 & 'Total profile T data = ',&746 & it3dtmpp762 & 'Total profile data for variable '//TRIM( profdata%cvars(1) )// & 763 & ' = ', ivar1tmpp 747 764 WRITE(numout,'(1X,A)') & 748 765 & '---------------------------------------------------------------' 749 766 WRITE(numout,*) 750 WRITE(numout,'(1X,A)') 'Profile S data'751 WRITE(numout,'(1X,A)') '-------------- '767 WRITE(numout,'(1X,A)') 'Profile data, '//TRIM( profdata%cvars(2) ) 768 WRITE(numout,'(1X,A)') '------------------------' 752 769 DO ji = 0, ntyp1770 753 IF ( ityp smpp(ji+1) > 0 ) THEN770 IF ( itypvar2mpp(ji+1) > 0 ) THEN 754 771 WRITE(numout,'(1X,A3,1X,A48,A3,I8)') ctypshort(ji), & 755 772 & cwmonam1770(ji)(1:52),' = ', & 756 & ityp smpp(ji+1)773 & itypvar2mpp(ji+1) 757 774 ENDIF 758 775 END DO … … 760 777 & '---------------------------------------------------------------' 761 778 WRITE(numout,'(1X,A55,I8)') & 762 & 'Total profile S data = ',&763 & is3dtmpp779 & 'Total profile data for variable '//TRIM( profdata%cvars(2) )// & 780 & ' = ', ivar2tmpp 764 781 WRITE(numout,'(1X,A)') & 765 782 & '---------------------------------------------------------------' 766 783 WRITE(numout,*) 767 784 ENDIF 768 785 769 786 IF (ldsatt) THEN 770 787 profdata%nvprot(1) = ip3dt … … 773 790 profdata%nvprotmpp(2) = ip3dtmpp 774 791 ELSE 775 profdata%nvprot(1) = i t3dt776 profdata%nvprot(2) = i s3dt777 profdata%nvprotmpp(1) = i t3dtmpp778 profdata%nvprotmpp(2) = i s3dtmpp792 profdata%nvprot(1) = ivar1t 793 profdata%nvprot(2) = ivar2t 794 profdata%nvprotmpp(1) = ivar1tmpp 795 profdata%nvprotmpp(2) = ivar2tmpp 779 796 ENDIF 780 797 profdata%nprof = iprof … … 783 800 ! Model level search 784 801 !----------------------------------------------------------------------- 785 IF ( ld t3d) THEN802 IF ( ldvar1 ) THEN 786 803 CALL obs_level_search( jpk, gdept_1d, & 787 804 & profdata%nvprot(1), profdata%var(1)%vdep, & 788 805 & profdata%var(1)%mvk ) 789 806 ENDIF 790 IF ( ld s3d) THEN807 IF ( ldvar2 ) THEN 791 808 CALL obs_level_search( jpk, gdept_1d, & 792 809 & profdata%nvprot(2), profdata%var(2)%vdep, & 793 810 & profdata%var(2)%mvk ) 794 811 ENDIF 795 812 796 813 !----------------------------------------------------------------------- 797 814 ! Set model equivalent to 99999 … … 805 822 ! Deallocate temporary data 806 823 !----------------------------------------------------------------------- 807 DEALLOCATE( ifileidx, iprofidx, zdat )824 DEALLOCATE( ifileidx, iprofidx, zdat, clvars ) 808 825 809 826 !-----------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.