Changeset 15180 for NEMO/branches/UKMO/NEMO_4.0.4_generic_obs
- Timestamp:
- 2021-08-11T13:24:27+02:00 (3 years ago)
- Location:
- NEMO/branches/UKMO/NEMO_4.0.4_generic_obs
- Files:
-
- 11 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/cfgs/SHARED/namelist_ref
r15144 r15180 1261 1261 &namobs_dta ! observation and model comparison - external data (see: namobs) 1262 1262 !----------------------------------------------------------------------- 1263 cn_groupname = '' ! Name of obs group (for stdout)1264 ln_enabled = .true.! Logical switch for group being processed not ignored1265 ln_prof = .false.! Logical switch for profile data1266 ln_surf = .false.! Logical switch for surface data1267 cn_obsfiles = ''! Observation file names1268 cn_obstypes = ''! Observation types to read from files1269 ln_nea = .false.! Logical switch for rejecting observations near land1270 ln_bound_reject = .false.! Logical switch for rejecting obs near the boundary1271 ln_ignmis = .true.! Logical switch for ignoring missing files1272 nn_2dint = 0! Type of horizontal interpolation method1263 cn_groupname = '' ! Name of obs group (output file will be cn_groupname//'fb_????.nc') 1264 ln_enabled = .true. ! Logical switch for group being processed not ignored 1265 ln_prof = .false. ! Logical switch for profile data 1266 ln_surf = .false. ! Logical switch for surface data 1267 cn_obsfiles = '' ! Observation file names 1268 cn_obstypes = '' ! Observation types to read from files 1269 ln_nea = .false. ! Logical switch for rejecting observations near land 1270 ln_bound_reject = .false. ! Logical switch for rejecting obs near the boundary 1271 ln_ignmis = .true. ! Logical switch for ignoring missing files 1272 nn_2dint = 0 ! Type of horizontal interpolation method 1273 1273 ! Relevant if ln_prof = .true.: 1274 nn_1dint = 0 ! Type of vertical interpolation method 1275 nn_profdavtypes = -1 ! Profile data types representing a daily average 1274 nn_1dint = 0 ! Type of vertical interpolation method 1275 nn_profdavtypes = -1 ! Profile data types representing a daily average 1276 ln_all_at_all = .false. ! Logical switch for computing all model variables at all obs points 1276 1277 ! Relevant if ln_surf = .true.: 1277 ln_fp_indegs = .true. ! Logical: T=> averaging footprint is in degrees, F=> in metres 1278 rn_avglamscl = 0. ! E/W diameter of observation footprint (metres/degrees) 1279 rn_avgphiscl = 0. ! N/S diameter of observation footprint (metres/degrees) 1280 ln_night = .false. ! Logical switch for calculating night-time average for obs 1281 ! Relevant if 'SST' in cn_obstypes: 1282 ln_sstbias = .false. ! Logical switch for SST bias correction 1283 cn_sstbiasfiles = '' ! SST bias input file names 1278 ln_fp_indegs = .true. ! Logical: T=> averaging footprint is in degrees, F=> in metres 1279 rn_avglamscl = 0. ! E/W diameter of observation footprint (metres/degrees) 1280 rn_avgphiscl = 0. ! N/S diameter of observation footprint (metres/degrees) 1281 ln_night = .false. ! Logical switch for calculating night-time average for obs 1282 ln_obsbias = .false. ! Logical switch for bias correction 1283 cn_obsbiasfiles = '' ! Bias input file names 1284 cn_type_to_biascorrect = '' ! Observation type to bias correct 1285 cn_obsbiasfile_varname = '' ! Bias variable name in input file 1284 1286 ! Relevant if 'SLA' in cn_obstypes: 1285 ln_altbias = .false. ! Logical switch for altimeter bias correction 1286 cn_altbiasfile = '' ! Altimeter bias input file name 1287 nn_msshc = 0 ! MSSH correction scheme 1288 rn_mdtcorr = 1.61 ! MDT correction 1289 rn_mdtcutoff = 65.0 ! MDT cutoff for computed correction 1290 ln_time_mean_sla_bkg = .false. ! Logical switch for applying time mean of SLA background to remove tidal signal 1291 ! Relevant if 'POTM' and/or 'PSAL' in cn_obstypes: 1292 ln_s_at_t = .false. ! Logical switch for computing model S at T obs if not there 1293 ln_output_clim = .false. ! Logical switch for writing climatological values to fdbk files 1287 ln_altbias = .false. ! Logical switch for altimeter bias correction 1288 cn_altbiasfile = '' ! Altimeter bias input file name 1289 nn_msshc = 0 ! MSSH correction scheme 1290 rn_mdtcorr = 1.61 ! MDT correction 1291 rn_mdtcutoff = 65.0 ! MDT cutoff for computed correction 1292 !!! NOT YET IMPLEMENTED: 1293 !!! OUTPUT CLIMATOLOGY 1294 !!! TIME MEAN BACKGROUND 1294 1295 / 1295 1296 !----------------------------------------------------------------------- -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/diaobs.F90
r15144 r15180 28 28 USE par_kind ! Precision variables 29 29 USE in_out_manager ! I/O manager 30 USE timing ! Timing 30 31 USE par_oce ! ocean parameter 31 32 USE dom_oce ! Ocean space and time domain variables … … 34 35 USE obs_read_prof ! Reading and allocation of profile obs 35 36 USE obs_read_surf ! Reading and allocation of surface obs 36 USE obs_ sstbias ! Bias correction routine for SST37 USE obs_bias ! Bias correction routine 37 38 USE obs_readmdt ! Reading and allocation of MDT for SLA. 38 39 USE obs_prep ! Preparation of obs. (grid search etc). … … 197 198 llvar(:) = .TRUE. 198 199 ! 199 CALL obs_rea_prof( sobsgroups(jgroup)%sprofdata, & 200 & sobsgroups(jgroup)%nobsfiles, & 201 & sobsgroups(jgroup)%cobsfiles, & 202 & sobsgroups(jgroup)%nobstypes, & 203 & sobsgroups(jgroup)%nextvars, & 204 & nitend-nit000+2, & 205 & rn_dobsini, & 206 & rn_dobsend, & 207 & llvar, & 208 & sobsgroups(jgroup)%lignmis, & 209 & sobsgroups(jgroup)%ls_at_t, & 210 & .FALSE., & 211 & sobsgroups(jgroup)%cobstypes, & 200 CALL obs_rea_prof( sobsgroups(jgroup)%sprofdata, & 201 & sobsgroups(jgroup)%nobsfiles, & 202 & sobsgroups(jgroup)%cobsfiles, & 203 & sobsgroups(jgroup)%nobstypes, & 204 & sobsgroups(jgroup)%naddvars, & 205 & sobsgroups(jgroup)%nextvars, & 206 & nitend-nit000+2, & 207 & rn_dobsini, & 208 & rn_dobsend, & 209 & llvar, & 210 & sobsgroups(jgroup)%lignmis, & 211 & sobsgroups(jgroup)%lall_at_all, & 212 & .FALSE., & 213 & sobsgroups(jgroup)%cobstypes, & 212 214 & kdailyavtypes = sobsgroups(jgroup)%nprofdavtypes ) 213 215 ! … … 237 239 & sobsgroups(jgroup)%cobsfiles, & 238 240 & sobsgroups(jgroup)%nobstypes, & 241 & sobsgroups(jgroup)%naddvars, & 239 242 & sobsgroups(jgroup)%nextvars, & 240 243 & nitend-nit000+2, & … … 246 249 & sobsgroups(jgroup)%cobstypes ) 247 250 ! 248 CALL obs_pre_surf( sobsgroups(jgroup)%ssurfdata, & 249 & sobsgroups(jgroup)%ssurfdataqc, & 250 & sobsgroups(jgroup)%lnea, & 251 252 CALL obs_pre_surf( sobsgroups(jgroup)%ssurfdata, & 253 & sobsgroups(jgroup)%ssurfdataqc, & 254 & jpi, jpj, & 255 & sobsgroups(jgroup)%rmask(:,:,1,:), & 256 & sobsgroups(jgroup)%rglam, & 257 & sobsgroups(jgroup)%rgphi, & 258 & sobsgroups(jgroup)%lnea, & 251 259 & sobsgroups(jgroup)%lbound_reject ) 252 260 ! … … 261 269 ENDIF 262 270 ! 263 IF( sobsgroups(jgroup)%lsst .AND. sobsgroups(jgroup)%lsstbias ) THEN 264 CALL obs_app_sstbias( sobsgroups(jgroup)%ssurfdataqc, & 265 & sobsgroups(jgroup)%n2dint, & 266 & sobsgroups(jgroup)%nsstbiasfiles, & 267 & sobsgroups(jgroup)%csstbiasfiles ) 271 IF( sobsgroups(jgroup)%lobsbias ) THEN 272 CALL obs_app_bias( sobsgroups(jgroup)%ssurfdataqc, & 273 & sobsgroups(jgroup)%nbiasvar, & 274 & sobsgroups(jgroup)%n2dint, & 275 & sobsgroups(jgroup)%nobsbiasfiles, & 276 & sobsgroups(jgroup)%cobsbiasfiles, & 277 & sobsgroups(jgroup)%cbiasvarname ) 268 278 ENDIF 269 279 ! … … 315 325 316 326 !----------------------------------------------------------------------- 327 328 IF( ln_timing ) CALL timing_start('dia_obs') 317 329 318 330 IF(lwp) THEN … … 405 417 & kstp, jpi, jpj, & 406 418 & nit000, idaystp, & 407 & zsurfvar,&419 & jvar, zsurfvar, & 408 420 & sobsgroups(jgroup)%rmask(:,:,1,jvar), & 409 421 & sobsgroups(jgroup)%n2dint, & … … 421 433 ENDIF 422 434 END DO 435 436 IF( ln_timing ) CALL timing_stop('dia_obs') 423 437 424 438 END SUBROUTINE dia_obs … … 449 463 !! * Local declarations 450 464 INTEGER :: jgroup ! Data set loop variable 451 INTEGER :: jo, jvar, jk 465 INTEGER :: jo, jvar, jk, jadd, jext 452 466 REAL(wp), DIMENSION(:), ALLOCATABLE :: & 453 467 & zu, & 454 468 & zv 469 TYPE(obswriinfo) :: sladd, slext 470 471 IF( ln_timing ) CALL timing_start('dia_obs_wri') 455 472 456 473 !----------------------------------------------------------------------- … … 496 513 & sobsgroups(jgroup)%sprofdata, .TRUE., numout ) 497 514 498 CALL obs_wri_prof( sobsgroups(jgroup)%sprofdata ) 515 sladd%inum = sobsgroups(jgroup)%sprofdata%nadd 516 IF ( sladd%inum > 0 ) THEN 517 ALLOCATE( sladd%ipoint(sladd%inum), & 518 & sladd%cdname(sladd%inum), & 519 & sladd%cdlong(sladd%inum,sobsgroups(jgroup)%sprofdata%nvar), & 520 & 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) 527 END DO 528 END DO 529 ENDIF 530 slext%inum = sobsgroups(jgroup)%sprofdata%next 531 IF ( slext%inum > 0 ) THEN 532 ALLOCATE( slext%ipoint(slext%inum), & 533 & slext%cdname(slext%inum), & 534 & slext%cdlong(slext%inum,1), & 535 & 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 543 544 CALL obs_wri_prof( sobsgroups(jgroup)%sprofdata, sobsgroups(jgroup)%cgroupname, sladd, slext ) 545 546 IF ( sladd%inum > 0 ) THEN 547 DEALLOCATE( sladd%ipoint, sladd%cdname, sladd%cdlong, sladd%cdunit ) 548 ENDIF 549 IF ( slext%inum > 0 ) THEN 550 DEALLOCATE( slext%ipoint, slext%cdname, slext%cdlong, slext%cdunit ) 551 ENDIF 499 552 500 553 ELSEIF (sobsgroups(jgroup)%lsurf) THEN … … 503 556 & sobsgroups(jgroup)%ssurfdata, .TRUE., numout ) 504 557 505 CALL obs_wri_surf( sobsgroups(jgroup)%ssurfdata ) 558 sladd%inum = sobsgroups(jgroup)%ssurfdata%nadd 559 IF ( sladd%inum > 0 ) THEN 560 ALLOCATE( sladd%ipoint(sladd%inum), & 561 & sladd%cdname(sladd%inum), & 562 & sladd%cdlong(sladd%inum,sobsgroups(jgroup)%ssurfdata%nvar), & 563 & 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) 570 END DO 571 END DO 572 ENDIF 573 slext%inum = sobsgroups(jgroup)%ssurfdata%nextra 574 IF ( slext%inum > 0 ) THEN 575 ALLOCATE( slext%ipoint(slext%inum), & 576 & slext%cdname(slext%inum), & 577 & slext%cdlong(slext%inum,1), & 578 & 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 586 587 CALL obs_wri_surf( sobsgroups(jgroup)%ssurfdata, sobsgroups(jgroup)%cgroupname, sladd, slext ) 588 589 IF ( sladd%inum > 0 ) THEN 590 DEALLOCATE( sladd%ipoint, sladd%cdname, sladd%cdlong, sladd%cdunit ) 591 ENDIF 592 IF ( slext%inum > 0 ) THEN 593 DEALLOCATE( slext%ipoint, slext%cdname, slext%cdlong, slext%cdunit ) 594 ENDIF 506 595 507 596 ENDIF … … 510 599 511 600 END DO 601 602 IF( ln_timing ) CALL timing_stop('dia_obs_wri') 512 603 513 604 END SUBROUTINE dia_obs_wri -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_bias.F90
r15179 r15180 1 MODULE obs_ sstbias1 MODULE obs_bias 2 2 !!====================================================================== 3 !! *** MODULE obs_ sstbias ***4 !! Observation diagnostics: Read the bias for SSTdata3 !! *** MODULE obs_bias *** 4 !! Observation diagnostics: Read the bias for observation data 5 5 !!====================================================================== 6 6 !!---------------------------------------------------------------------- 7 !! obs_app_ sstbias : Driver for reading and applying the SSTbias7 !! obs_app_bias : Driver for reading and applying the bias 8 8 !!---------------------------------------------------------------------- 9 9 !! * Modules used 10 10 USE par_kind, ONLY : & ! Precision variables 11 & wp, & 12 & dp, & 13 & sp 11 & wp 14 12 USE par_oce, ONLY : & ! Domain parameters 15 13 & jpi, & 16 & jpj, & 17 & jpim1 14 & jpj 18 15 USE in_out_manager, ONLY : & ! I/O manager 19 16 & lwp, & … … 22 19 USE dom_oce, ONLY : & ! Domain variables 23 20 & tmask, & 24 & tmask_i, &25 & e1t, &26 & e2t, &27 21 & gphit, & 28 22 & glamt 29 USE oce, ONLY : & ! Model variables30 & sshn31 23 USE obs_inter_h2d 32 24 USE obs_utils ! Various observation tools … … 35 27 !! * Routine accessibility 36 28 PRIVATE 37 PUBLIC obs_app_ sstbias ! Read the altimeterbias29 PUBLIC obs_app_bias ! Read the observation bias 38 30 CONTAINS 39 SUBROUTINE obs_app_ sstbias( sstdata, k2dint, knumtypes, &40 cl_bias_files)31 SUBROUTINE obs_app_bias( obsdata, kvar, k2dint, knumtypes, & 32 cl_bias_files, cd_biasname ) 41 33 !!--------------------------------------------------------------------- 42 34 !! 43 !! *** ROUTINE obs_app_ sstbias ***44 !! 45 !! ** Purpose : Read SSTbias data from files and apply correction to46 !! observations35 !! *** ROUTINE obs_app_bias *** 36 !! 37 !! ** Purpose : Read bias data from files and apply correction to 38 !! observations 47 39 !! 48 40 !! ** Method : … … 54 46 !! History : 55 47 !! ! : 2014-08 (J. While) Bias correction code for SST obs, 56 !! ! based on obs_rea_altbias 48 !! ! based on obs_rea_altbias 49 !! ! : 2021-07 (D. Ford) Renamed obs_app_bias and made generic 57 50 !!---------------------------------------------------------------------- 58 51 !! * Modules used … … 61 54 !! * Arguments 62 55 63 TYPE(obs_surf), INTENT(INOUT) :: sstdata ! SST data 56 TYPE(obs_surf), INTENT(INOUT) :: obsdata ! Observation data 57 INTEGER, INTENT(IN) :: kvar ! Index of obs type being bias corrected 64 58 INTEGER, INTENT(IN) :: k2dint 65 59 INTEGER, INTENT(IN) :: knumtypes !number of bias types to read in 66 60 CHARACTER(LEN=128), DIMENSION(knumtypes), INTENT(IN) :: & 67 61 cl_bias_files !List of files to read 62 CHARACTER(LEN=128), INTENT(IN) :: cd_biasname !Variable name in file 68 63 !! * Local declarations 69 64 INTEGER :: jobs ! Obs loop variable 70 INTEGER :: jpisstbias ! Number of grid point in latitude for the bias71 INTEGER :: jpjsstbias ! Number of grid point in longitude for the bias72 65 INTEGER :: iico ! Grid point indices 73 66 INTEGER :: ijco 74 67 INTEGER :: jt 75 INTEGER :: i_nx_id ! Index to read the NetCDF file76 INTEGER :: i_ny_id !77 INTEGER :: i_file_id !78 INTEGER :: i_var_id79 68 INTEGER, DIMENSION(knumtypes) :: & 80 69 & ibiastypes ! Array of the bias types in each file 81 70 REAL(wp), DIMENSION(jpi,jpj,knumtypes) :: & 82 & z_ sstbias ! Array to store the SSTbias values71 & z_obsbias ! Array to store the bias values 83 72 REAL(wp), DIMENSION(jpi,jpj) :: & 84 & z_ sstbias_2d ! Array to store the SSTbias values73 & z_obsbias_2d ! Array to store the bias values 85 74 REAL(wp), DIMENSION(1) :: & 86 75 & zext, & … … 105 94 & igrdi_tmp, & 106 95 & igrdj_tmp 107 INTEGER :: num sstbias96 INTEGER :: numobsbias 108 97 INTEGER(KIND=NF90_INT) :: ifile_source 109 98 … … 113 102 INTEGER :: inumtype 114 103 IF(lwp)WRITE(numout,*) 115 IF(lwp)WRITE(numout,*) 'obs_ rea_sstbias : '104 IF(lwp)WRITE(numout,*) 'obs_app_bias : ' 116 105 IF(lwp)WRITE(numout,*) '----------------- ' 117 IF(lwp)WRITE(numout,*) 'Read SST bias '106 IF(lwp)WRITE(numout,*) 'Read observation bias for ', TRIM(obsdata%cvars(kvar)) 118 107 ! Open and read the files 119 z_ sstbias(:,:,:)=0.0_wp108 z_obsbias(:,:,:)=0.0_wp 120 109 DO jtype = 1, knumtypes 121 110 122 num sstbias=0111 numobsbias=0 123 112 IF(lwp)WRITE(numout,*) 'Opening ',cl_bias_files(jtype) 124 CALL iom_open( cl_bias_files(jtype), num sstbias, ldstop=.FALSE. )125 IF (num sstbias > 0) THEN113 CALL iom_open( cl_bias_files(jtype), numobsbias, ldstop=.FALSE. ) 114 IF (numobsbias > 0) THEN 126 115 127 116 !Read the bias type from the file … … 130 119 !routines directly - should be upgraded in the future 131 120 iret=NF90_OPEN(TRIM(cl_bias_files(jtype)), NF90_NOWRITE, incfile) 132 iret=NF90_GET_ATT( incfile, NF90_GLOBAL, "SST_source", &121 iret=NF90_GET_ATT( incfile, NF90_GLOBAL, TRIM(obsdata%cvars(kvar))//"_source", & 133 122 ifile_source ) 134 123 ibiastypes(jtype) = ifile_source … … 136 125 137 126 IF ( iret /= 0 ) CALL ctl_stop( & 138 'obs_ rea_sstbias : Cannot read bias type from file '// &127 'obs_app_bias : Cannot read bias type from file '// & 139 128 cl_bias_files(jtype) ) 140 ! Get the SSTbias data141 CALL iom_get( num sstbias, jpdom_data, 'tn', z_sstbias_2d(:,:), 1 )142 z_ sstbias(:,:,jtype) = z_sstbias_2d(:,:)129 ! Get the bias data 130 CALL iom_get( numobsbias, jpdom_data, TRIM(cd_biasname), z_obsbias_2d(:,:), 1 ) 131 z_obsbias(:,:,jtype) = z_obsbias_2d(:,:) 143 132 ! Close the file 144 CALL iom_close(num sstbias)133 CALL iom_close(numobsbias) 145 134 ELSE 146 CALL ctl_stop('obs_ read_sstbias: File '// &135 CALL ctl_stop('obs_app_bias: File '// & 147 136 TRIM( cl_bias_files(jtype) )//' Not found') 148 137 ENDIF … … 151 140 ! Interpolate the bias already on the model grid at the observation point 152 141 ALLOCATE( & 153 & igrdi(2,2, sstdata%nsurf), &154 & igrdj(2,2, sstdata%nsurf), &155 & zglam(2,2, sstdata%nsurf), &156 & zgphi(2,2, sstdata%nsurf), &157 & zmask(2,2, sstdata%nsurf) )142 & igrdi(2,2,obsdata%nsurf), & 143 & igrdj(2,2,obsdata%nsurf), & 144 & zglam(2,2,obsdata%nsurf), & 145 & zgphi(2,2,obsdata%nsurf), & 146 & zmask(2,2,obsdata%nsurf) ) 158 147 159 DO jobs = 1, sstdata%nsurf160 igrdi(1,1,jobs) = sstdata%mi(jobs)-1161 igrdj(1,1,jobs) = sstdata%mj(jobs)-1162 igrdi(1,2,jobs) = sstdata%mi(jobs)-1163 igrdj(1,2,jobs) = sstdata%mj(jobs)164 igrdi(2,1,jobs) = sstdata%mi(jobs)165 igrdj(2,1,jobs) = sstdata%mj(jobs)-1166 igrdi(2,2,jobs) = sstdata%mi(jobs)167 igrdj(2,2,jobs) = sstdata%mj(jobs)148 DO jobs = 1, obsdata%nsurf 149 igrdi(1,1,jobs) = obsdata%mi(jobs)-1 150 igrdj(1,1,jobs) = obsdata%mj(jobs)-1 151 igrdi(1,2,jobs) = obsdata%mi(jobs)-1 152 igrdj(1,2,jobs) = obsdata%mj(jobs) 153 igrdi(2,1,jobs) = obsdata%mi(jobs) 154 igrdj(2,1,jobs) = obsdata%mj(jobs)-1 155 igrdi(2,2,jobs) = obsdata%mi(jobs) 156 igrdj(2,2,jobs) = obsdata%mj(jobs) 168 157 END DO 169 CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, jpi, jpj, &158 CALL obs_int_comm_2d( 2, 2, obsdata%nsurf, jpi, jpj, & 170 159 & igrdi, igrdj, glamt, zglam ) 171 CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, jpi, jpj, &160 CALL obs_int_comm_2d( 2, 2, obsdata%nsurf, jpi, jpj, & 172 161 & igrdi, igrdj, gphit, zgphi ) 173 CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, jpi, jpj, &162 CALL obs_int_comm_2d( 2, 2, obsdata%nsurf, jpi, jpj, & 174 163 & igrdi, igrdj, tmask(:,:,1), zmask ) 175 164 DO jtype = 1, knumtypes 176 165 177 166 !Find the number observations of type and allocate tempory arrays 178 inumtype = COUNT( sstdata%ntyp(:) == ibiastypes(jtype) )167 inumtype = COUNT( obsdata%ntyp(:) == ibiastypes(jtype) ) 179 168 ALLOCATE( & 180 169 & igrdi_tmp(2,2,inumtype), & … … 185 174 & zbias( 2,2,inumtype ) ) 186 175 jt=1 187 DO jobs = 1, sstdata%nsurf188 IF ( sstdata%ntyp(jobs) == ibiastypes(jtype) ) THEN176 DO jobs = 1, obsdata%nsurf 177 IF ( obsdata%ntyp(jobs) == ibiastypes(jtype) ) THEN 189 178 igrdi_tmp(:,:,jt) = igrdi(:,:,jobs) 190 179 igrdj_tmp(:,:,jt) = igrdj(:,:,jobs) … … 198 187 CALL obs_int_comm_2d( 2, 2, inumtype, jpi, jpj, & 199 188 & igrdi_tmp(:,:,:), igrdj_tmp(:,:,:), & 200 & z_ sstbias(:,:,jtype), zbias(:,:,:) )189 & z_obsbias(:,:,jtype), zbias(:,:,:) ) 201 190 jt=1 202 DO jobs = 1, sstdata%nsurf203 IF ( sstdata%ntyp(jobs) == ibiastypes(jtype) ) THEN204 zlam = sstdata%rlam(jobs)205 zphi = sstdata%rphi(jobs)206 iico = sstdata%mi(jobs)207 ijco = sstdata%mj(jobs)191 DO jobs = 1, obsdata%nsurf 192 IF ( obsdata%ntyp(jobs) == ibiastypes(jtype) ) THEN 193 zlam = obsdata%rlam(jobs) 194 zphi = obsdata%rphi(jobs) 195 iico = obsdata%mi(jobs) 196 ijco = obsdata%mj(jobs) 208 197 CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi, & 209 198 & zglam_tmp(:,:,jt), & … … 211 200 & zmask_tmp(:,:,jt), zweig, zobsmask ) 212 201 CALL obs_int_h2d( 1, 1, zweig, zbias(:,:,jt), zext ) 213 ! adjust sstwith bias field214 sstdata%robs(jobs,1) = sstdata%robs(jobs,1) - zext(1)202 ! adjust observations with bias field 203 obsdata%robs(jobs,kvar) = obsdata%robs(jobs,kvar) - zext(1) 215 204 jt=jt+1 216 205 ENDIF … … 235 224 IF(lwp) THEN 236 225 WRITE(numout,*) " " 237 WRITE(numout,*) " SST bias correction applied successfully"226 WRITE(numout,*) "Bias correction applied successfully" 238 227 WRITE(numout,*) "Obs types: ",ibiastypes(:), & 239 228 " Have all been bias corrected\n" 240 229 ENDIF 241 END SUBROUTINE obs_app_ sstbias230 END SUBROUTINE obs_app_bias 242 231 243 END MODULE obs_ sstbias232 END MODULE obs_bias -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_field.F90
r15144 r15180 37 37 38 38 ! Expected names for observation types with special behaviours (not needed for all observation types) 39 CHARACTER(LEN=8) :: cobsname_sst = 'SST' ! Expected variable name for SST40 CHARACTER(LEN=8) :: cobsname_temp3d = 'POTM' ! Expected variable name for 3D temperature41 CHARACTER(LEN=8) :: cobsname_sal3d = 'PSAL' ! Expected variable name for 3D salinity42 39 CHARACTER(LEN=8) :: cobsname_uvel3d = 'UVEL' ! Expected variable name for 3D zonal currents 43 40 CHARACTER(LEN=8) :: cobsname_vvel3d = 'VVEL' ! Expected variable name for 3D meridional currents … … 47 44 TYPE obs_group 48 45 ! 49 CHARACTER(LEN= 128):: cgroupname !: Name of obs group (for stdout)46 CHARACTER(LEN=25) :: cgroupname !: Name of obs group (for stdout) 50 47 CHARACTER(LEN=8), DIMENSION(:), ALLOCATABLE :: cobstypes !: Observation types to read from files 51 48 CHARACTER(LEN=128), DIMENSION(:), ALLOCATABLE :: cobsfiles !: Observation file names 52 CHARACTER(LEN=128), DIMENSION(:), ALLOCATABLE :: csstbiasfiles !: SST bias input file names 49 CHARACTER(LEN=128), DIMENSION(:), ALLOCATABLE :: cobsbiasfiles !: Bias input file names 50 CHARACTER(LEN=128) :: cbiasvarname !: Bias variable name in input file 53 51 CHARACTER(LEN=128) :: caltbiasfile !: Altimeter bias input file name 54 52 ! … … 57 55 INTEGER :: nobstypes !: Number of observation types 58 56 INTEGER :: nobsfiles !: Number of observation files 59 INTEGER :: n extvars !: Number of extra variables to get60 INTEGER :: n sstbiasfiles !: Number of SST bias files57 INTEGER :: nobsbiasfiles !: Number of bias files 58 INTEGER :: nbiasvar !: Index of observation type to be bias corrected 61 59 INTEGER :: navtypes !: Number of profile data types representing a daily average 60 INTEGER :: nextvars !: Number of extra variables in addition to any in input files 61 INTEGER :: naddvars !: Number of additional variables in addition to any in input files 62 62 INTEGER :: n1dint !: Type of vertical interpolation method 63 63 INTEGER :: n2dint !: Type of horizontal interpolation method … … 67 67 LOGICAL :: lsurf !: Logical switch for surface data 68 68 LOGICAL :: lprof !: Logical switch for profile data 69 LOGICAL :: lsst !: Logical switch for SST data70 LOGICAL :: ltemp3d !: Logical switch for 3D temperature data71 LOGICAL :: lsal3d !: Logical switch for 3D salinity data72 69 LOGICAL :: lvel3d !: Logical switch for 3D velocity data 73 70 LOGICAL :: lsla !: Logical switch for SLA data 74 71 LOGICAL :: laltbias !: Logical switch for altimeter bias correction 75 LOGICAL :: l sstbias !: Logical switch for SSTbias correction72 LOGICAL :: lobsbias !: Logical switch for bias correction 76 73 LOGICAL :: lnea !: Logical switch for rejecting observations near land 77 74 LOGICAL :: lbound_reject !: Logical switch for rejecting obs near the boundary 78 75 LOGICAL :: lignmis !: Logical switch for ignoring missing files 79 LOGICAL :: l s_at_t !: Logical switch for computing model S at T obs if not there76 LOGICAL :: lall_at_all !: Logical switch for computing all model variables at all obs points 80 77 LOGICAL :: lnight !: Logical switch for calculating night-time average 81 LOGICAL :: loutput_clim !: Logical switch for writing climatological values to fdbk files82 LOGICAL :: ltime_mean_sla_bkg !: Logical switch for applying time mean of SLA background to remove tidal signal83 78 LOGICAL :: lfp_indegs !: Logical: T=> averaging footprint is in degrees, F=> in metres 84 79 ! … … 118 113 ALLOCATE( sdobsgroup%cobstypes (sdobsgroup%nobstypes ), & 119 114 & sdobsgroup%cobsfiles (sdobsgroup%nobsfiles ), & 120 & sdobsgroup%c sstbiasfiles(sdobsgroup%nsstbiasfiles ), &115 & sdobsgroup%cobsbiasfiles(sdobsgroup%nobsbiasfiles ), & 121 116 & sdobsgroup%nprofdavtypes(sdobsgroup%navtypes ), & 122 117 & sdobsgroup%rglam (jpi,jpj, sdobsgroup%nobstypes), & … … 144 139 DEALLOCATE( sdobsgroup%cobstypes, & 145 140 & sdobsgroup%cobsfiles, & 146 & sdobsgroup%c sstbiasfiles, &141 & sdobsgroup%cobsbiasfiles, & 147 142 & sdobsgroup%nprofdavtypes, & 148 143 & sdobsgroup%rglam, & … … 174 169 CHARACTER(LEN=8), DIMENSION(jpmaxntypes) :: cn_obstypes 175 170 CHARACTER(LEN=128), DIMENSION(jpmaxnfiles) :: cn_obsfiles 176 CHARACTER(LEN=128), DIMENSION(jpmaxnfiles) :: cn_sstbiasfiles 171 CHARACTER(LEN=128), DIMENSION(jpmaxnfiles) :: cn_obsbiasfiles 172 CHARACTER(LEN=128) :: cn_type_to_biascorrect 173 CHARACTER(LEN=128) :: cn_obsbiasfile_varname 177 174 CHARACTER(LEN=128) :: cn_altbiasfile 178 175 INTEGER, DIMENSION(imaxavtypes) :: nn_profdavtypes … … 184 181 LOGICAL :: ln_prof 185 182 LOGICAL :: ln_altbias 186 LOGICAL :: ln_ sstbias183 LOGICAL :: ln_obsbias 187 184 LOGICAL :: ln_nea 188 185 LOGICAL :: ln_bound_reject 189 186 LOGICAL :: ln_ignmis 190 LOGICAL :: ln_ s_at_t187 LOGICAL :: ln_all_at_all 191 188 LOGICAL :: ln_night 192 LOGICAL :: ln_output_clim193 LOGICAL :: ln_time_mean_sla_bkg194 189 LOGICAL :: ln_fp_indegs 195 190 REAL(wp) :: rn_avglamscl … … 201 196 & cn_obsfiles, cn_obstypes, ln_nea, ln_bound_reject, & 202 197 & ln_ignmis, nn_2dint, nn_1dint, nn_profdavtypes, & 203 & ln_fp_indegs, rn_avglamscl, rn_avgphiscl, ln_sstbias, & 204 & cn_sstbiasfiles, ln_night, ln_altbias, & 198 & ln_fp_indegs, rn_avglamscl, rn_avgphiscl, ln_obsbias, & 199 & cn_obsbiasfiles, cn_type_to_biascorrect, & 200 & cn_obsbiasfile_varname, ln_night, ln_altbias, & 205 201 & cn_altbiasfile, nn_msshc, rn_mdtcorr, rn_mdtcutoff, & 206 & ln_ time_mean_sla_bkg, ln_s_at_t, ln_output_clim202 & ln_all_at_all 207 203 !!---------------------------------------------------------------------- 208 204 209 205 cn_obstypes(:) = '' 210 206 cn_obsfiles(:) = '' 211 cn_ sstbiasfiles(:) = ''207 cn_obsbiasfiles(:) = '' 212 208 nn_profdavtypes(:) = -1 213 209 … … 229 225 sdobsgroup%nobstypes = 0 230 226 sdobsgroup%nobsfiles = 0 227 sdobsgroup%naddvars = 0 231 228 sdobsgroup%nextvars = 0 232 229 sdobsgroup%navtypes = 0 233 sdobsgroup%nsstbiasfiles = 0 234 sdobsgroup%lsst = .false. 235 sdobsgroup%ltemp3d = .false. 236 sdobsgroup%lsal3d = .false. 230 sdobsgroup%nobsbiasfiles = 0 237 231 sdobsgroup%lvel3d = .false. 238 232 sdobsgroup%lsla = .false. … … 254 248 END DO 255 249 DO jfile = 1, jpmaxnfiles 256 IF ( TRIM(cn_ sstbiasfiles(jfile)) /= '' ) THEN257 sdobsgroup%n sstbiasfiles = sdobsgroup%nsstbiasfiles + 1250 IF ( TRIM(cn_obsbiasfiles(jfile)) /= '' ) THEN 251 sdobsgroup%nobsbiasfiles = sdobsgroup%nobsbiasfiles + 1 258 252 ENDIF 259 253 END DO … … 266 260 itype = itype + 1 267 261 sdobsgroup%cobstypes(itype) = TRIM(cn_obstypes(jtype)) 268 IF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_sst ) THEN 269 sdobsgroup%lsst = .true. 270 ELSEIF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_temp3d ) THEN 271 sdobsgroup%ltemp3d = .true. 272 sdobsgroup%nextvars = sdobsgroup%nextvars + 1 273 ELSEIF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_sal3d ) THEN 274 sdobsgroup%lsal3d = .true. 275 ELSEIF ( (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_uvel3d) .OR. & 276 & (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_vvel3d) ) THEN 262 IF ( (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_uvel3d) .OR. & 263 & (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_vvel3d) ) THEN 277 264 sdobsgroup%lvel3d = .true. 278 sdobsgroup%nextvars = sdobsgroup%nextvars + 1279 265 ELSEIF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_sla ) THEN 280 266 sdobsgroup%lsla = .true. 281 sdobsgroup%nextvars = sdobsgroup%nextvars + 2 267 ! THESE WILL EACH NEED TO BE 1 (ADD=SSH, EXT=MDT) 268 sdobsgroup%naddvars = 0 269 sdobsgroup%nextvars = 0 270 ! DO THIS FOR FBD TOO 282 271 ENDIF 283 272 ! … … 313 302 ifile = 0 314 303 DO jfile = 1, jpmaxnfiles 315 IF ( TRIM(cn_ sstbiasfiles(jfile)) /= '' ) THEN304 IF ( TRIM(cn_obsbiasfiles(jfile)) /= '' ) THEN 316 305 ifile = ifile + 1 317 sdobsgroup%csstbiasfiles(ifile) = cn_sstbiasfiles(jfile) 318 ENDIF 319 END DO 306 sdobsgroup%cobsbiasfiles(ifile) = cn_obsbiasfiles(jfile) 307 ENDIF 308 END DO 309 IF ( ln_obsbias ) THEN 310 sdobsgroup%nbiasvar = -1 311 DO jtype = 1, sdobsgroup%nobstypes 312 IF ( TRIM(sdobsgroup%cobstypes(itype)) == TRIM(cn_type_to_biascorrect) ) THEN 313 sdobsgroup%nbiasvar = jtype 314 EXIT 315 ENDIF 316 ENDDO 317 ENDIF 320 318 321 319 sdobsgroup%caltbiasfile = cn_altbiasfile … … 326 324 sdobsgroup%lprof = ln_prof 327 325 sdobsgroup%laltbias = ln_altbias 328 sdobsgroup%lsstbias = ln_sstbias 326 sdobsgroup%lobsbias = ln_obsbias 327 sdobsgroup%cbiasvarname = cn_obsbiasfile_varname 329 328 sdobsgroup%lnea = ln_nea 330 329 sdobsgroup%lbound_reject = ln_bound_reject 331 330 sdobsgroup%lignmis = ln_ignmis 332 sdobsgroup%l s_at_t = ln_s_at_t331 sdobsgroup%lall_at_all = ln_all_at_all 333 332 sdobsgroup%lnight = ln_night 334 sdobsgroup%loutput_clim = ln_output_clim335 sdobsgroup%ltime_mean_sla_bkg = ln_time_mean_sla_bkg336 333 sdobsgroup%lfp_indegs = ln_fp_indegs 337 334 sdobsgroup%ravglamscl = rn_avglamscl … … 395 392 WRITE(numout,*) ' N/S diameter of obs footprint rn_avgphiscl = ', sdobsgroup%ravgphiscl 396 393 WRITE(numout,*) ' Logical switch for night-time average ln_night = ', sdobsgroup%lnight 394 WRITE(numout,*) ' Logical switch for bias correction ln_obsbias = ', sdobsgroup%lobsbias 395 IF ( sdobsgroup%lobsbias ) THEN 396 WRITE(numout,*) ' Observation type to be bias corrected cn_type_to_biascorrect = ', TRIM(sdobsgroup%cobstypes(sdobsgroup%nbiasvar)) 397 WRITE(numout,*) ' Bias variable name in bias files cn_obsbiasfile_varname = ', TRIM(sdobsgroup%cbiasvarname) 398 WRITE(numout,*) ' Bias files in group:', sdobsgroup%nobsbiasfiles 399 DO jfile = 1, sdobsgroup%nobsbiasfiles 400 WRITE(numout,*) ' ', TRIM(sdobsgroup%cobsbiasfiles(jfile)) 401 END DO 402 ENDIF 397 403 WRITE(numout,*) ' Settings only for profile data, which is ', sdobsgroup%lprof 398 404 WRITE(numout,*) ' Type of vertical interpolation method nn_1dint = ', sdobsgroup%n1dint 399 405 WRITE(numout,*) ' Daily average types nn_profdavtypes = ', sdobsgroup%nprofdavtypes 400 WRITE(numout,*) ' Settings only for SST data, which is ', sdobsgroup%lsst 401 WRITE(numout,*) ' Logical switch for sst bias ln_sstbias = ', sdobsgroup%lsstbias 402 IF ( sdobsgroup%lsstbias ) THEN 403 WRITE(numout,*) ' SST bias files in group:' 404 DO jfile = 1, sdobsgroup%nsstbiasfiles 405 WRITE(numout,*) ' ', TRIM(sdobsgroup%csstbiasfiles(jfile)) 406 END DO 407 ENDIF 406 WRITE(numout,*) ' Logical switch to compute all vars at all pts ln_all_at_all = ', sdobsgroup%lall_at_all 408 407 WRITE(numout,*) ' Settings only for SLA data, which is ', sdobsgroup%lsla 409 408 WRITE(numout,*) ' Logical switch for alt bias ln_altbias = ', sdobsgroup%laltbias 410 409 WRITE(numout,*) ' Alt bias file name cn_altbiasfile = ', TRIM(sdobsgroup%caltbiasfile) 411 WRITE(numout,*) ' Logical switch for time-mean of SLA ln_time_mean_sla_bkg = ', sdobsgroup%ltime_mean_sla_bkg412 410 WRITE(numout,*) ' MSSH correction scheme nn_msshc = ', sdobsgroup%nmsshc 413 411 WRITE(numout,*) ' MDT correction rn_mdtcorr = ', sdobsgroup%rmdtcorr 414 412 WRITE(numout,*) ' MDT cutoff for computed correction rn_mdtcutoff = ', sdobsgroup%rmdtcutoff 415 WRITE(numout,*) ' Settings only for 3D temperature/salinity data, temperature is ', sdobsgroup%ltemp3d416 WRITE(numout,*) ' salinity is ', sdobsgroup%lsal3d417 WRITE(numout,*) ' Logical switch to compute model S at T obs ln_s_at_t = ', sdobsgroup%ls_at_t418 WRITE(numout,*) ' Logical switch for writing climat. at obs points ln_output_clim = ', sdobsgroup%loutput_clim419 413 ENDIF 420 414 … … 432 426 ENDIF 433 427 434 IF ( (sdobsgroup%l sst) .AND. (sdobsgroup%lsstbias) .AND. (sdobsgroup%nsstbiasfiles == 0) ) THEN435 CALL ctl_stop( ' No SSTbias files specified for this observation group' )428 IF ( (sdobsgroup%lobsbias) .AND. (sdobsgroup%nobsbiasfiles == 0) ) THEN 429 CALL ctl_stop( ' No bias files specified for this observation group' ) 436 430 ENDIF 437 431 -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_oper.F90
r15144 r15180 103 103 INTEGER , INTENT(in ) :: k2dint ! Horizontal interpolation type (see header) 104 104 INTEGER , INTENT(in ) :: kdaystp ! Number of time steps per day 105 INTEGER , INTENT(in ) :: kvar ! Number of variablesin prodatqc105 INTEGER , INTENT(in ) :: kvar ! Index of variable in prodatqc 106 106 REAL(KIND=wp) , INTENT(in ), DIMENSION(kpi,kpj,kpk) :: pvar ! Model field 107 107 REAL(KIND=wp) , INTENT(in ), DIMENSION(kpi,kpj,kpk) :: pmask ! Land-sea mask … … 450 450 END SUBROUTINE obs_prof_opt 451 451 452 SUBROUTINE obs_surf_opt( surfdataqc, kt, kpi, kpj, &453 & kit000, k daystp, psurf, psurfmask,&454 & k2dint, ldnightav, plamscl, pphiscl, &452 SUBROUTINE obs_surf_opt( surfdataqc, kt, kpi, kpj, & 453 & kit000, kvar, kdaystp, psurf, psurfmask, & 454 & k2dint, ldnightav, plamscl, pphiscl, & 455 455 & lindegrees ) 456 456 … … 499 499 ! (kit000-1 = restart time) 500 500 INTEGER, INTENT(IN) :: kdaystp ! Number of time steps per day 501 INTEGER, INTENT(IN) :: kvar ! Index of variable in surfdataqc 501 502 INTEGER, INTENT(IN) :: k2dint ! Horizontal interpolation type (see header) 502 503 REAL(wp), INTENT(IN), DIMENSION(kpi,kpj) :: & … … 563 564 IF ( ldnightav ) THEN 564 565 565 ! Initialize array for night mean566 ! Initialize array for night mean 566 567 IF ( kt == 0 ) THEN 567 568 ALLOCATE ( icount_night(kpi,kpj) ) … … 581 582 DO jj = 1, jpj 582 583 DO ji = 1, jpi 583 surfdataqc%vdmean(ji,jj ) = 0.0584 surfdataqc%vdmean(ji,jj,:) = 0.0 584 585 zmeanday(ji,jj) = 0.0 585 586 icount_night(ji,jj) = 0 … … 594 595 DO jj = 1, jpj 595 596 DO ji = 1, jpi 596 ! Increment the temperaturefield for computing night mean and counter597 surfdataqc%vdmean(ji,jj ) = surfdataqc%vdmean(ji,jj) &598 & + psurf(ji,jj) * REAL( imask_night(ji,jj) )597 ! Increment the model field for computing night mean and counter 598 surfdataqc%vdmean(ji,jj,kvar) = surfdataqc%vdmean(ji,jj,kvar) & 599 & + psurf(ji,jj) * REAL( imask_night(ji,jj) ) 599 600 zmeanday(ji,jj) = zmeanday(ji,jj) + psurf(ji,jj) 600 601 icount_night(ji,jj) = icount_night(ji,jj) + imask_night(ji,jj) … … 610 611 ! Test if "no night" point 611 612 IF ( icount_night(ji,jj) > 0 ) THEN 612 surfdataqc%vdmean(ji,jj ) = surfdataqc%vdmean(ji,jj) &613 & / REAL( icount_night(ji,jj) )613 surfdataqc%vdmean(ji,jj,kvar) = surfdataqc%vdmean(ji,jj,kvar) & 614 & / REAL( icount_night(ji,jj) ) 614 615 ELSE 615 616 !At locations where there is no night (e.g. poles), 616 617 ! calculate daily mean instead of night-time mean. 617 surfdataqc%vdmean(ji,jj ) = zmeanday(ji,jj) * zdaystp618 surfdataqc%vdmean(ji,jj,kvar) = zmeanday(ji,jj) * zdaystp 618 619 ENDIF 619 620 END DO … … 689 690 690 691 CALL obs_int_comm_2d( imaxifp,imaxjfp, isurf, kpi, kpj, igrdi, igrdj, & 691 & surfdataqc%vdmean(:,: ), zsurfm )692 & surfdataqc%vdmean(:,:,kvar), zsurfm ) 692 693 693 694 ENDIF … … 750 751 751 752 ENDIF 752 753 ! WHERE BEST TO DO THIS? 753 754 IF ( TRIM(surfdataqc%cvars(1)) == 'SLA' .AND. surfdataqc%nextra == 2 ) THEN 754 755 ! ... Remove the MDT from the SSH at the observation point to get the SLA -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_prep.F90
r15089 r15180 42 42 CONTAINS 43 43 44 SUBROUTINE obs_pre_surf( surfdata, surfdataqc, ld_nea, ld_bound_reject, & 45 kqc_cutoff ) 46 !!---------------------------------------------------------------------- 47 !! *** ROUTINE obs_pre_sla *** 44 SUBROUTINE obs_pre_surf( surfdata, surfdataqc, & 45 & kpi, kpj, & 46 & zmask, pglam, pgphi, & 47 & ld_nea, ld_bound_reject, & 48 & kqc_cutoff ) 49 !!---------------------------------------------------------------------- 50 !! *** ROUTINE obs_pre_surf *** 48 51 !! 49 52 !! ** Purpose : First level check and screening of surface observations … … 65 68 !! * Arguments 66 69 TYPE(obs_surf), INTENT(INOUT) :: surfdata ! Full set of surface data 67 TYPE(obs_surf), INTENT(INOUT) :: surfdataqc ! Subset of surface data not failing screening 68 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 70 TYPE(obs_surf), INTENT(INOUT) :: surfdataqc ! Subset of surface data not failing screening 71 INTEGER, INTENT(IN) :: kpi, kpj ! Local domain sizes 72 REAL(wp), INTENT(IN), DIMENSION(kpi,kpj,surfdata%nvar) :: & 73 & zmask 74 REAL(wp), INTENT(IN), DIMENSION(kpi,kpj,surfdata%nvar) :: & 75 & pglam, & 76 & pgphi 77 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 69 78 LOGICAL, INTENT(IN) :: ld_bound_reject ! Switch for rejecting obs near the boundary 70 INTEGER, INTENT(IN), OPTIONAL :: kqc_cutoff 79 INTEGER, INTENT(IN), OPTIONAL :: kqc_cutoff ! cut off for QC value 71 80 !! * Local declarations 72 81 INTEGER :: iqc_cutoff = 255 ! cut off for QC value … … 77 86 INTEGER :: imin0 78 87 INTEGER :: icycle ! Current assimilation cycle 79 ! Counters for observations that 80 INTEGER :: iotdobs ! - outside time domain 81 INTEGER :: iosdsobs ! - outside space domain 82 INTEGER :: ilansobs ! - within a model land cell 83 INTEGER :: inlasobs ! - close to land 84 INTEGER :: igrdobs ! - fail the grid search 85 INTEGER :: ibdysobs ! - close to open boundary 86 ! Global counters for observations that 87 INTEGER :: iotdobsmpp ! - outside time domain 88 INTEGER :: iosdsobsmpp ! - outside space domain 89 INTEGER :: ilansobsmpp ! - within a model land cell 90 INTEGER :: inlasobsmpp ! - close to land 91 INTEGER :: igrdobsmpp ! - fail the grid search 92 INTEGER :: ibdysobsmpp ! - close to open boundary 88 ! Counters for observations that are 89 INTEGER :: iotdobs ! - outside time domain 90 INTEGER, DIMENSION(surfdata%nvar) :: iosdsobs ! - outside space domain 91 INTEGER, DIMENSION(surfdata%nvar) :: ilansobs ! - within a model land cell 92 INTEGER, DIMENSION(surfdata%nvar) :: inlasobs ! - close to land 93 INTEGER, DIMENSION(surfdata%nvar) :: ibdysobs ! - close to open boundary 94 INTEGER :: igrdobs ! - fail the grid search 95 ! Global counters for observations that 96 INTEGER :: iotdobsmpp ! - outside time domain 97 INTEGER, DIMENSION(surfdata%nvar) :: iosdsobsmpp ! - outside space domain 98 INTEGER, DIMENSION(surfdata%nvar) :: ilansobsmpp ! - within a model land cell 99 INTEGER, DIMENSION(surfdata%nvar) :: inlasobsmpp ! - close to land 100 INTEGER, DIMENSION(surfdata%nvar) :: ibdysobsmpp ! - close to open boundary 101 INTEGER :: igrdobsmpp ! - fail the grid search 102 93 103 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 94 104 & llvalid ! SLA data selection 95 INTEGER :: jobs ! Obs. loop variable 105 INTEGER :: jobs ! Obs. loop counter 106 INTEGER :: jvar ! Variable loop counter 96 107 INTEGER :: jstp ! Time loop variable 97 108 INTEGER :: inrc ! Time index variable 109 CHARACTER(LEN=256) :: cout1 ! Diagnostic output line 98 110 !!---------------------------------------------------------------------- 99 111 … … 110 122 icycle = nn_no ! Assimilation cycle 111 123 112 ! Diagno ticscounters for various failures.124 ! Diagnostic counters for various failures. 113 125 114 126 iotdobs = 0 115 127 igrdobs = 0 116 iosdsobs = 0117 ilansobs = 0118 inlasobs = 0119 ibdysobs = 0128 iosdsobs(:) = 0 129 ilansobs(:) = 0 130 inlasobs(:) = 0 131 ibdysobs(:) = 0 120 132 121 133 ! Set QC cutoff to optional value if provided … … 147 159 ! ----------------------------------------------------------------------- 148 160 149 CALL obs_coo_spc_2d( surfdata%nsurf, & 150 & jpi, jpj, & 151 & surfdata%mi, surfdata%mj, & 152 & surfdata%rlam, surfdata%rphi, & 153 & glamt, gphit, & 154 & tmask(:,:,1), surfdata%nqc, & 155 & iosdsobs, ilansobs, & 156 & inlasobs, ld_nea, & 157 & ibdysobs, ld_bound_reject, & 158 & iqc_cutoff ) 159 160 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 161 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 162 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 163 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 161 DO jvar = 1, surfdata%nvar 162 CALL obs_coo_spc_2d( surfdata%nsurf, & 163 & jpi, jpj, & 164 & surfdata%mi, surfdata%mj, & 165 & surfdata%rlam, surfdata%rphi, & 166 & pglam(:,:,jvar), pgphi(:,:,jvar), & 167 & zmask(:,:,jvar), surfdata%nqc, & 168 & iosdsobs(jvar), ilansobs(jvar), & 169 & inlasobs(jvar), ld_nea, & 170 & ibdysobs(jvar), ld_bound_reject, & 171 & iqc_cutoff ) 172 CALL obs_mpp_sum_integer( iosdsobs(jvar), iosdsobsmpp(jvar) ) 173 CALL obs_mpp_sum_integer( ilansobs(jvar), ilansobsmpp(jvar) ) 174 CALL obs_mpp_sum_integer( inlasobs(jvar), inlasobsmpp(jvar) ) 175 CALL obs_mpp_sum_integer( ibdysobs(jvar), ibdysobsmpp(jvar) ) 176 END DO 164 177 165 178 ! ----------------------------------------------------------------------- … … 191 204 192 205 IF(lwp) THEN 206 DO jvar = 1, surfdataqc%nvar 207 IF ( jvar == 1 ) THEN 208 cout1=TRIM(surfdataqc%cvars(1)) 209 ELSE 210 WRITE(cout1,'(A,A1,A)') TRIM(cout1), '/', TRIM(surfdataqc%cvars(jvar)) 211 ENDIF 212 END DO 213 193 214 WRITE(numout,*) 194 WRITE(numout,*) ' '// surfdataqc%cvars(1)//' data outside time domain = ', &215 WRITE(numout,*) ' '//TRIM(cout1)//' data outside time domain = ', & 195 216 & iotdobsmpp 196 WRITE(numout,*) ' Remaining '// surfdataqc%cvars(1)//' data that failed grid search = ', &217 WRITE(numout,*) ' Remaining '//TRIM(cout1)//' data that failed grid search = ', & 197 218 & igrdobsmpp 198 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data outside space domain = ', & 199 & iosdsobsmpp 200 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data at land points = ', & 201 & ilansobsmpp 202 IF (ld_nea) THEN 203 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data near land points (removed) = ', & 204 & inlasobsmpp 205 ELSE 206 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data near land points (kept) = ', & 207 & inlasobsmpp 208 ENDIF 209 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data near open boundary (removed) = ', & 210 & ibdysobsmpp 211 WRITE(numout,*) ' '//surfdataqc%cvars(1)//' data accepted = ', & 212 & surfdataqc%nsurfmpp 219 220 DO jvar = 1, surfdataqc%nvar 221 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(jvar)//' data outside space domain = ', & 222 & iosdsobsmpp(jvar) 223 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(jvar)//' data at land points = ', & 224 & ilansobsmpp(jvar) 225 IF (ld_nea) THEN 226 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(jvar)//' data near land points (removed) = ', & 227 & inlasobsmpp(jvar) 228 ELSE 229 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(jvar)//' data near land points (kept) = ', & 230 & inlasobsmpp(jvar) 231 ENDIF 232 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(jvar)//' data near open boundary (removed) = ', & 233 & ibdysobsmpp(jvar) 234 END DO 235 WRITE(numout,*) ' '//TRIM(cout1)//' data accepted = ', & 236 & surfdataqc%nsurfmpp 213 237 214 238 WRITE(numout,*) 215 239 WRITE(numout,*) ' Number of observations per time step :' 216 240 WRITE(numout,*) 217 WRITE(numout,'(10X,A,10X,A)')'Time step', surfdataqc%cvars(1)241 WRITE(numout,'(10X,A,10X,A)')'Time step',TRIM(cout1) 218 242 WRITE(numout,'(10X,A,5X,A)')'---------','-----------------' 219 243 CALL FLUSH(numout) -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_profiles_def.F90
r14075 r15180 75 75 76 76 REAL(KIND=wp), POINTER, DIMENSION(:,:) :: & 77 & v ext !: Extravariables77 & vadd !: Additional variables 78 78 79 79 INTEGER, POINTER, DIMENSION(:) :: & … … 94 94 95 95 INTEGER :: nvar !: Number of variables 96 INTEGER :: next !: Number of extra fields 96 INTEGER :: next !: Number of extra variables 97 INTEGER :: nadd !: Number of additional variables 97 98 INTEGER :: nprof !: Total number of profiles within window. 98 99 INTEGER :: nstp !: Number of time steps … … 104 105 ! Bookkeeping arrays with sizes equal to number of variables 105 106 106 CHARACTER(len=8), POINTER, DIMENSION(:) :: & 107 & cvars !: Variable names 107 CHARACTER(len=ilenname), POINTER, DIMENSION(:) :: & 108 & cvars, & !: Variable names 109 & cextvars, & !: Extra variable names 110 & caddvars !: Additional variable names 111 112 CHARACTER(len=ilenlong), POINTER, DIMENSION(:) :: & 113 & clong, & !: Variable long names 114 & cextlong !: Extra variable long names 115 116 CHARACTER(len=ilenlong), POINTER, DIMENSION(:,:) :: & 117 & caddlong !: Additional variable long names 118 119 CHARACTER(len=ilenunit), POINTER, DIMENSION(:) :: & 120 & cunit, & !: Variable units 121 & cextunit !: Extra variable units 122 123 CHARACTER(len=ilenunit), POINTER, DIMENSION(:,:) :: & 124 & caddunit !: Additional variable units 125 126 CHARACTER(len=ilengrid), POINTER, DIMENSION(:) :: & 127 & cgrid !: Variable grids 108 128 109 129 INTEGER, POINTER, DIMENSION(:) :: & … … 131 151 & rphi !: Latitude coordinate of profile data 132 152 133 CHARACTER(LEN= 8), POINTER, DIMENSION(:) :: &153 CHARACTER(LEN=ilenwmo), POINTER, DIMENSION(:) :: & 134 154 & cwmo !: Profile WMO indentifier 135 155 … … 160 180 TYPE(obs_prof_var), POINTER, DIMENSION(:) :: var 161 181 182 REAL(KIND=wp), POINTER, DIMENSION(:,:) :: & 183 & vext !: Extra variables 184 162 185 ! Arrays with size equal to the number of time steps in the window 163 186 … … 197 220 CONTAINS 198 221 199 SUBROUTINE obs_prof_alloc( prof, kvar, k ext, kprof, &222 SUBROUTINE obs_prof_alloc( prof, kvar, kadd, kext, kprof, & 200 223 & ko3dt, kstp, kpi, kpj, kpk ) 201 224 !!---------------------------------------------------------------------- … … 214 237 INTEGER, INTENT(IN) :: kprof ! Number of profiles 215 238 INTEGER, INTENT(IN) :: kvar ! Number of variables 216 INTEGER, INTENT(IN) :: kext ! Number of extra fields within each variable 239 INTEGER, INTENT(IN) :: kadd ! Number of additional fields within each variable 240 INTEGER, INTENT(IN) :: kext ! Number of extra fields 217 241 INTEGER, INTENT(IN), DIMENSION(kvar) :: & 218 242 & ko3dt ! Number of observations per variables … … 223 247 224 248 !!* Local variables 225 INTEGER :: jvar 249 INTEGER :: jvar, jadd, jext 226 250 INTEGER :: ji 227 251 … … 229 253 230 254 prof%nvar = kvar 255 prof%nadd = kadd 231 256 prof%next = kext 232 257 prof%nprof = kprof … … 241 266 ALLOCATE( & 242 267 & prof%cvars(kvar), & 268 & prof%clong(kvar), & 269 & prof%cunit(kvar), & 270 & prof%cgrid(kvar), & 243 271 & prof%nvprot(kvar), & 244 272 & prof%nvprotmpp(kvar) & … … 247 275 DO jvar = 1, kvar 248 276 prof%cvars (jvar) = "NotSet" 277 prof%clong (jvar) = "NotSet" 278 prof%cunit (jvar) = "NotSet" 279 prof%cgrid (jvar) = "" 249 280 prof%nvprot (jvar) = ko3dt(jvar) 250 281 prof%nvprotmpp(jvar) = 0 282 END DO 283 284 ! Allocate additional/extra variable metadata 285 286 ALLOCATE( & 287 & prof%caddvars(kadd), & 288 & prof%caddlong(kadd,kvar), & 289 & prof%caddunit(kadd,kvar), & 290 & prof%cextvars(kext), & 291 & prof%cextlong(kext), & 292 & prof%cextunit(kext) & 293 ) 294 295 DO jadd = 1, kadd 296 prof%caddvars(jadd) = "NotSet" 297 DO jvar = 1, kvar 298 prof%caddlong(jadd,jvar) = "NotSet" 299 prof%caddunit(jadd,jvar) = "NotSet" 300 END DO 301 END DO 302 303 DO jext = 1, kext 304 prof%cextvars(jext) = "NotSet" 305 prof%cextlong(jext) = "NotSet" 306 prof%cextunit(jext) = "NotSet" 251 307 END DO 252 308 … … 308 364 309 365 IF ( ko3dt(jvar) >= 0 ) THEN 310 CALL obs_prof_alloc_var( prof, jvar, k ext, ko3dt(jvar) )366 CALL obs_prof_alloc_var( prof, jvar, kadd, ko3dt(jvar) ) 311 367 ENDIF 312 368 313 369 END DO 370 371 ! Allocate extra variables 372 ALLOCATE( & 373 & prof%vext(kprof,kext) & 374 & ) 314 375 315 376 ! Allocate arrays of size number of time step size … … 432 493 & ) 433 494 495 ! Deallocate extra variables 496 DEALLOCATE( & 497 & prof%vext & 498 & ) 499 434 500 ! Deallocate arrays of size number of time step size 435 501 … … 458 524 DEALLOCATE( & 459 525 & prof%cvars, & 526 & prof%clong, & 527 & prof%cunit, & 528 & prof%cgrid, & 460 529 & prof%nvprot, & 461 530 & prof%nvprotmpp & 462 531 ) 463 532 533 ! Dellocate additional/extra variables metadata 534 535 DEALLOCATE( & 536 & prof%caddvars, & 537 & prof%caddlong, & 538 & prof%caddunit, & 539 & prof%cextvars, & 540 & prof%cextlong, & 541 & prof%cextunit & 542 ) 543 464 544 465 545 END SUBROUTINE obs_prof_dealloc 466 546 467 547 468 SUBROUTINE obs_prof_alloc_var( prof, kvar, k ext, kobs )548 SUBROUTINE obs_prof_alloc_var( prof, kvar, kadd, kobs ) 469 549 470 550 !!---------------------------------------------------------------------- … … 480 560 TYPE(obs_prof), INTENT(INOUT) :: prof ! Profile data to be allocated 481 561 INTEGER, INTENT(IN) :: kvar ! Variable number 482 INTEGER, INTENT(IN) :: k ext ! Number of extrafields within each variable562 INTEGER, INTENT(IN) :: kadd ! Number of additional fields within each variable 483 563 INTEGER, INTENT(IN) :: kobs ! Number of observations 484 564 … … 498 578 & prof%var(kvar)%nvqcf(idefnqcf,kobs) & 499 579 & ) 500 IF (k ext>0) THEN580 IF (kadd>0) THEN 501 581 ALLOCATE( & 502 & prof%var(kvar)%v ext(kobs,kext) &582 & prof%var(kvar)%vadd(kobs,kadd) & 503 583 & ) 504 584 ENDIF … … 534 614 & prof%var(kvar)%nvqcf & 535 615 & ) 536 IF (prof%n ext>0) THEN616 IF (prof%nadd>0) THEN 537 617 DEALLOCATE( & 538 & prof%var(kvar)%v ext&618 & prof%var(kvar)%vadd & 539 619 & ) 540 620 ENDIF … … 576 656 & invpro 577 657 INTEGER :: jvar 658 INTEGER :: jadd 578 659 INTEGER :: jext 579 660 INTEGER :: ji … … 627 708 IF ( lallocate ) THEN 628 709 CALL obs_prof_alloc( newprof, prof%nvar, & 629 & prof%n ext,&710 & prof%nadd, prof%next, & 630 711 & inprof, invpro, & 631 712 & prof%nstp, prof%npi, & … … 670 751 671 752 newprof%mi(inprof,:) = prof%mi(ji,:) 672 newprof%mj(inprof,:) = prof%mj(ji,:)753 newprof%mj(inprof,:) = prof%mj(ji,:) 673 754 newprof%npidx(inprof) = prof%npidx(ji) 674 755 newprof%npfil(inprof) = prof%npfil(ji) … … 741 822 newprof%var(jvar)%vmod(invpro(jvar)) = & 742 823 & prof%var(jvar)%vmod(jj) 743 DO j ext = 1, prof%next744 newprof%var(jvar)%v ext(invpro(jvar),jext) = &745 & prof%var(jvar)%v ext(jj,jext)824 DO jadd = 1, prof%nadd 825 newprof%var(jvar)%vadd(invpro(jvar),jadd) = & 826 & prof%var(jvar)%vadd(jj,jadd) 746 827 END DO 747 828 … … 756 837 END DO 757 838 839 DO jext = 1, prof%next 840 newprof%vext(inprof,jext) = prof%vext(ji,jext) 841 END DO 842 758 843 ENDIF 759 844 … … 771 856 772 857 newprof%nvar = prof%nvar 858 newprof%nadd = prof%nadd 773 859 newprof%next = prof%next 774 860 newprof%nstp = prof%nstp … … 777 863 newprof%npk = prof%npk 778 864 newprof%cvars(:) = prof%cvars(:) 865 newprof%clong(:) = prof%clong(:) 866 newprof%cunit(:) = prof%cunit(:) 867 newprof%cgrid(:) = prof%cgrid(:) 868 newprof%caddvars(:) = prof%caddvars(:) 869 newprof%caddlong(:) = prof%caddlong(:) 870 newprof%caddunit(:) = prof%caddunit(:) 871 newprof%cextvars(:) = prof%cextvars(:) 872 newprof%cextlong(:) = prof%cextlong(:) 873 newprof%cextunit(:) = prof%cextunit(:) 779 874 780 875 ! Deallocate temporary data … … 810 905 !!* Local variables 811 906 INTEGER :: jvar 907 INTEGER :: jadd 812 908 INTEGER :: jext 813 909 INTEGER :: ji … … 866 962 oldprof%var(jvar)%idqcf(:,jl) = prof%var(jvar)%idqcf(:,jj) 867 963 oldprof%var(jvar)%nvqcf(:,jl) = prof%var(jvar)%nvqcf(:,jj) 868 DO j ext = 1, prof%next869 oldprof%var(jvar)%v ext(jl,jext) = &870 & prof%var(jvar)%v ext(jj,jext)964 DO jadd = 1, prof%nadd 965 oldprof%var(jvar)%vadd(jl,jadd) = & 966 & prof%var(jvar)%vadd(jj,jadd) 871 967 END DO 872 968 873 969 END DO 874 970 971 END DO 972 973 DO jext = 1, prof%next 974 oldprof%vext(jk,jext) = prof%vext(jj,jext) 875 975 END DO 876 976 -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_read_prof.F90
r15089 r15180 44 44 45 45 SUBROUTINE obs_rea_prof( profdata, knumfiles, cdfilenames, & 46 & kvars, k extr, kstp, ddobsini, ddobsend, &47 & ldvar, ldignmis, ld satt, &46 & kvars, kadd, kextr, kstp, ddobsini, ddobsend, & 47 & ldvar, ldignmis, ldallatall, & 48 48 & ldmod, cdvars, kdailyavtypes ) 49 49 !!--------------------------------------------------------------------- … … 72 72 & cdfilenames(knumfiles) ! File names to read in 73 73 INTEGER, INTENT(IN) :: kvars ! Number of variables in profdata 74 INTEGER, INTENT(IN) :: kextr ! Number of extra fields for each var 74 INTEGER, INTENT(IN) :: kadd ! Number of additional fields 75 ! in addition to those in the input file(s) 76 INTEGER, INTENT(IN) :: kextr ! Number of extra fields 77 ! in addition to those in the input file(s) 75 78 INTEGER, INTENT(IN) :: kstp ! Ocean time-step index 76 79 LOGICAL, DIMENSION(kvars), INTENT(IN) :: ldvar ! Observed variables switches 77 80 LOGICAL, INTENT(IN) :: ldignmis ! Ignore missing files 78 LOGICAL, INTENT(IN) :: ld satt! Compute salinity at all temperature points81 LOGICAL, INTENT(IN) :: ldallatall ! Compute salinity at all temperature points 79 82 LOGICAL, INTENT(IN) :: ldmod ! Initialize model from input data 80 83 REAL(dp), INTENT(IN) :: ddobsini ! Obs. ini time in YYYYMMDD.HHMMSS … … 87 90 CHARACTER(LEN=15), PARAMETER :: cpname='obs_rea_prof' 88 91 CHARACTER(len=8) :: clrefdate 89 CHARACTER(len=8), DIMENSION(:), ALLOCATABLE :: clvarsin 90 INTEGER :: jvar 92 CHARACTER(len=ilenname), DIMENSION(:), ALLOCATABLE :: clvarsin 93 CHARACTER(len=ilenlong), DIMENSION(:), ALLOCATABLE :: cllongin 94 CHARACTER(len=ilenunit), DIMENSION(:), ALLOCATABLE :: clunitin 95 CHARACTER(len=ilengrid), DIMENSION(:), ALLOCATABLE :: clgridin 96 CHARACTER(len=ilenname), DIMENSION(:), ALLOCATABLE :: claddvarsin 97 CHARACTER(len=ilenlong), DIMENSION(:,:), ALLOCATABLE :: claddlongin 98 CHARACTER(len=ilenunit), DIMENSION(:,:), ALLOCATABLE :: claddunitin 99 CHARACTER(len=ilenname), DIMENSION(:), ALLOCATABLE :: clextvarsin 100 CHARACTER(len=ilenlong), DIMENSION(:), ALLOCATABLE :: clextlongin 101 CHARACTER(len=ilenunit), DIMENSION(:), ALLOCATABLE :: clextunitin 91 102 INTEGER :: ji 92 103 INTEGER :: jj 93 104 INTEGER :: jk 94 105 INTEGER :: ij 106 INTEGER :: jext 107 INTEGER :: jvar 108 INTEGER :: jadd 109 INTEGER :: jadd2 110 INTEGER :: iadd 111 INTEGER :: iaddin 112 INTEGER :: iextr 95 113 INTEGER :: iflag 96 114 INTEGER :: inobf … … 166 184 ALLOCATE( inpfiles(inobf) ) 167 185 186 iadd = 0 187 iextr = 0 188 168 189 prof_files : DO jj = 1, inobf 169 190 … … 221 242 ENDIF 222 243 244 IF ( (iextr > 0) .AND. (inpfiles(jj)%next /= iextr) ) THEN 245 CALL ctl_stop( 'Number of extra variables not consistent', & 246 & ' with previous files for this type' ) 247 ELSE 248 iextr = inpfiles(jj)%next 249 ENDIF 250 251 ! Ignore model counterpart 252 iaddin = inpfiles(jj)%nadd 253 DO ji = 1, iaddin 254 IF ( TRIM(inpfiles(jj)%caddname(ji)) == 'Hx' ) THEN 255 iaddin = iaddin - 1 256 EXIT 257 ENDIF 258 END DO 259 IF ( ldmod .AND. ( inpfiles(jj)%nadd == iaddin ) ) THEN 260 CALL ctl_stop( 'Model not in input data' ) 261 ENDIF 262 263 IF ( (iadd > 0) .AND. (iaddin /= iadd) ) THEN 264 CALL ctl_stop( 'Number of additional variables not consistent', & 265 & ' with previous files for this type' ) 266 ELSE 267 iadd = iaddin 268 ENDIF 269 223 270 IF ( jj == 1 ) THEN 224 271 ALLOCATE( clvarsin( inpfiles(jj)%nvar ) ) 272 ALLOCATE( cllongin( inpfiles(jj)%nvar ) ) 273 ALLOCATE( clunitin( inpfiles(jj)%nvar ) ) 274 ALLOCATE( clgridin( inpfiles(jj)%nvar ) ) 225 275 DO ji = 1, inpfiles(jj)%nvar 226 276 clvarsin(ji) = inpfiles(jj)%cname(ji) 277 cllongin(ji) = inpfiles(jj)%coblong(ji) 278 clunitin(ji) = inpfiles(jj)%cobunit(ji) 279 clgridin(ji) = inpfiles(jj)%cgrid(ji) 227 280 IF ( clvarsin(ji) /= cdvars(ji) ) THEN 228 281 CALL ctl_stop( 'Feedback file variables do not match', & … … 230 283 ENDIF 231 284 END DO 285 IF ( iadd > 0 ) THEN 286 ALLOCATE( claddvarsin( iadd ) ) 287 ALLOCATE( claddlongin( iadd, inpfiles(jj)%nvar ) ) 288 ALLOCATE( claddunitin( iadd, inpfiles(jj)%nvar ) ) 289 jadd = 0 290 DO ji = 1, inpfiles(jj)%nadd 291 IF ( TRIM(inpfiles(jj)%caddname(ji)) /= 'Hx' ) THEN 292 jadd = jadd + 1 293 claddvarsin(jadd) = inpfiles(jj)%caddname(ji) 294 DO jk = 1, inpfiles(jj)%nvar 295 claddlongin(jadd,jk) = inpfiles(jj)%caddlong(ji,jk) 296 claddunitin(jadd,jk) = inpfiles(jj)%caddunit(ji,jk) 297 END DO 298 ENDIF 299 END DO 300 ENDIF 301 IF ( iextr > 0 ) THEN 302 ALLOCATE( clextvarsin( iextr ) ) 303 ALLOCATE( clextlongin( iextr ) ) 304 ALLOCATE( clextunitin( iextr ) ) 305 DO ji = 1, iextr 306 clextvarsin(ji) = inpfiles(jj)%cextname(ji) 307 clextlongin(ji) = inpfiles(jj)%cextlong(ji) 308 clextunitin(ji) = inpfiles(jj)%cextunit(ji) 309 END DO 310 ENDIF 232 311 ELSE 233 312 DO ji = 1, inpfiles(jj)%nvar … … 237 316 ENDIF 238 317 END DO 318 IF ( iadd > 0 ) THEN 319 jadd = 0 320 DO ji = 1, inpfiles(jj)%nadd 321 IF ( TRIM(inpfiles(jj)%caddname(ji)) /= 'Hx' ) THEN 322 jadd = jadd + 1 323 IF ( inpfiles(jj)%caddname(ji) /= claddvarsin(jadd) ) THEN 324 CALL ctl_stop( 'Feedback file additional variables not consistent', & 325 & ' with previous files for this type' ) 326 ENDIF 327 ENDIF 328 END DO 329 ENDIF 330 IF ( iextr > 0 ) THEN 331 DO ji = 1, iextr 332 IF ( inpfiles(jj)%cextname(ji) /= clextvarsin(ji) ) THEN 333 CALL ctl_stop( 'Feedback file extra variables not consistent', & 334 & ' with previous files for this type' ) 335 ENDIF 336 END DO 337 ENDIF 239 338 ENDIF 240 339 … … 499 598 500 599 iv3dt(:) = -1 501 IF (ld satt) THEN600 IF (ldallatall) THEN 502 601 iv3dt(:) = ip3dt 503 602 ELSE 504 603 iv3dt(:) = ivart0(:) 505 604 ENDIF 506 CALL obs_prof_alloc( profdata, kvars, k extr, iprof, iv3dt, &605 CALL obs_prof_alloc( profdata, kvars, kadd+iadd, kextr+iextr, iprof, iv3dt, & 507 606 & kstp, jpi, jpj, jpk ) 508 607 … … 512 611 profdata%nvprot(:) = 0 513 612 profdata%cvars(:) = clvarsin(:) 613 profdata%clong(:) = cllongin(:) 614 profdata%cunit(:) = clunitin(:) 615 profdata%cgrid(:) = clgridin(:) 616 IF ( iadd > 0 ) THEN 617 profdata%caddvars(kadd+1:) = claddvarsin(:) 618 profdata%caddlong(kadd+1:,:) = claddlongin(:,:) 619 profdata%caddunit(kadd+1:,:) = claddunitin(:,:) 620 ENDIF 621 IF ( iextr > 0 ) THEN 622 profdata%cextvars(kextr+1:) = clextvarsin(:) 623 profdata%cextlong(kextr+1:) = clextlongin(:) 624 profdata%cextunit(kextr+1:) = clextunitin(:) 625 ENDIF 514 626 iprof = 0 515 627 … … 644 756 & CYCLE 645 757 646 IF (ld satt) THEN758 IF (ldallatall) THEN 647 759 648 760 DO jvar = 1, kvars … … 663 775 IF ( ( .NOT. BTEST(inpfiles(jj)%ivlqc(ij,ji,jvar),2) .AND. & 664 776 & .NOT. BTEST(inpfiles(jj)%idqc(ij,ji),2) .AND. & 665 & ldvar(jvar) ) .OR. ld satt) THEN666 667 IF (ld satt) THEN777 & ldvar(jvar) ) .OR. ldallatall ) THEN 778 779 IF (ldallatall) THEN 668 780 669 781 ivart(jvar) = ip3dt … … 698 810 profdata%var(jvar)%vobs(ivart(jvar)) = & 699 811 & inpfiles(jj)%pob(ij,ji,jvar) 700 IF ( ldmod ) THEN701 profdata%var(jvar)%vmod(ivart(jvar)) = &702 & inpfiles(jj)%padd(ij,ji,1,jvar)703 ENDIF704 812 ! Count number of profile var1 data as function of type 705 813 itypvar( profdata%ntyp(iprof) + 1, jvar ) = & … … 717 825 & inpfiles(jj)%ivlqcf(:,ij,ji,jvar) 718 826 719 ! Profile insitu T value 720 IF ( TRIM( inpfiles(jj)%cname(jvar) ) == 'POTM' ) THEN 721 profdata%var(jvar)%vext(ivart(jvar),1) = & 722 & inpfiles(jj)%pext(ij,ji,1) 827 ! Additional variables 828 IF ( iadd > 0 ) THEN 829 jadd2 = 0 830 DO jadd = 1, inpfiles(jj)%nadd 831 IF ( TRIM(inpfiles(jj)%caddname(jadd)) == 'Hx' ) THEN 832 IF ( ldmod ) THEN 833 profdata%var(jvar)%vmod(ivart(jvar)) = & 834 & inpfiles(jj)%padd(ij,ji,jadd,jvar) 835 ENDIF 836 ELSE 837 jadd2 = jadd2 + 1 838 profdata%var(jvar)%vadd(ivart(jvar),kadd+jadd2) = & 839 & inpfiles(jj)%padd(ij,ji,jadd,jvar) 840 ENDIF 841 END DO 723 842 ENDIF 724 843 … … 726 845 727 846 END DO 847 848 ! Extra variables 849 IF ( iextr > 0 ) THEN 850 DO jext = 1, iextr 851 profdata%vext(iprof,kextr+jext) = inpfiles(jj)%pext(ij,ji,jext) 852 END DO 853 ENDIF 728 854 729 855 END DO loop_p … … 777 903 ENDIF 778 904 779 IF (ld satt) THEN905 IF (ldallatall) THEN 780 906 profdata%nvprot(:) = ip3dt 781 907 profdata%nvprotmpp(:) = ip3dtmpp … … 810 936 ! Deallocate temporary data 811 937 !----------------------------------------------------------------------- 812 DEALLOCATE( ifileidx, iprofidx, zdat, clvarsin ) 938 DEALLOCATE( ifileidx, iprofidx, zdat, & 939 & clvarsin, cllongin, clunitin, clgridin ) 940 IF ( iadd > 0 ) THEN 941 DEALLOCATE( claddvarsin, claddlongin, claddunitin) 942 ENDIF 943 IF ( iextr > 0 ) THEN 944 DEALLOCATE( clextvarsin, clextlongin, clextunitin ) 945 ENDIF 813 946 814 947 !----------------------------------------------------------------------- -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_read_surf.F90
r15089 r15180 39 39 40 40 SUBROUTINE obs_rea_surf( surfdata, knumfiles, cdfilenames, & 41 & kvars, k extr, kstp, ddobsini, ddobsend, &41 & kvars, kadd, kextr, kstp, ddobsini, ddobsend, & 42 42 & ldignmis, ldmod, ldnightav, cdvars ) 43 43 !!--------------------------------------------------------------------- … … 66 66 & cdfilenames(knumfiles) ! File names to read in 67 67 INTEGER, INTENT(IN) :: kvars ! Number of variables in surfdata 68 INTEGER, INTENT(IN) :: kextr ! Number of extra fields for each var 68 INTEGER, INTENT(IN) :: kadd ! Number of additional fields 69 ! in addition to those in the input file(s) 70 INTEGER, INTENT(IN) :: kextr ! Number of extra fields 71 ! in addition to those in the input file(s) 69 72 INTEGER, INTENT(IN) :: kstp ! Ocean time-step index 70 73 LOGICAL, INTENT(IN) :: ldignmis ! Ignore missing files … … 78 81 CHARACTER(LEN=11), PARAMETER :: cpname='obs_rea_surf' 79 82 CHARACTER(len=8) :: clrefdate 80 CHARACTER(len=8), DIMENSION(:), ALLOCATABLE :: clvarsin 83 CHARACTER(len=ilenname), DIMENSION(:), ALLOCATABLE :: clvarsin 84 CHARACTER(len=ilenlong), DIMENSION(:), ALLOCATABLE :: cllongin 85 CHARACTER(len=ilenunit), DIMENSION(:), ALLOCATABLE :: clunitin 86 CHARACTER(len=ilengrid), DIMENSION(:), ALLOCATABLE :: clgridin 87 CHARACTER(len=ilenname), DIMENSION(:), ALLOCATABLE :: claddvarsin 88 CHARACTER(len=ilenlong), DIMENSION(:,:), ALLOCATABLE :: claddlongin 89 CHARACTER(len=ilenunit), DIMENSION(:,:), ALLOCATABLE :: claddunitin 90 CHARACTER(len=ilenname), DIMENSION(:), ALLOCATABLE :: clextvarsin 91 CHARACTER(len=ilenlong), DIMENSION(:), ALLOCATABLE :: clextlongin 92 CHARACTER(len=ilenunit), DIMENSION(:), ALLOCATABLE :: clextunitin 81 93 INTEGER :: ji 82 94 INTEGER :: jj 83 95 INTEGER :: jk 96 INTEGER :: jvar 97 INTEGER :: jext 98 INTEGER :: jadd 99 INTEGER :: jadd2 100 INTEGER :: iadd 101 INTEGER :: iaddin 102 INTEGER :: iextr 84 103 INTEGER :: iflag 85 104 INTEGER :: inobf … … 121 140 TYPE(obfbdata), POINTER, DIMENSION(:) :: & 122 141 & inpfiles 142 CHARACTER(LEN=256) :: cout1 ! Diagnostic output line 123 143 124 144 ! Local initialization … … 132 152 133 153 ALLOCATE( inpfiles(inobf) ) 154 155 iadd = 0 156 iextr = 0 134 157 135 158 surf_files : DO jj = 1, inobf … … 189 212 ENDIF 190 213 214 IF ( (iextr > 0) .AND. (inpfiles(jj)%next /= iextr) ) THEN 215 CALL ctl_stop( 'Number of extra variables not consistent', & 216 & ' with previous files for this type' ) 217 ELSE 218 iextr = inpfiles(jj)%next 219 ENDIF 220 221 ! Ignore model counterpart 222 iaddin = inpfiles(jj)%nadd 223 DO ji = 1, iaddin 224 IF ( TRIM(inpfiles(jj)%caddname(ji)) == 'Hx' ) THEN 225 iaddin = iaddin - 1 226 EXIT 227 ENDIF 228 END DO 229 IF ( ldmod .AND. ( inpfiles(jj)%nadd == iaddin ) ) THEN 230 CALL ctl_stop( 'Model not in input data' ) 231 ENDIF 232 233 IF ( (iadd > 0) .AND. (iaddin /= iadd) ) THEN 234 CALL ctl_stop( 'Number of additional variables not consistent', & 235 & ' with previous files for this type' ) 236 ELSE 237 iadd = iaddin 238 ENDIF 239 191 240 IF ( jj == 1 ) THEN 192 241 ALLOCATE( clvarsin( inpfiles(jj)%nvar ) ) 242 ALLOCATE( cllongin( inpfiles(jj)%nvar ) ) 243 ALLOCATE( clunitin( inpfiles(jj)%nvar ) ) 244 ALLOCATE( clgridin( inpfiles(jj)%nvar ) ) 193 245 DO ji = 1, inpfiles(jj)%nvar 194 246 clvarsin(ji) = inpfiles(jj)%cname(ji) 247 cllongin(ji) = inpfiles(jj)%coblong(ji) 248 clunitin(ji) = inpfiles(jj)%cobunit(ji) 249 clgridin(ji) = inpfiles(jj)%cgrid(ji) 195 250 IF ( clvarsin(ji) /= cdvars(ji) ) THEN 196 251 CALL ctl_stop( 'Feedback file variables do not match', & … … 198 253 ENDIF 199 254 END DO 255 IF ( iadd > 0 ) THEN 256 ALLOCATE( claddvarsin( iadd ) ) 257 ALLOCATE( claddlongin( iadd, inpfiles(jj)%nvar ) ) 258 ALLOCATE( claddunitin( iadd, inpfiles(jj)%nvar ) ) 259 jadd = 0 260 DO ji = 1, inpfiles(jj)%nadd 261 IF ( TRIM(inpfiles(jj)%caddname(ji)) /= 'Hx' ) THEN 262 jadd = jadd + 1 263 claddvarsin(jadd) = inpfiles(jj)%caddname(ji) 264 DO jk = 1, inpfiles(jj)%nvar 265 claddlongin(jadd,jk) = inpfiles(jj)%caddlong(ji,jk) 266 claddunitin(jadd,jk) = inpfiles(jj)%caddunit(ji,jk) 267 END DO 268 ENDIF 269 END DO 270 ENDIF 271 IF ( iextr > 0 ) THEN 272 ALLOCATE( clextvarsin( iextr ) ) 273 ALLOCATE( clextlongin( iextr ) ) 274 ALLOCATE( clextunitin( iextr ) ) 275 DO ji = 1, iextr 276 clextvarsin(ji) = inpfiles(jj)%cextname(ji) 277 clextlongin(ji) = inpfiles(jj)%cextlong(ji) 278 clextunitin(ji) = inpfiles(jj)%cextunit(ji) 279 END DO 280 ENDIF 200 281 ELSE 201 282 DO ji = 1, inpfiles(jj)%nvar … … 205 286 ENDIF 206 287 END DO 288 IF ( iadd > 0 ) THEN 289 jadd = 0 290 DO ji = 1, inpfiles(jj)%nadd 291 IF ( TRIM(inpfiles(jj)%caddname(ji)) /= 'Hx' ) THEN 292 jadd = jadd + 1 293 IF ( inpfiles(jj)%caddname(ji) /= claddvarsin(jadd) ) THEN 294 CALL ctl_stop( 'Feedback file additional variables not consistent', & 295 & ' with previous files for this type' ) 296 ENDIF 297 ENDIF 298 END DO 299 ENDIF 300 IF ( iextr > 0 ) THEN 301 DO ji = 1, iextr 302 IF ( inpfiles(jj)%cextname(ji) /= clextvarsin(ji) ) THEN 303 CALL ctl_stop( 'Feedback file extra variables not consistent', & 304 & ' with previous files for this type' ) 305 ENDIF 306 END DO 307 ENDIF 308 207 309 ENDIF 208 310 … … 351 453 & iindx ) 352 454 353 CALL obs_surf_alloc( surfdata, iobs, kvars, k extr, kstp, jpi, jpj )455 CALL obs_surf_alloc( surfdata, iobs, kvars, kadd+iadd, kextr+iextr, kstp, jpi, jpj ) 354 456 355 457 ! Read obs/positions, QC, all variable and assign to surfdata … … 358 460 359 461 surfdata%cvars(:) = clvarsin(:) 462 surfdata%clong(:) = cllongin(:) 463 surfdata%cunit(:) = clunitin(:) 464 surfdata%cgrid(:) = clgridin(:) 465 IF ( iadd > 0 ) THEN 466 surfdata%caddvars(kadd+1:) = claddvarsin(:) 467 surfdata%caddlong(kadd+1:,:) = claddlongin(:,:) 468 surfdata%caddunit(kadd+1:,:) = claddunitin(:,:) 469 ENDIF 470 IF ( iextr > 0 ) THEN 471 surfdata%cextvars(kextr+1:) = clextvarsin(:) 472 surfdata%cextlong(kextr+1:) = clextlongin(:) 473 surfdata%cextunit(kextr+1:) = clextunitin(:) 474 ENDIF 360 475 361 476 ityp (:) = 0 … … 433 548 surfdata%nsfil(iobs) = iindx(jk) 434 549 435 ! QC flags 436 surfdata%nqc(iobs) = inpfiles(jj)%ivqc(ji,1) 437 438 ! Observed value 439 surfdata%robs(iobs,1) = inpfiles(jj)%pob(1,ji,1) 440 441 442 ! Model and MDT is set to fbrmdi unless read from file 443 IF ( ldmod ) THEN 444 surfdata%rmod(iobs,1) = inpfiles(jj)%padd(1,ji,1,1) 445 IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) THEN 446 surfdata%rext(iobs,1) = inpfiles(jj)%padd(1,ji,2,1) 447 surfdata%rext(iobs,2) = inpfiles(jj)%pext(1,ji,1) 550 DO jvar = 1, kvars 551 552 ! QC flags 553 ! WHY IS THIS NOT A FUNCTION OF NUM VARS? 554 surfdata%nqc(iobs) = inpfiles(jj)%ivqc(ji,jvar) 555 556 ! Observed value 557 surfdata%robs(iobs,jvar) = inpfiles(jj)%pob(1,ji,jvar) 558 559 ! THIS NEEDS SORTING 560 ! ! Model and MDT is set to fbrmdi unless read from file 561 ! IF ( ldmod ) THEN 562 ! surfdata%rmod(iobs,jvar) = inpfiles(jj)%padd(1,ji,1,1) 563 ! IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) THEN 564 ! surfdata%rext(iobs,1) = inpfiles(jj)%padd(1,ji,2,1) 565 ! surfdata%rext(iobs,2) = inpfiles(jj)%pext(1,ji,1) 566 ! ENDIF 567 ! ELSE 568 ! surfdata%rmod(iobs,jvar) = fbrmdi 569 ! IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) surfdata%rext(iobs,:) = fbrmdi 570 ! ENDIF 571 572 ! Additional variables 573 surfdata%rmod(iobs,jvar) = fbrmdi 574 IF ( iadd > 0 ) THEN 575 jadd2 = 0 576 DO jadd = 1, inpfiles(jj)%nadd 577 IF ( TRIM(inpfiles(jj)%caddname(jadd)) == 'Hx' ) THEN 578 IF ( ldmod ) THEN 579 surfdata%rmod(iobs,jvar) = inpfiles(jj)%padd(1,ji,jadd,jvar) 580 ENDIF 581 ELSE 582 jadd2 = jadd2 + 1 583 surfdata%radd(iobs,kadd+jadd2,jvar) = & 584 & inpfiles(jj)%padd(1,ji,jadd,jvar) 585 ENDIF 586 END DO 448 587 ENDIF 449 ELSE 450 surfdata%rmod(iobs,1) = fbrmdi 451 IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) surfdata%rext(iobs,:) = fbrmdi 588 589 END DO 590 591 ! Extra variables 592 IF ( iextr > 0 ) THEN 593 DO jext = 1, iextr 594 surfdata%rext(iobs,kextr+jext) = inpfiles(jj)%pext(1,ji,jext) 595 END DO 452 596 ENDIF 453 597 ENDIF … … 467 611 !----------------------------------------------------------------------- 468 612 IF (lwp) THEN 469 613 DO jvar = 1, surfdata%nvar 614 IF ( jvar == 1 ) THEN 615 cout1=TRIM(surfdata%cvars(1)) 616 ELSE 617 WRITE(cout1,'(A,A1,A)') TRIM(cout1), '/', TRIM(surfdata%cvars(jvar)) 618 ENDIF 619 END DO 620 470 621 WRITE(numout,*) 471 WRITE(numout,'(1X,A)')TRIM( surfdata%cvars(1))//' data'622 WRITE(numout,'(1X,A)')TRIM( cout1 )//' data' 472 623 WRITE(numout,'(1X,A)')'--------------' 473 624 DO jj = 1,8 … … 479 630 & '---------------------------------------------------------------' 480 631 WRITE(numout,'(1X,A,I8)') & 481 & 'Total data for variable '//TRIM( surfdata%cvars(1))// &632 & 'Total data for variable '//TRIM( cout1 )// & 482 633 & ' = ', iobsmpp 483 634 WRITE(numout,'(1X,A)') & … … 490 641 ! Deallocate temporary data 491 642 !----------------------------------------------------------------------- 492 DEALLOCATE( ifileidx, isurfidx, zdat, clvarsin ) 643 DEALLOCATE( ifileidx, isurfidx, zdat, clvarsin, & 644 & cllongin, clunitin, clgridin ) 645 IF ( iadd > 0 ) THEN 646 DEALLOCATE( claddvarsin, claddlongin, claddunitin) 647 ENDIF 648 IF ( iextr > 0 ) THEN 649 DEALLOCATE( clextvarsin, clextlongin, clextunitin ) 650 ENDIF 493 651 494 652 !----------------------------------------------------------------------- -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_readmdt.F90
r14075 r15180 108 108 & CALL obs_offset_mdt( jpi, jpj, z_mdt, zfill ) 109 109 110 ! Inte polate the MDT already on the model grid at the observation point111 110 ! Interpolate the MDT already on the model grid at the observation point 111 112 112 ALLOCATE( & 113 113 & igrdi(2,2,sladata%nsurf), & … … 118 118 & zmdtl(2,2,sladata%nsurf) & 119 119 & ) 120 120 121 121 DO jobs = 1, sladata%nsurf 122 122 … … 147 147 148 148 CALL obs_int_h2d( 1, 1, zweig, zmdtl(:,:,jobs), zext ) 149 150 sladata%rext(jobs,2) = zext(1) 149 150 ! FIGURE OUT THIS ASSIGNMENT 151 ! sladata%rext(jobs,2) = zext(1) 151 152 152 153 ! mark any masked data with a QC flag 153 154 IF( zobsmask(1) == 0 ) sladata%nqc(jobs) = IBSET(sladata%nqc(jobs),15) 154 155 155 156 156 END DO 157 157 158 DEALLOCATE( & 158 159 & igrdi, & -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_surf_def.F90
r14075 r15180 23 23 USE obs_mpp, ONLY : & ! MPP tools 24 24 obs_mpp_sum_integer 25 USE obs_fbm ! Obs feedback format 25 26 26 27 IMPLICIT NONE … … 45 46 INTEGER :: nsurfmpp !: Global number of surface data within window 46 47 INTEGER :: nvar !: Number of variables at observation points 48 INTEGER :: nadd !: Number of additional fields at observation points 47 49 INTEGER :: nextra !: Number of extra fields at observation points 48 50 INTEGER :: nstp !: Number of time steps … … 69 71 & ntyp !: Type of surface observation product 70 72 71 CHARACTER(len=8), POINTER, DIMENSION(:) :: & 72 & cvars !: Variable names 73 74 CHARACTER(LEN=8), POINTER, DIMENSION(:) :: & 73 CHARACTER(len=ilenname), POINTER, DIMENSION(:) :: & 74 & cvars, & !: Variable names 75 & cextvars, & !: Extra variable names 76 & caddvars !: Additional variable names 77 78 CHARACTER(len=ilenlong), POINTER, DIMENSION(:) :: & 79 & clong, & !: Variable long names 80 & cextlong !: Extra variable long names 81 82 CHARACTER(len=ilenlong), POINTER, DIMENSION(:,:) :: & 83 & caddlong !: Additional variable long names 84 85 CHARACTER(len=ilenunit), POINTER, DIMENSION(:) :: & 86 & cunit, & !: Variable units 87 & cextunit !: Extra variable units 88 89 CHARACTER(len=ilenunit), POINTER, DIMENSION(:,:) :: & 90 & caddunit !: Additional variable units 91 92 CHARACTER(len=ilengrid), POINTER, DIMENSION(:) :: & 93 & cgrid !: Variable grids 94 95 CHARACTER(LEN=ilenwmo), POINTER, DIMENSION(:) :: & 75 96 & cwmo !: WMO indentifier 76 97 … … 86 107 & rext !: Extra fields interpolated to observation points 87 108 88 REAL(KIND=wp), POINTER, DIMENSION(:,:) :: & 109 REAL(KIND=wp), POINTER, DIMENSION(:,:,:) :: & 110 & radd !: Additional fields interpolated to observation points 111 112 REAL(KIND=wp), POINTER, DIMENSION(:,:,:) :: & 89 113 & vdmean !: Time averaged of model field 90 114 … … 121 145 CONTAINS 122 146 123 SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, k extra, kstp, kpi, kpj )147 SUBROUTINE obs_surf_alloc( surf, ksurf, kvar, kadd, kextra, kstp, kpi, kpj ) 124 148 !!---------------------------------------------------------------------- 125 149 !! *** ROUTINE obs_surf_alloc *** … … 136 160 INTEGER, INTENT(IN) :: ksurf ! Number of surface observations 137 161 INTEGER, INTENT(IN) :: kvar ! Number of surface variables 162 INTEGER, INTENT(IN) :: kadd ! Number of additional fields at observation points 138 163 INTEGER, INTENT(IN) :: kextra ! Number of extra fields at observation points 139 164 INTEGER, INTENT(IN) :: kstp ! Number of time steps … … 143 168 !!* Local variables 144 169 INTEGER :: ji 145 INTEGER :: jvar 170 INTEGER :: jvar, jadd, jext 146 171 147 172 ! Set bookkeeping variables … … 149 174 surf%nsurf = ksurf 150 175 surf%nsurfmpp = 0 176 surf%nadd = kadd 151 177 surf%nextra = kextra 152 178 surf%nvar = kvar … … 158 184 159 185 ALLOCATE( & 160 & surf%cvars(kvar) & 186 & surf%cvars(kvar), & 187 & surf%clong(kvar), & 188 & surf%cunit(kvar), & 189 & surf%cgrid(kvar) & 161 190 & ) 162 191 163 192 DO jvar = 1, kvar 164 193 surf%cvars(jvar) = "NotSet" 194 surf%clong(jvar) = "NotSet" 195 surf%cunit(jvar) = "NotSet" 196 surf%cgrid(jvar) = "" 197 END DO 198 199 ! Allocate additional/extra variable metadata 200 201 ALLOCATE( & 202 & surf%caddvars(kadd), & 203 & surf%caddlong(kadd,kvar), & 204 & surf%caddunit(kadd,kvar), & 205 & surf%cextvars(kextra), & 206 & surf%cextlong(kextra), & 207 & surf%cextunit(kextra) & 208 ) 209 210 DO jadd = 1, kadd 211 surf%caddvars(jadd) = "NotSet" 212 DO jvar = 1, kvar 213 surf%caddlong(jadd,jvar) = "NotSet" 214 surf%caddunit(jadd,jvar) = "NotSet" 215 END DO 216 END DO 217 218 DO jext = 1, kextra 219 surf%cextvars(jext) = "NotSet" 220 surf%cextlong(jext) = "NotSet" 221 surf%cextunit(jext) = "NotSet" 165 222 END DO 166 223 … … 205 262 surf%rext(:,:) = 0.0_wp 206 263 264 ! Allocate arrays of number of additional fields at observation points 265 266 ALLOCATE( & 267 & surf%radd(ksurf,kadd,kvar) & 268 & ) 269 270 surf%radd(:,:,:) = 0.0_wp 271 207 272 ! Allocate arrays of number of time step size 208 273 … … 215 280 216 281 ALLOCATE( & 217 & surf%vdmean(kpi,kpj ) &282 & surf%vdmean(kpi,kpj,kvar) & 218 283 & ) 219 284 … … 291 356 & ) 292 357 358 ! Deallocate arrays of number of additional fields at observation points 359 360 DEALLOCATE( & 361 & surf%radd & 362 & ) 363 293 364 ! Deallocate arrays of size number of grid points size times 294 365 ! number of variables … … 308 379 309 380 DEALLOCATE( & 310 & surf%cvars & 311 & ) 381 & surf%cvars, & 382 & surf%clong, & 383 & surf%cunit, & 384 & surf%cgrid & 385 & ) 386 387 ! Dellocate additional/extra variables metadata 388 389 DEALLOCATE( & 390 & surf%caddvars, & 391 & surf%caddlong, & 392 & surf%caddunit, & 393 & surf%cextvars, & 394 & surf%cextlong, & 395 & surf%cextunit & 396 ) 312 397 313 398 END SUBROUTINE obs_surf_dealloc … … 343 428 INTEGER :: ji 344 429 INTEGER :: jk 430 INTEGER :: jadd 345 431 LOGICAL, DIMENSION(:), ALLOCATABLE :: llvalid 346 432 … … 361 447 362 448 IF ( lallocate ) THEN 363 CALL obs_surf_alloc( newsurf, insurf, surf%nvar, &449 CALL obs_surf_alloc( newsurf, insurf, surf%nvar, surf%nadd, & 364 450 & surf%nextra, surf%nstp, surf%npi, surf%npj ) 365 451 ENDIF … … 410 496 newsurf%rmod(insurf,jk) = surf%rmod(ji,jk) 411 497 498 DO jadd = 1, surf%nadd 499 newsurf%radd(insurf,jadd,jk) = surf%radd(ji,jadd,jk) 500 END DO 501 412 502 END DO 413 503 … … 435 525 newsurf%nstp = surf%nstp 436 526 newsurf%cvars(:) = surf%cvars(:) 527 newsurf%clong(:) = surf%clong(:) 528 newsurf%cunit(:) = surf%cunit(:) 529 newsurf%cgrid(:) = surf%cgrid(:) 530 newsurf%caddvars(:) = surf%caddvars(:) 531 newsurf%caddlong(:) = surf%caddlong(:) 532 newsurf%caddunit(:) = surf%caddunit(:) 533 newsurf%cextvars(:) = surf%cextvars(:) 534 newsurf%cextlong(:) = surf%cextlong(:) 535 newsurf%cextunit(:) = surf%cextunit(:) 437 536 438 537 ! Set gridded stuff … … 470 569 INTEGER :: jj 471 570 INTEGER :: jk 571 INTEGER :: jadd 472 572 473 573 ! Copy data from surf to old surf … … 504 604 oldsurf%robs(jj,jk) = surf%robs(ji,jk) 505 605 oldsurf%rmod(jj,jk) = surf%rmod(ji,jk) 606 607 DO jadd = 1, surf%nadd 608 oldsurf%radd(jj,jadd,jk) = surf%radd(ji,jadd,jk) 609 END DO 506 610 507 611 END DO -
NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_write.F90
r15089 r15180 54 54 CONTAINS 55 55 56 SUBROUTINE obs_wri_prof( profdata, padd, pext )56 SUBROUTINE obs_wri_prof( profdata, clfiletype, padd, pext ) 57 57 !!----------------------------------------------------------------------- 58 58 !! … … 77 77 !! * Arguments 78 78 TYPE(obs_prof), INTENT(INOUT) :: profdata ! Full set of profile data 79 TYPE(obswriinfo), OPTIONAL :: padd ! Additional info for each variable 80 TYPE(obswriinfo), OPTIONAL :: pext ! Extra info 79 CHARACTER(LEN=25), INTENT(IN) :: clfiletype ! Base name for file name 80 TYPE(obswriinfo), OPTIONAL :: padd ! Additional info for each variable 81 TYPE(obswriinfo), OPTIONAL :: pext ! Extra info 81 82 82 83 !! * Local declarations 83 84 TYPE(obfbdata) :: fbdata 84 85 CHARACTER(LEN=40) :: clfname 85 CHARACTER(LEN=10) :: clfiletype86 86 CHARACTER(LEN=ilenlong) :: cllongname ! Long name of variable 87 87 CHARACTER(LEN=ilenunit) :: clunits ! Units of variable … … 120 120 END DO 121 121 122 SELECT CASE ( TRIM(profdata%cvars(1)) ) 123 CASE('POTM') 124 125 clfiletype='profb' 126 CALL alloc_obfbdata( fbdata, 2, profdata%nprof, ilevel, & 127 & 1 + iadd, 1 + iext, .TRUE. ) 128 fbdata%cname(1) = profdata%cvars(1) 129 fbdata%cname(2) = profdata%cvars(2) 130 fbdata%coblong(1) = 'Potential temperature' 131 fbdata%coblong(2) = 'Practical salinity' 132 fbdata%cobunit(1) = 'Degrees centigrade' 133 fbdata%cobunit(2) = 'PSU' 134 fbdata%cextname(1) = 'TEMP' 135 fbdata%cextlong(1) = 'Insitu temperature' 136 fbdata%cextunit(1) = 'Degrees centigrade' 137 fbdata%caddlong(1,1) = 'Model interpolated potential temperature' 138 fbdata%caddlong(1,2) = 'Model interpolated practical salinity' 139 fbdata%caddunit(1,1) = 'Degrees centigrade' 140 fbdata%caddunit(1,2) = 'PSU' 141 fbdata%cgrid(:) = 'T' 142 DO je = 1, iext 143 fbdata%cextname(1+je) = pext%cdname(je) 144 fbdata%cextlong(1+je) = pext%cdlong(je,1) 145 fbdata%cextunit(1+je) = pext%cdunit(je,1) 146 END DO 147 DO ja = 1, iadd 148 fbdata%caddname(1+ja) = padd%cdname(ja) 149 DO jvar = 1, 2 122 CALL alloc_obfbdata( fbdata, profdata%nvar, profdata%nprof, ilevel, & 123 & 1 + iadd, iext, .TRUE. ) 124 fbdata%caddname(1) = 'Hx' 125 DO jvar = 1, profdata%nvar 126 fbdata%cname(jvar) = profdata%cvars(jvar) 127 fbdata%coblong(jvar) = profdata%clong(jvar) 128 fbdata%cobunit(jvar) = profdata%cunit(jvar) 129 fbdata%cgrid(jvar) = profdata%cgrid(jvar) 130 fbdata%caddlong(1,jvar) = 'Model interpolated ' // TRIM(profdata%clong(jvar)) 131 fbdata%caddunit(1,jvar) = profdata%cunit(jvar) 132 IF (iadd > 0) THEN 133 DO ja = 1, iadd 134 fbdata%caddname(1+ja) = padd%cdname(ja) 150 135 fbdata%caddlong(1+ja,jvar) = padd%cdlong(ja,jvar) 151 136 fbdata%caddunit(1+ja,jvar) = padd%cdunit(ja,jvar) 152 137 END DO 153 END DO 154 155 CASE('UVEL') 156 157 clfiletype='velfb' 158 CALL alloc_obfbdata( fbdata, 2, profdata%nprof, ilevel, 1, 0, .TRUE. ) 159 fbdata%cname(1) = profdata%cvars(1) 160 fbdata%cname(2) = profdata%cvars(2) 161 fbdata%coblong(1) = 'Zonal velocity' 162 fbdata%coblong(2) = 'Meridional velocity' 163 fbdata%cobunit(1) = 'm/s' 164 fbdata%cobunit(2) = 'm/s' 165 DO je = 1, iext 166 fbdata%cextname(je) = pext%cdname(je) 167 fbdata%cextlong(je) = pext%cdlong(je,1) 168 fbdata%cextunit(je) = pext%cdunit(je,1) 169 END DO 170 fbdata%caddlong(1,1) = 'Model interpolated zonal velocity' 171 fbdata%caddlong(1,2) = 'Model interpolated meridional velocity' 172 fbdata%caddunit(1,1) = 'm/s' 173 fbdata%caddunit(1,2) = 'm/s' 174 fbdata%cgrid(1) = 'U' 175 fbdata%cgrid(2) = 'V' 176 DO ja = 1, iadd 177 fbdata%caddname(1+ja) = padd%cdname(ja) 178 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 179 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 180 END DO 181 182 END SELECT 183 184 IF ( ( TRIM(profdata%cvars(1)) /= 'POTM' ) .AND. & 185 & ( TRIM(profdata%cvars(1)) /= 'UVEL' ) ) THEN 186 CALL alloc_obfbdata( fbdata, 1, profdata%nprof, ilevel, & 187 & 1 + iadd, iext, .TRUE. ) 188 fbdata%cname(1) = profdata%cvars(1) 189 fbdata%coblong(1) = cllongname 190 fbdata%cobunit(1) = clunits 191 fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(cllongname) 192 fbdata%caddunit(1,1) = clunits 193 fbdata%cgrid(:) = clgrid 194 DO je = 1, iext 195 fbdata%cextname(je) = pext%cdname(je) 196 fbdata%cextlong(je) = pext%cdlong(je,1) 197 fbdata%cextunit(je) = pext%cdunit(je,1) 198 END DO 199 DO ja = 1, iadd 200 fbdata%caddname(1+ja) = padd%cdname(ja) 201 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 202 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 203 END DO 204 ENDIF 205 206 fbdata%caddname(1) = 'Hx' 207 208 WRITE(clfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc 138 ENDIF 139 IF (iext > 0) THEN 140 DO je = 1, iext 141 fbdata%cextname(je) = pext%cdname(je) 142 fbdata%cextlong(je) = pext%cdlong(je,1) 143 fbdata%cextunit(je) = pext%cdunit(je,1) 144 END DO 145 ENDIF 146 END DO 147 !fbdata%cextname(1) = 'TEMP' 148 !fbdata%cextlong(1) = 'Insitu temperature' 149 !fbdata%cextunit(1) = 'Degrees centigrade' 150 151 WRITE(clfname, FMT="(A,'fb_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc 209 152 210 153 IF(lwp) THEN … … 274 217 ENDIF 275 218 fbdata%iobsk(ik,jo,jvar) = profdata%var(jvar)%mvk(jk) 276 DO ja = 1, iadd 277 fbdata%padd(ik,jo,1+ja,jvar) = & 278 & profdata%var(jvar)%vext(jk,padd%ipoint(ja)) 279 END DO 280 DO je = 1, iext 281 fbdata%pext(ik,jo,1+je) = & 282 & profdata%var(jvar)%vext(jk,pext%ipoint(je)) 283 END DO 284 IF ( ( jvar == 1 ) .AND. & 285 & ( TRIM(profdata%cvars(1)) == 'POTM' ) ) THEN 286 fbdata%pext(ik,jo,1) = profdata%var(jvar)%vext(jk,1) 287 ENDIF 219 IF (iadd > 0) THEN 220 DO ja = 1, iadd 221 fbdata%padd(ik,jo,1+ja,jvar) = & 222 & profdata%var(jvar)%vadd(jk,padd%ipoint(ja)) 223 END DO 224 ENDIF 225 ! MOVE OUTSIDE JVAR LOOP? 226 IF (iext > 0) THEN 227 DO je = 1, iext 228 fbdata%pext(ik,jo,je) = & 229 & profdata%vext(jk,pext%ipoint(je)) 230 END DO 231 ENDIF 232 !IF ( ( jvar == 1 ) .AND. & 233 ! & ( TRIM(profdata%cvars(1)) == 'POTM' ) ) THEN 234 ! fbdata%pext(ik,jo,1) = profdata%var(jvar)%vext(jk,1) 235 !ENDIF 288 236 END DO 289 237 END DO 290 238 END DO 291 239 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 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 313 261 314 262 ! Write the obfbdata structure … … 322 270 END SUBROUTINE obs_wri_prof 323 271 324 SUBROUTINE obs_wri_surf( surfdata, padd, pext )272 SUBROUTINE obs_wri_surf( surfdata, clfiletype, padd, pext ) 325 273 !!----------------------------------------------------------------------- 326 274 !! … … 342 290 343 291 !! * Arguments 344 TYPE(obs_surf), INTENT(INOUT) :: surfdata ! Full set of surface data 345 TYPE(obswriinfo), OPTIONAL :: padd ! Additional info for each variable 346 TYPE(obswriinfo), OPTIONAL :: pext ! Extra info 292 TYPE(obs_surf), INTENT(INOUT) :: surfdata ! Full set of surface data 293 CHARACTER(LEN=25), INTENT(IN) :: clfiletype ! Base name for file name 294 TYPE(obswriinfo), OPTIONAL :: padd ! Additional info for each variable 295 TYPE(obswriinfo), OPTIONAL :: pext ! Extra info 347 296 348 297 !! * Local declarations 349 298 TYPE(obfbdata) :: fbdata 350 299 CHARACTER(LEN=40) :: clfname ! netCDF filename 351 CHARACTER(LEN=10) :: clfiletype352 300 CHARACTER(LEN=ilenlong) :: cllongname ! Long name of variable 353 301 CHARACTER(LEN=ilenunit) :: clunits ! Units of variable … … 357 305 INTEGER :: ja 358 306 INTEGER :: je 307 INTEGER :: jvar 359 308 INTEGER :: iadd 360 309 INTEGER :: iext … … 374 323 CALL init_obfbdata( fbdata ) 375 324 376 SELECT CASE ( TRIM(surfdata%cvars(1)) ) 377 CASE('SLA') 378 379 ! SLA needs special treatment because of MDT, so is all done here 380 ! Other variables are done more generically 381 ! No climatology for SLA, MDT is our best estimate of that and is already output. 382 383 CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, & 384 & 2 + iadd, 1 + iext, .TRUE. ) 385 386 clfiletype = 'slafb' 387 fbdata%cname(1) = surfdata%cvars(1) 388 fbdata%coblong(1) = 'Sea level anomaly' 389 fbdata%cobunit(1) = 'Metres' 390 fbdata%cextname(1) = 'MDT' 391 fbdata%cextlong(1) = 'Mean dynamic topography' 392 fbdata%cextunit(1) = 'Metres' 393 DO je = 1, iext 394 fbdata%cextname(je) = pext%cdname(je) 395 fbdata%cextlong(je) = pext%cdlong(je,1) 396 fbdata%cextunit(je) = pext%cdunit(je,1) 397 END DO 398 fbdata%caddlong(1,1) = 'Model interpolated SSH - MDT' 399 fbdata%caddunit(1,1) = 'Metres' 400 fbdata%caddname(2) = 'SSH' 401 fbdata%caddlong(2,1) = 'Model Sea surface height' 402 fbdata%caddunit(2,1) = 'Metres' 403 fbdata%cgrid(1) = 'T' 404 DO ja = 1, iadd 405 fbdata%caddname(2+ja) = padd%cdname(ja) 406 fbdata%caddlong(2+ja,1) = padd%cdlong(ja,1) 407 fbdata%caddunit(2+ja,1) = padd%cdunit(ja,1) 408 END DO 409 410 CASE('SST') 411 412 clfiletype = 'sstfb' 413 cllongname = 'Sea surface temperature' 414 clunits = 'Degree centigrade' 415 clgrid = 'T' 416 417 CASE('ICECONC') 418 419 clfiletype = 'sicfb' 420 cllongname = 'Sea ice concentration' 421 clunits = 'Fraction' 422 clgrid = 'T' 423 424 CASE('SSS') 425 426 clfiletype = 'sssfb' 427 cllongname = 'Sea surface salinity' 428 clunits = 'psu' 429 clgrid = 'T' 430 431 CASE DEFAULT 432 433 CALL ctl_stop( 'Unknown observation type '//TRIM(surfdata%cvars(1))//' in obs_wri_surf' ) 434 435 END SELECT 436 437 ! SLA needs special treatment because of MDT, so is done above 438 ! Remaining variables treated more generically 439 440 IF ( TRIM(surfdata%cvars(1)) /= 'SLA' ) THEN 441 442 CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, & 325 CALL alloc_obfbdata( fbdata, surfdata%nvar, surfdata%nsurf, 1, & 443 326 & 1 + iadd, iext, .TRUE. ) 444 445 fbdata%cname(1) = surfdata%cvars(1)446 fbdata%coblong(1) = cllongname447 fbdata%cobunit(1) = clunits448 DO je = 1, iext449 fbdata%cextname(je) = pext%cdname(je)450 fbdata%cextlong(je) = pext%cdlong(je,1)451 fbdata%cextunit(je) = pext%cdunit(je,1)452 END DO453 IF ( TRIM(surfdata%cvars(1)) == 'ICECONC' ) THEN454 fbdata%caddlong(1,1) = 'Model interpolated ICE'455 ELSE456 fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1))457 ENDIF458 fbdata%caddunit(1,1) = clunits459 fbdata%cgrid(1) = clgrid460 DO ja = 1, iadd461 fbdata%caddname(1+ja) = padd%cdname(ja)462 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1)463 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1)464 END DO465 ENDIF466 467 327 fbdata%caddname(1) = 'Hx' 468 469 WRITE(clfname, FMT="(A,'_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc 328 DO jvar = 1, surfdata%nvar 329 fbdata%cname(jvar) = surfdata%cvars(jvar) 330 fbdata%coblong(jvar) = surfdata%clong(jvar) 331 fbdata%cobunit(jvar) = surfdata%cunit(jvar) 332 fbdata%cgrid(jvar) = surfdata%cgrid(jvar) 333 fbdata%caddlong(1,jvar) = 'Model interpolated ' // TRIM(surfdata%clong(jvar)) 334 fbdata%caddunit(1,jvar) = surfdata%cunit(jvar) 335 IF (iadd > 0) THEN 336 DO ja = 1, iadd 337 fbdata%caddname(1+ja) = padd%cdname(ja) 338 fbdata%caddlong(1+ja,jvar) = padd%cdlong(ja,jvar) 339 fbdata%caddunit(1+ja,jvar) = padd%cdunit(ja,jvar) 340 END DO 341 ENDIF 342 IF (iext > 0) THEN 343 DO je = 1, iext 344 fbdata%cextname(je) = pext%cdname(je) 345 fbdata%cextlong(je) = pext%cdlong(je,1) 346 fbdata%cextunit(je) = pext%cdunit(je,1) 347 END DO 348 ENDIF 349 END DO 350 !fbdata%cname(1) = surfdata%cvars(1) 351 !fbdata%coblong(1) = 'Sea level anomaly' 352 !fbdata%cobunit(1) = 'Metres' 353 !fbdata%cextname(1) = 'MDT' 354 !fbdata%cextlong(1) = 'Mean dynamic topography' 355 !fbdata%cextunit(1) = 'Metres' 356 !fbdata%caddname(2) = 'SSH' 357 !fbdata%caddlong(2,1) = 'Model Sea surface height' 358 !fbdata%caddunit(2,1) = 'Metres' 359 !IF ( TRIM(surfdata%cvars(1)) == 'ICECONC' ) THEN 360 ! fbdata%caddlong(1,1) = 'Model interpolated ICE' 361 !ELSE 362 ! fbdata%caddlong(1,1) = 'Model interpolated ' // TRIM(surfdata%cvars(1)) 363 !ENDIF 364 365 WRITE(clfname, FMT="(A,'fb_fdbk_',I4.4,'.nc')") TRIM(clfiletype), nproc 470 366 471 367 IF(lwp) THEN … … 514 410 & surfdata%nyea(jo), & 515 411 & fbdata%ptim(jo), & 516 & krefdate = 19500101 ) 517 fbdata%padd(1,jo,1,1) = surfdata%rmod(jo,1) 518 IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) fbdata%padd(1,jo,2,1) = surfdata%rext(jo,1) 519 fbdata%pob(1,jo,1) = surfdata%robs(jo,1) 412 & krefdate = 19500101 ) 520 413 fbdata%pdep(1,jo) = 0.0 521 414 fbdata%idqc(1,jo) = 0 522 415 fbdata%idqcf(:,1,jo) = 0 523 IF ( surfdata%nqc(jo) > 255 ) THEN 524 fbdata%ivqc(jo,1) = 4 525 fbdata%ivlqc(1,jo,1) = 4 526 fbdata%ivlqcf(1,1,jo,1) = 0 416 DO jvar = 1, surfdata%nvar 417 fbdata%padd(1,jo,1,jvar) = surfdata%rmod(jo,jvar) 418 !IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) fbdata%padd(1,jo,2,1) = surfdata%rext(jo,1) 419 fbdata%pob(1,jo,jvar) = surfdata%robs(jo,jvar) 420 IF ( surfdata%nqc(jo) > 255 ) THEN 421 fbdata%ivqc(jo,jvar) = 4 422 fbdata%ivlqc(1,jo,jvar) = 4 423 fbdata%ivlqcf(1,1,jo,jvar) = 0 527 424 !$AGRIF_DO_NOT_TREAT 528 fbdata%ivlqcf(2,1,jo,1) = IAND(surfdata%nqc(jo),b'0000000011111111')425 fbdata%ivlqcf(2,1,jo,jvar) = IAND(surfdata%nqc(jo),b'0000000011111111') 529 426 !$AGRIF_END_DO_NOT_TREAT 530 ELSE 531 fbdata%ivqc(jo,1) = surfdata%nqc(jo) 532 fbdata%ivlqc(1,jo,1) = surfdata%nqc(jo) 533 fbdata%ivlqcf(:,1,jo,1) = 0 534 ENDIF 535 fbdata%iobsk(1,jo,1) = 0 536 IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) fbdata%pext(1,jo,1) = surfdata%rext(jo,2) 537 DO ja = 1, iadd 538 fbdata%padd(1,jo,2+ja,1) = & 539 & surfdata%rext(jo,padd%ipoint(ja)) 427 ELSE 428 fbdata%ivqc(jo,jvar) = surfdata%nqc(jo) 429 fbdata%ivlqc(1,jo,jvar) = surfdata%nqc(jo) 430 fbdata%ivlqcf(:,1,jo,jvar) = 0 431 ENDIF 432 fbdata%iobsk(1,jo,jvar) = 0 433 !IF ( TRIM(surfdata%cvars(1)) == 'SLA' ) fbdata%pext(1,jo,1) = surfdata%rext(jo,2) 434 IF (iadd > 0) THEN 435 DO ja = 1, iadd 436 fbdata%padd(1,jo,1+ja,jvar) = & 437 & surfdata%radd(jo,padd%ipoint(ja),jvar) 438 END DO 439 ENDIF 540 440 END DO 541 DO je = 1, iext 542 fbdata%pext(1,jo,1+je) = & 543 & surfdata%rext(jo,pext%ipoint(je)) 544 END DO 441 IF (iext > 0) THEN 442 DO je = 1, iext 443 fbdata%pext(1,jo,je) = & 444 & surfdata%rext(jo,pext%ipoint(je)) 445 END DO 446 ENDIF 545 447 END DO 546 448
Note: See TracChangeset
for help on using the changeset viewer.