Changeset 15187 for NEMO/branches/UKMO/NEMO_4.0.4_generic_obs
- Timestamp:
- 2021-08-13T11:34:58+02:00 (3 years ago)
- Location:
- NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/diaobs.F90
r15180 r15187 249 249 & sobsgroups(jgroup)%cobstypes ) 250 250 ! 251 IF( sobsgroups(jgroup)%lsla ) THEN 252 sobsgroups(jgroup)%ssurfdata%cextvars(sobsgroups(jgroup)%next_mdt) = 'MDT' 253 sobsgroups(jgroup)%ssurfdata%cextlong(sobsgroups(jgroup)%next_mdt) = 'Mean dynamic topography' 254 sobsgroups(jgroup)%ssurfdata%cextunit(sobsgroups(jgroup)%next_mdt) = 'Metres' 255 sobsgroups(jgroup)%ssurfdata%caddvars(sobsgroups(jgroup)%nadd_ssh) = 'SSH' 256 DO jvar = 1, sobsgroups(jgroup)%nobstypes 257 sobsgroups(jgroup)%ssurfdata%caddlong(sobsgroups(jgroup)%nadd_ssh,jvar) = 'Model Sea surface height' 258 sobsgroups(jgroup)%ssurfdata%caddunit(sobsgroups(jgroup)%nadd_ssh,jvar) = 'Metres' 259 END DO 260 ENDIF 251 261 252 262 CALL obs_pre_surf( sobsgroups(jgroup)%ssurfdata, & … … 261 271 IF( sobsgroups(jgroup)%lsla ) THEN 262 272 CALL obs_rea_mdt( sobsgroups(jgroup)%ssurfdataqc, & 263 & sobsgroups(jgroup)%n2dint ) 273 & sobsgroups(jgroup)%n2dint, & 274 & sobsgroups(jgroup)%next_mdt ) 264 275 IF( sobsgroups(jgroup)%laltbias ) THEN 265 CALL obs_rea_altbias( sobsgroups(jgroup)%ssurfdataqc, & 266 & sobsgroups(jgroup)%n2dint, & 267 & sobsgroups(jgroup)%caltbiasfile ) 276 !CALL obs_rea_altbias( sobsgroups(jgroup)%ssurfdataqc, & 277 ! & sobsgroups(jgroup)%n2dint, & 278 ! & sobsgroups(jgroup)%caltbiasfile ) 279 CALL obs_app_bias( sobsgroups(jgroup)%ssurfdataqc, & 280 & sobsgroups(jgroup)%next_mdt, & 281 & sobsgroups(jgroup)%n2dint, & 282 & 1, & 283 & sobsgroups(jgroup)%caltbiasfile, & 284 & 'altbias', & 285 & ld_extvar=.TRUE. ) 268 286 ENDIF 269 287 ENDIF … … 423 441 & sobsgroups(jgroup)%ravglamscl, & 424 442 & sobsgroups(jgroup)%ravgphiscl, & 425 & sobsgroups(jgroup)%lfp_indegs ) 443 & sobsgroups(jgroup)%lfp_indegs, & 444 & kssh=sobsgroups(jgroup)%nadd_ssh, & 445 & kmdt=sobsgroups(jgroup)%next_mdt ) 426 446 427 447 END DO … … 463 483 !! * Local declarations 464 484 INTEGER :: jgroup ! Data set loop variable 465 INTEGER :: jo, jvar, jk, jadd, jext 485 INTEGER :: jo, jvar, jk, jadd, jext, jadd2, jext2 466 486 REAL(wp), DIMENSION(:), ALLOCATABLE :: & 467 487 & zu, & 468 488 & zv 489 LOGICAL, DIMENSION(:), ALLOCATABLE :: ll_write 469 490 TYPE(obswriinfo) :: sladd, slext 470 491 … … 513 534 & sobsgroups(jgroup)%sprofdata, .TRUE., numout ) 514 535 536 ! Put additional and extra variable information into obswriinfo structure 537 ! used by obs_write. 538 ! add/ext variables generated by the OBS code (1...sobsgroups(jgroup)%naddvars) 539 ! may duplicate ones read in (%naddvars+1...sobsgroups(jgroup)%sprofdata%nadd) 540 ! Check for this, and if so only write out the version generated by the OBS code 515 541 sladd%inum = sobsgroups(jgroup)%sprofdata%nadd 542 ALLOCATE( ll_write(sobsgroups(jgroup)%sprofdata%nadd) ) 543 ll_write(:) = .TRUE. 544 IF ( (sobsgroups(jgroup)%naddvars > 0) .AND. & 545 & (sobsgroups(jgroup)%sprofdata%nadd > sobsgroups(jgroup)%naddvars) ) THEN 546 DO jadd = sobsgroups(jgroup)%naddvars + 1, sobsgroups(jgroup)%sprofdata%nadd 547 DO jadd2 = 1, sobsgroups(jgroup)%naddvars 548 IF ( TRIM(sobsgroups(jgroup)%sprofdata%caddvars(jadd )) == & 549 & TRIM(sobsgroups(jgroup)%sprofdata%caddvars(jadd2)) ) THEN 550 sladd%inum = sladd%inum - 1 551 ll_write(jadd) = .FALSE. 552 ENDIF 553 END DO 554 END DO 555 ENDIF 516 556 IF ( sladd%inum > 0 ) THEN 517 557 ALLOCATE( sladd%ipoint(sladd%inum), & … … 519 559 & sladd%cdlong(sladd%inum,sobsgroups(jgroup)%sprofdata%nvar), & 520 560 & sladd%cdunit(sladd%inum,sobsgroups(jgroup)%sprofdata%nvar) ) 521 DO jadd = 1, sladd%inum 522 sladd%ipoint(jadd) = jadd 523 sladd%cdname(jadd) = sobsgroups(jgroup)%sprofdata%caddvars(jadd) 524 DO jvar = 1, sobsgroups(jgroup)%sprofdata%nvar 525 sladd%cdlong(jadd,jvar) = sobsgroups(jgroup)%sprofdata%caddlong(jadd,jvar) 526 sladd%cdunit(jadd,jvar) = sobsgroups(jgroup)%sprofdata%caddunit(jadd,jvar) 561 jadd2 = 0 562 DO jadd = 1, sobsgroups(jgroup)%sprofdata%nadd 563 IF ( ll_write(jadd) ) THEN 564 jadd2 = jadd2 + 1 565 sladd%ipoint(jadd2) = jadd 566 sladd%cdname(jadd2) = sobsgroups(jgroup)%sprofdata%caddvars(jadd) 567 DO jvar = 1, sobsgroups(jgroup)%sprofdata%nvar 568 sladd%cdlong(jadd2,jvar) = sobsgroups(jgroup)%sprofdata%caddlong(jadd,jvar) 569 sladd%cdunit(jadd2,jvar) = sobsgroups(jgroup)%sprofdata%caddunit(jadd,jvar) 570 END DO 571 ENDIF 572 END DO 573 ENDIF 574 DEALLOCATE( ll_write ) 575 576 slext%inum = sobsgroups(jgroup)%sprofdata%next 577 ALLOCATE( ll_write(sobsgroups(jgroup)%sprofdata%next) ) 578 ll_write(:) = .TRUE. 579 IF ( (sobsgroups(jgroup)%nextvars > 0) .AND. & 580 & (sobsgroups(jgroup)%sprofdata%next > sobsgroups(jgroup)%nextvars) ) THEN 581 DO jext = sobsgroups(jgroup)%nextvars + 1, sobsgroups(jgroup)%sprofdata%next 582 DO jext2 = 1, sobsgroups(jgroup)%nextvars 583 IF ( TRIM(sobsgroups(jgroup)%sprofdata%cextvars(jext )) == & 584 & TRIM(sobsgroups(jgroup)%sprofdata%cextvars(jext2)) ) THEN 585 slext%inum = slext%inum - 1 586 ll_write(jext) = .FALSE. 587 ENDIF 527 588 END DO 528 589 END DO 529 590 ENDIF 530 slext%inum = sobsgroups(jgroup)%sprofdata%next531 591 IF ( slext%inum > 0 ) THEN 532 592 ALLOCATE( slext%ipoint(slext%inum), & … … 534 594 & slext%cdlong(slext%inum,1), & 535 595 & slext%cdunit(slext%inum,1) ) 536 DO jext = 1, slext%inum 537 slext%ipoint(jext) = jext 538 slext%cdname(jext) = sobsgroups(jgroup)%sprofdata%cextvars(jext) 539 slext%cdlong(jext,1) = sobsgroups(jgroup)%sprofdata%cextlong(jext) 540 slext%cdunit(jext,1) = sobsgroups(jgroup)%sprofdata%cextunit(jext) 541 END DO 542 ENDIF 596 jext2 = 0 597 DO jext = 1, sobsgroups(jgroup)%sprofdata%next 598 IF ( ll_write(jext) ) THEN 599 jext2 = jext2 + 1 600 slext%ipoint(jext2) = jext 601 slext%cdname(jext2) = sobsgroups(jgroup)%sprofdata%cextvars(jext) 602 slext%cdlong(jext2,1) = sobsgroups(jgroup)%sprofdata%cextlong(jext) 603 slext%cdunit(jext2,1) = sobsgroups(jgroup)%sprofdata%cextunit(jext) 604 ENDIF 605 END DO 606 ENDIF 607 DEALLOCATE( ll_write ) 543 608 544 609 CALL obs_wri_prof( sobsgroups(jgroup)%sprofdata, sobsgroups(jgroup)%cgroupname, sladd, slext ) … … 556 621 & sobsgroups(jgroup)%ssurfdata, .TRUE., numout ) 557 622 623 ! Put additional and extra variable information into obswriinfo structure 624 ! used by obs_write. 625 ! add/ext variables generated by the OBS code (1...sobsgroups(jgroup)%naddvars) 626 ! may duplicate ones read in (%naddvars+1...sobsgroups(jgroup)%ssurfdata%nadd) 627 ! Check for this, and if so only write out the version generated by the OBS code 558 628 sladd%inum = sobsgroups(jgroup)%ssurfdata%nadd 629 ALLOCATE( ll_write(sobsgroups(jgroup)%ssurfdata%nadd) ) 630 ll_write(:) = .TRUE. 631 IF ( (sobsgroups(jgroup)%naddvars > 0) .AND. & 632 & (sobsgroups(jgroup)%ssurfdata%nadd > sobsgroups(jgroup)%naddvars) ) THEN 633 DO jadd = sobsgroups(jgroup)%naddvars + 1, sobsgroups(jgroup)%ssurfdata%nadd 634 DO jadd2 = 1, sobsgroups(jgroup)%naddvars 635 IF ( TRIM(sobsgroups(jgroup)%ssurfdata%caddvars(jadd )) == & 636 & TRIM(sobsgroups(jgroup)%ssurfdata%caddvars(jadd2)) ) THEN 637 sladd%inum = sladd%inum - 1 638 ll_write(jadd) = .FALSE. 639 ENDIF 640 END DO 641 END DO 642 ENDIF 559 643 IF ( sladd%inum > 0 ) THEN 560 644 ALLOCATE( sladd%ipoint(sladd%inum), & … … 562 646 & sladd%cdlong(sladd%inum,sobsgroups(jgroup)%ssurfdata%nvar), & 563 647 & sladd%cdunit(sladd%inum,sobsgroups(jgroup)%ssurfdata%nvar) ) 564 DO jadd = 1, sladd%inum 565 sladd%ipoint(jadd) = jadd 566 sladd%cdname(jadd) = sobsgroups(jgroup)%ssurfdata%caddvars(jadd) 567 DO jvar = 1, sobsgroups(jgroup)%ssurfdata%nvar 568 sladd%cdlong(jadd,jvar) = sobsgroups(jgroup)%ssurfdata%caddlong(jadd,jvar) 569 sladd%cdunit(jadd,jvar) = sobsgroups(jgroup)%ssurfdata%caddunit(jadd,jvar) 648 jadd2 = 0 649 DO jadd = 1, sobsgroups(jgroup)%ssurfdata%nadd 650 IF ( ll_write(jadd) ) THEN 651 jadd2 = jadd2 + 1 652 sladd%ipoint(jadd2) = jadd 653 sladd%cdname(jadd2) = sobsgroups(jgroup)%ssurfdata%caddvars(jadd) 654 DO jvar = 1, sobsgroups(jgroup)%ssurfdata%nvar 655 sladd%cdlong(jadd2,jvar) = sobsgroups(jgroup)%ssurfdata%caddlong(jadd,jvar) 656 sladd%cdunit(jadd2,jvar) = sobsgroups(jgroup)%ssurfdata%caddunit(jadd,jvar) 657 END DO 658 ENDIF 659 END DO 660 ENDIF 661 DEALLOCATE( ll_write ) 662 663 slext%inum = sobsgroups(jgroup)%ssurfdata%nextra 664 ALLOCATE( ll_write(sobsgroups(jgroup)%ssurfdata%nextra) ) 665 ll_write(:) = .TRUE. 666 IF ( (sobsgroups(jgroup)%nextvars > 0) .AND. & 667 & (sobsgroups(jgroup)%ssurfdata%nextra > sobsgroups(jgroup)%nextvars) ) THEN 668 DO jext = sobsgroups(jgroup)%nextvars + 1, sobsgroups(jgroup)%ssurfdata%nextra 669 DO jext2 = 1, sobsgroups(jgroup)%nextvars 670 IF ( TRIM(sobsgroups(jgroup)%ssurfdata%cextvars(jext )) == & 671 & TRIM(sobsgroups(jgroup)%ssurfdata%cextvars(jext2)) ) THEN 672 slext%inum = slext%inum - 1 673 ll_write(jext) = .FALSE. 674 ENDIF 570 675 END DO 571 676 END DO 572 677 ENDIF 573 slext%inum = sobsgroups(jgroup)%ssurfdata%nextra574 678 IF ( slext%inum > 0 ) THEN 575 679 ALLOCATE( slext%ipoint(slext%inum), & … … 577 681 & slext%cdlong(slext%inum,1), & 578 682 & slext%cdunit(slext%inum,1) ) 579 DO jext = 1, slext%inum 580 slext%ipoint(jext) = jext 581 slext%cdname(jext) = sobsgroups(jgroup)%ssurfdata%cextvars(jext) 582 slext%cdlong(jext,1) = sobsgroups(jgroup)%ssurfdata%cextlong(jext) 583 slext%cdunit(jext,1) = sobsgroups(jgroup)%ssurfdata%cextunit(jext) 584 END DO 585 ENDIF 683 jext2 = 0 684 DO jext = 1, sobsgroups(jgroup)%ssurfdata%nextra 685 IF ( ll_write(jext) ) THEN 686 jext2 = jext2 + 1 687 slext%ipoint(jext2) = jext 688 slext%cdname(jext2) = sobsgroups(jgroup)%ssurfdata%cextvars(jext) 689 slext%cdlong(jext2,1) = sobsgroups(jgroup)%ssurfdata%cextlong(jext) 690 slext%cdunit(jext2,1) = sobsgroups(jgroup)%ssurfdata%cextunit(jext) 691 ENDIF 692 END DO 693 ENDIF 694 DEALLOCATE( ll_write ) 586 695 587 696 CALL obs_wri_surf( sobsgroups(jgroup)%ssurfdata, sobsgroups(jgroup)%cgroupname, sladd, slext ) -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_bias.F90
r15180 r15187 30 30 CONTAINS 31 31 SUBROUTINE obs_app_bias( obsdata, kvar, k2dint, knumtypes, & 32 cl_bias_files, cd_biasname ) 32 cl_bias_files, cd_biasname, & 33 ld_extvar ) 33 34 !!--------------------------------------------------------------------- 34 35 !! … … 52 53 USE iom 53 54 USE netcdf 55 54 56 !! * Arguments 55 56 57 TYPE(obs_surf), INTENT(INOUT) :: obsdata ! Observation data 57 58 INTEGER, INTENT(IN) :: kvar ! Index of obs type being bias corrected … … 60 61 CHARACTER(LEN=128), DIMENSION(knumtypes), INTENT(IN) :: & 61 62 cl_bias_files !List of files to read 62 CHARACTER(LEN=128), INTENT(IN) :: cd_biasname !Variable name in file 63 CHARACTER(LEN=128), INTENT(IN) :: cd_biasname ! Variable name in file 64 LOGICAL, OPTIONAL, INTENT(IN) :: ld_extvar ! If T correct an extra var 65 63 66 !! * Local declarations 64 67 INTEGER :: jobs ! Obs loop variable … … 95 98 & igrdj_tmp 96 99 INTEGER :: numobsbias 97 INTEGER(KIND=NF90_INT) :: ifile_source 98 100 INTEGER(KIND=NF90_INT) :: ifile_source 99 101 INTEGER :: incfile 100 102 INTEGER :: jtype 101 103 INTEGER :: iret 102 104 INTEGER :: inumtype 105 LOGICAL :: ll_extvar 106 107 IF ( PRESENT(ld_extvar) ) THEN 108 ll_extvar = ld_extvar 109 ELSE 110 ll_extvar = .FALSE. 111 ENDIF 112 IF ( ll_extvar .AND. ( knumtypes /= 1 ) ) THEN 113 CALL ctl_stop( 'obs_app_bias: If correcting an extra variable', & 114 & ' knumtypes must be 1' ) 115 ENDIF 116 103 117 IF(lwp)WRITE(numout,*) 104 118 IF(lwp)WRITE(numout,*) 'obs_app_bias : ' 105 119 IF(lwp)WRITE(numout,*) '----------------- ' 106 IF(lwp)WRITE(numout,*) 'Read observation bias for ', TRIM(obsdata%cvars(kvar)) 120 IF ( ll_extvar ) THEN 121 IF(lwp)WRITE(numout,*) 'Read observation bias for ', TRIM(obsdata%cextvars(kvar)) 122 ELSE 123 IF(lwp)WRITE(numout,*) 'Read observation bias for ', TRIM(obsdata%cvars(kvar)) 124 ENDIF 125 107 126 ! Open and read the files 108 127 z_obsbias(:,:,:)=0.0_wp … … 114 133 IF (numobsbias > 0) THEN 115 134 116 !Read the bias type from the file 117 !No IOM get attribute command at time of writing, 118 !so have to use NETCDF 119 !routines directly - should be upgraded in the future 120 iret=NF90_OPEN(TRIM(cl_bias_files(jtype)), NF90_NOWRITE, incfile) 121 iret=NF90_GET_ATT( incfile, NF90_GLOBAL, TRIM(obsdata%cvars(kvar))//"_source", & 122 ifile_source ) 123 ibiastypes(jtype) = ifile_source 124 iret=NF90_CLOSE(incfile) 125 126 IF ( iret /= 0 ) CALL ctl_stop( & 127 'obs_app_bias : Cannot read bias type from file '// & 128 cl_bias_files(jtype) ) 135 IF ( .NOT. ll_extvar ) THEN 136 !Read the bias type from the file 137 !No IOM get attribute command at time of writing, 138 !so have to use NETCDF 139 !routines directly - should be upgraded in the future 140 iret=NF90_OPEN(TRIM(cl_bias_files(jtype)), NF90_NOWRITE, incfile) 141 IF ( .NOT. ll_extvar ) THEN 142 iret=NF90_GET_ATT( incfile, NF90_GLOBAL, TRIM(obsdata%cvars(kvar))//"_source", & 143 ifile_source ) 144 ibiastypes(jtype) = ifile_source 145 ENDIF 146 iret=NF90_CLOSE(incfile) 147 IF ( iret /= 0 ) CALL ctl_stop( & 148 'obs_app_bias : Cannot read bias type from file '// & 149 cl_bias_files(jtype) ) 150 ENDIF 151 129 152 ! Get the bias data 130 153 CALL iom_get( numobsbias, jpdom_data, TRIM(cd_biasname), z_obsbias_2d(:,:), 1 ) … … 190 213 jt=1 191 214 DO jobs = 1, obsdata%nsurf 192 IF ( obsdata%ntyp(jobs) == ibiastypes(jtype) ) THEN 215 IF ( ( obsdata%ntyp(jobs) == ibiastypes(jtype) ) .OR. & 216 & ll_extvar ) THEN 193 217 zlam = obsdata%rlam(jobs) 194 218 zphi = obsdata%rphi(jobs) … … 201 225 CALL obs_int_h2d( 1, 1, zweig, zbias(:,:,jt), zext ) 202 226 ! adjust observations with bias field 203 obsdata%robs(jobs,kvar) = obsdata%robs(jobs,kvar) - zext(1) 227 IF ( ll_extvar ) THEN 228 obsdata%rext(jobs,kvar) = obsdata%rext(jobs,kvar) - zext(1) 229 ELSE 230 obsdata%robs(jobs,kvar) = obsdata%robs(jobs,kvar) - zext(1) 231 ENDIF 204 232 jt=jt+1 205 233 ENDIF … … 225 253 WRITE(numout,*) " " 226 254 WRITE(numout,*) "Bias correction applied successfully" 227 WRITE(numout,*) "Obs types: ",ibiastypes(:), & 228 " Have all been bias corrected\n" 255 IF ( .NOT. ll_extvar ) THEN 256 WRITE(numout,*) "Obs types: ",ibiastypes(:), & 257 " Have all been bias corrected" 258 ENDIF 229 259 ENDIF 230 260 END SUBROUTINE obs_app_bias -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_field.F90
r15180 r15187 63 63 INTEGER :: n2dint !: Type of horizontal interpolation method 64 64 INTEGER :: nmsshc !: MSSH correction scheme 65 INTEGER :: nadd_ssh !: Index of additional variable representing SSH 66 INTEGER :: next_mdt !: Index of extra variable representing MDT 65 67 ! 66 68 LOGICAL :: lenabled !: Logical switch for group being processed and not ignored … … 231 233 sdobsgroup%lvel3d = .false. 232 234 sdobsgroup%lsla = .false. 235 sdobsgroup%nadd_ssh = 0 236 sdobsgroup%next_mdt = 0 233 237 234 238 DO jtype = 1, jpmaxntypes … … 265 269 ELSEIF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_sla ) THEN 266 270 sdobsgroup%lsla = .true. 267 ! THESE WILL EACH NEED TO BE 1 (ADD=SSH, EXT=MDT) 268 sdobsgroup%naddvars = 0 269 sdobsgroup%nextvars = 0 271 ! SSH=additional, MDT=extra 272 sdobsgroup%naddvars = sdobsgroup%naddvars + 1 273 sdobsgroup%nextvars = sdobsgroup%nextvars + 1 274 sdobsgroup%nadd_ssh = sdobsgroup%naddvars 275 sdobsgroup%next_mdt = sdobsgroup%nextvars 270 276 ! DO THIS FOR FBD TOO 271 277 ENDIF -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_grid.F90
r14075 r15187 687 687 IF (ln_grid_search_lookup) THEN 688 688 689 WRITE(numout,*) 'Calling obs_grid_setup'689 IF(lwp) WRITE(numout,*) 'Calling obs_grid_setup' 690 690 691 691 IF(lwp) WRITE(numout,*) … … 724 724 ! initially assume size is as defined (to be fixed) 725 725 726 WRITE(numout,*) 'Reading: ',cfname726 IF(lwp) WRITE(numout,*) 'Reading: ',cfname 727 727 728 728 CALL chkerr( nf90_open( TRIM( cfname ), nf90_nowrite, idfile ), & -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_oper.F90
r15180 r15187 451 451 452 452 SUBROUTINE obs_surf_opt( surfdataqc, kt, kpi, kpj, & 453 & kit000, k var, kdaystp, psurf, psurfmask, &453 & kit000, kdaystp, kvar, psurf, psurfmask, & 454 454 & k2dint, ldnightav, plamscl, pphiscl, & 455 & lindegrees )455 & lindegrees, kssh, kmdt ) 456 456 457 457 !!----------------------------------------------------------------------- … … 510 510 LOGICAL, INTENT(IN) :: & 511 511 & lindegrees ! T=> plamscl and pphiscl are specified in degrees, F=> in metres 512 INTEGER, OPTIONAL, INTENT(IN) :: & 513 & kssh ! Index of additional variable representing SSH 514 INTEGER, OPTIONAL, INTENT(IN) :: & 515 & kmdt ! Index of extra variable representing MDT 512 516 513 517 !! * Local declarations … … 739 743 ELSE 740 744 741 ! Get weights to average the model SLAto the observation footprint745 ! Get weights to average the model field to the observation footprint 742 746 CALL obs_avg_h2d_init( 1, 1, imaxifp, imaxjfp, k2dint, zlam, zphi, & 743 747 & zglam(:,:,iobs), zgphi(:,:,iobs), & … … 746 750 & lindegrees, zweig, zobsmask ) 747 751 748 ! Average the model SSTto the observation footprint752 ! Average the model field to the observation footprint 749 753 CALL obs_avg_h2d( 1, 1, imaxifp, imaxjfp, & 750 754 & zweig, zsurftmp(:,:,iobs), zext ) 751 755 752 756 ENDIF 753 ! WHERE BEST TO DO THIS? 754 IF ( TRIM(surfdataqc%cvars( 1)) == 'SLA' .AND. surfdataqc%nextra == 2) THEN757 758 IF ( TRIM(surfdataqc%cvars(kvar)) == 'SLA' .AND. PRESENT(kssh) .AND. PRESENT(kmdt) ) THEN 755 759 ! ... Remove the MDT from the SSH at the observation point to get the SLA 756 surfdataqc%r ext(jobs,1) = zext(1)757 surfdataqc%rmod(jobs, 1) = surfdataqc%rext(jobs,1) - surfdataqc%rext(jobs,2)760 surfdataqc%radd(jobs,kssh,kvar) = zext(1) 761 surfdataqc%rmod(jobs,kvar) = surfdataqc%radd(jobs,kssh,kvar) - surfdataqc%rext(jobs,kmdt) 758 762 ELSE 759 surfdataqc%rmod(jobs,1) = zext(1) 760 ENDIF 761 763 surfdataqc%rmod(jobs,kvar) = zext(1) 764 ENDIF 765 ! DO THIS FOR FBD TOO 766 762 767 IF ( zext(1) == obfillflt ) THEN 763 768 ! If the observation value is a fill value, set QC flag to bad -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_read_prof.F90
r15180 r15187 235 235 IF ( inpfiles(jj)%nvar /= kvars ) THEN 236 236 CALL ctl_stop( 'Feedback format error: ', & 237 & ' unexpected number of vars in profile file' ) 237 & ' unexpected number of vars in feedback file', & 238 & TRIM(cdfilenames(jj)) ) 238 239 ENDIF 239 240 240 241 IF ( ldmod .AND. ( inpfiles(jj)%nadd == 0 ) ) THEN 241 CALL ctl_stop( 'Model not in input data' ) 242 CALL ctl_stop( 'Model not in input data in', & 243 & TRIM(cdfilenames(jj)) ) 244 RETURN 242 245 ENDIF 243 246 244 247 IF ( (iextr > 0) .AND. (inpfiles(jj)%next /= iextr) ) THEN 245 248 CALL ctl_stop( 'Number of extra variables not consistent', & 246 & ' with previous files for this type' ) 249 & ' with previous files for this type in', & 250 & TRIM(cdfilenames(jj)) ) 247 251 ELSE 248 252 iextr = inpfiles(jj)%next … … 258 262 END DO 259 263 IF ( ldmod .AND. ( inpfiles(jj)%nadd == iaddin ) ) THEN 260 CALL ctl_stop( 'Model not in input data' ) 264 CALL ctl_stop( 'Model not in input data', & 265 & TRIM(cdfilenames(jj)) ) 261 266 ENDIF 262 267 263 268 IF ( (iadd > 0) .AND. (iaddin /= iadd) ) THEN 264 269 CALL ctl_stop( 'Number of additional variables not consistent', & 265 & ' with previous files for this type' ) 270 & ' with previous files for this type in', & 271 & TRIM(cdfilenames(jj)) ) 266 272 ELSE 267 273 iadd = iaddin … … 313 319 IF ( inpfiles(jj)%cname(ji) /= clvarsin(ji) ) THEN 314 320 CALL ctl_stop( 'Feedback file variables not consistent', & 315 & ' with previous files for this type' ) 321 & ' with previous files for this type in', & 322 & TRIM(cdfilenames(jj)) ) 316 323 ENDIF 317 324 END DO … … 323 330 IF ( inpfiles(jj)%caddname(ji) /= claddvarsin(jadd) ) THEN 324 331 CALL ctl_stop( 'Feedback file additional variables not consistent', & 325 & ' with previous files for this type' ) 332 & ' with previous files for this type in', & 333 & TRIM(cdfilenames(jj)) ) 326 334 ENDIF 327 335 ENDIF … … 332 340 IF ( inpfiles(jj)%cextname(ji) /= clextvarsin(ji) ) THEN 333 341 CALL ctl_stop( 'Feedback file extra variables not consistent', & 334 & ' with previous files for this type' ) 342 & ' with previous files for this type in', & 343 & TRIM(cdfilenames(jj)) ) 335 344 ENDIF 336 345 END DO -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_read_surf.F90
r15180 r15187 204 204 IF ( inpfiles(jj)%nvar /= kvars ) THEN 205 205 CALL ctl_stop( 'Feedback format error: ', & 206 & ' unexpected number of vars in feedback file' ) 206 & ' unexpected number of vars in feedback file', & 207 & TRIM(cdfilenames(jj)) ) 207 208 ENDIF 208 209 209 210 IF ( ldmod .AND. ( inpfiles(jj)%nadd == 0 ) ) THEN 210 CALL ctl_stop( 'Model not in input data' ) 211 CALL ctl_stop( 'Model not in input data in', & 212 & TRIM(cdfilenames(jj)) ) 211 213 RETURN 212 214 ENDIF … … 214 216 IF ( (iextr > 0) .AND. (inpfiles(jj)%next /= iextr) ) THEN 215 217 CALL ctl_stop( 'Number of extra variables not consistent', & 216 & ' with previous files for this type' ) 218 & ' with previous files for this type in', & 219 & TRIM(cdfilenames(jj)) ) 217 220 ELSE 218 221 iextr = inpfiles(jj)%next … … 228 231 END DO 229 232 IF ( ldmod .AND. ( inpfiles(jj)%nadd == iaddin ) ) THEN 230 CALL ctl_stop( 'Model not in input data' ) 233 CALL ctl_stop( 'Model not in input data', & 234 & TRIM(cdfilenames(jj)) ) 231 235 ENDIF 232 236 233 237 IF ( (iadd > 0) .AND. (iaddin /= iadd) ) THEN 234 238 CALL ctl_stop( 'Number of additional variables not consistent', & 235 & ' with previous files for this type' ) 239 & ' with previous files for this type in', & 240 & TRIM(cdfilenames(jj)) ) 236 241 ELSE 237 242 iadd = iaddin … … 283 288 IF ( inpfiles(jj)%cname(ji) /= clvarsin(ji) ) THEN 284 289 CALL ctl_stop( 'Feedback file variables not consistent', & 285 & ' with previous files for this type' ) 290 & ' with previous files for this type in', & 291 & TRIM(cdfilenames(jj)) ) 286 292 ENDIF 287 293 END DO … … 293 299 IF ( inpfiles(jj)%caddname(ji) /= claddvarsin(jadd) ) THEN 294 300 CALL ctl_stop( 'Feedback file additional variables not consistent', & 295 & ' with previous files for this type' ) 301 & ' with previous files for this type in', & 302 & TRIM(cdfilenames(jj)) ) 296 303 ENDIF 297 304 ENDIF … … 302 309 IF ( inpfiles(jj)%cextname(ji) /= clextvarsin(ji) ) THEN 303 310 CALL ctl_stop( 'Feedback file extra variables not consistent', & 304 & ' with previous files for this type' ) 311 & ' with previous files for this type in', & 312 & TRIM(cdfilenames(jj)) ) 305 313 ENDIF 306 314 END DO -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_readmdt.F90
r15180 r15187 44 44 CONTAINS 45 45 46 SUBROUTINE obs_rea_mdt( sladata, k2dint )46 SUBROUTINE obs_rea_mdt( sladata, k2dint, kmdt ) 47 47 !!--------------------------------------------------------------------- 48 48 !! … … 59 59 TYPE(obs_surf), INTENT(inout) :: sladata ! SLA data 60 60 INTEGER , INTENT(in) :: k2dint ! ? 61 INTEGER , INTENT(in) :: kmdt ! Index of MDT extra var 61 62 ! 62 63 CHARACTER(LEN=12), PARAMETER :: cpname = 'obs_rea_mdt' … … 148 149 CALL obs_int_h2d( 1, 1, zweig, zmdtl(:,:,jobs), zext ) 149 150 150 ! FIGURE OUT THIS ASSIGNMENT 151 ! sladata%rext(jobs,2) = zext(1) 151 sladata%rext(jobs,kmdt) = zext(1) 152 152 153 153 ! mark any masked data with a QC flag … … 247 247 WRITE(numout,*) ' zcorr = ', zcorr 248 248 WRITE(numout,*) ' nn_msshc = ', nn_msshc 249 250 IF ( nn_msshc == 0 ) WRITE(numout,*) ' MSSH correction is not applied' 251 IF ( nn_msshc == 1 ) WRITE(numout,*) ' MSSH correction is applied' 252 IF ( nn_msshc == 2 ) WRITE(numout,*) ' User defined MSSH correction' 249 253 ENDIF 250 251 IF ( nn_msshc == 0 ) WRITE(numout,*) ' MSSH correction is not applied'252 IF ( nn_msshc == 1 ) WRITE(numout,*) ' MSSH correction is applied'253 IF ( nn_msshc == 2 ) WRITE(numout,*) ' User defined MSSH correction'254 254 255 255 ! -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_write.F90
r15180 r15187 91 91 INTEGER :: ilevel 92 92 INTEGER :: jvar 93 INTEGER :: jvar2 94 INTEGER :: jsal 93 95 INTEGER :: jo 94 96 INTEGER :: jk … … 145 147 ENDIF 146 148 END DO 147 !fbdata%cextname(1) = 'TEMP'148 !fbdata%cextlong(1) = 'Insitu temperature'149 !fbdata%cextunit(1) = 'Degrees centigrade'150 149 151 150 WRITE(clfname, FMT="(A,'fb_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc … … 230 229 END DO 231 230 ENDIF 232 !IF ( ( jvar == 1 ) .AND. &233 ! & ( TRIM(profdata%cvars(1)) == 'POTM' ) ) THEN234 ! fbdata%pext(ik,jo,1) = profdata%var(jvar)%vext(jk,1)235 !ENDIF236 231 END DO 237 232 END DO 238 233 END DO 239 234 240 !IF ( TRIM(profdata%cvars(1)) == 'POTM' ) THEN 241 ! ! Convert insitu temperature to potential temperature using the model 242 ! ! salinity if no potential temperature 243 ! DO jo = 1, fbdata%nobs 244 ! IF ( fbdata%pphi(jo) < 9999.0 ) THEN 245 ! DO jk = 1, fbdata%nlev 246 ! IF ( ( fbdata%pob(jk,jo,1) >= 9999.0 ) .AND. & 247 ! & ( fbdata%pdep(jk,jo) < 9999.0 ) .AND. & 248 ! & ( fbdata%padd(jk,jo,1,2) < 9999.0 ) .AND. & 249 ! & ( fbdata%pext(jk,jo,1) < 9999.0 ) ) THEN 250 ! zpres = dep_to_p( REAL(fbdata%pdep(jk,jo),wp), & 251 ! & REAL(fbdata%pphi(jo),wp) ) 252 ! fbdata%pob(jk,jo,1) = potemp( & 253 ! & REAL(fbdata%padd(jk,jo,1,2), wp), & 254 ! & REAL(fbdata%pext(jk,jo,1), wp), & 255 ! & zpres, 0.0_wp ) 256 ! ENDIF 257 ! END DO 258 ! ENDIF 259 ! END DO 260 !ENDIF 235 ! Convert insitu temperature to potential temperature using the model 236 ! salinity if no potential temperature 237 IF (iext > 0) THEN 238 DO jvar = 1, profdata%nvar 239 IF ( TRIM(profdata%cvars(jvar)) == 'POTM' ) THEN 240 jsal = 0 241 DO jvar2 = 1, profdata%nvar 242 IF ( TRIM(profdata%cvars(jvar2)) == 'PSAL' ) THEN 243 jsal = jvar2 244 EXIT 245 ENDIF 246 END DO 247 IF (jsal > 0) THEN 248 DO je = 1, iext 249 IF ( TRIM(fbdata%cextname(je)) == 'TEMP' ) THEN 250 DO jo = 1, fbdata%nobs 251 IF ( fbdata%pphi(jo) < 9999.0 ) THEN 252 DO jk = 1, fbdata%nlev 253 IF ( ( fbdata%pob(jk,jo,jvar) >= 9999.0 ) .AND. & 254 & ( fbdata%pdep(jk,jo) < 9999.0 ) .AND. & 255 & ( fbdata%padd(jk,jo,1,jsal) < 9999.0 ) .AND. & 256 & ( fbdata%pext(jk,jo,je) < 9999.0 ) ) THEN 257 zpres = dep_to_p( REAL(fbdata%pdep(jk,jo),wp), & 258 & REAL(fbdata%pphi(jo),wp) ) 259 fbdata%pob(jk,jo,jvar) = potemp( & 260 & REAL(fbdata%padd(jk,jo,1,jsal), wp), & 261 & REAL(fbdata%pext(jk,jo,je), wp), & 262 & zpres, 0.0_wp ) 263 ENDIF 264 END DO 265 ENDIF 266 END DO 267 EXIT 268 ENDIF 269 END DO 270 ENDIF 271 EXIT 272 ENDIF 273 END DO 274 ENDIF 261 275 262 276 ! Write the obfbdata structure
Note: See TracChangeset
for help on using the changeset viewer.