- Timestamp:
- 2017-03-09T13:52:43+01:00 (7 years ago)
- Location:
- branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS
- Files:
-
- 38 edited
- 36 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/ddatetoymdhms.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90
- Property svn:keywords deleted
r5704 r7773 27 27 USE obs_grid ! Grid searching 28 28 USE obs_read_altbias ! Bias treatment for altimeter 29 USE obs_sstbias ! Bias correction routine for SST 29 30 USE obs_profiles_def ! Profile data definitions 30 31 USE obs_surf_def ! Surface data definitions … … 76 77 !!---------------------------------------------------------------------- 77 78 79 !! * Substitutions 80 # include "domzgr_substitute.h90" 78 81 CONTAINS 79 82 … … 93 96 !! ! 06-10 (A. Weaver) Cleaning and add controls 94 97 !! ! 07-03 (K. Mogensen) General handling of profiles 98 !! ! 14-08 (J.While) Incorporated SST bias correction 95 99 !! ! 15-02 (M. Martin) Simplification of namelist and code 96 100 !!---------------------------------------------------------------------- … … 108 112 INTEGER :: jvar ! Counter for variables 109 113 INTEGER :: jfile ! Counter for files 114 INTEGER :: jnumsstbias ! Number of SST bias files to read and apply 110 115 111 116 CHARACTER(len=128), DIMENSION(jpmaxnfiles) :: & 112 & cn_profbfiles, & ! T/S profile input filenames 113 & cn_sstfbfiles, & ! Sea surface temperature input filenames 114 & cn_slafbfiles, & ! Sea level anomaly input filenames 115 & cn_sicfbfiles, & ! Seaice concentration input filenames 116 & cn_velfbfiles ! Velocity profile input filenames 117 & cn_profbfiles, & ! T/S profile input filenames 118 & cn_sstfbfiles, & ! Sea surface temperature input filenames 119 & cn_slafbfiles, & ! Sea level anomaly input filenames 120 & cn_sicfbfiles, & ! Seaice concentration input filenames 121 & cn_velfbfiles & ! Velocity profile input filenames 122 & cn_sssfbfiles, & ! Sea surface salinity input filenames 123 & cn_logchlfbfiles, & ! Log(Chl) input filenames 124 & cn_spmfbfiles, & ! Sediment input filenames 125 & cn_fco2fbfiles, & ! fco2 input filenames 126 & cn_pco2fbfiles, & ! pco2 input filenames 127 & cn_sstbiasfiles ! SST bias input filenames 128 117 129 CHARACTER(LEN=128) :: & 118 130 & cn_altbiasfile ! Altimeter bias input filename 131 119 132 CHARACTER(len=128), DIMENSION(:,:), ALLOCATABLE :: & 120 133 & clproffiles, & ! Profile filenames … … 126 139 LOGICAL :: ln_sst ! Logical switch for sea surface temperature 127 140 LOGICAL :: ln_sic ! Logical switch for sea ice concentration 141 LOGICAL :: ln_sss ! Logical switch for sea surface salinity obs 128 142 LOGICAL :: ln_vel3d ! Logical switch for velocity (u,v) obs 143 LOGICAL :: ln_logchl ! Logical switch for log(Chl) obs 144 LOGICAL :: ln_spm ! Logical switch for sediment obs 145 LOGICAL :: ln_fco2 ! Logical switch for fco2 obs 146 LOGICAL :: ln_pco2 ! Logical switch for pco2 obs 129 147 LOGICAL :: ln_nea ! Logical switch to remove obs near land 130 148 LOGICAL :: ln_altbias ! Logical switch for altimeter bias 149 LOGICAL :: ln_sstbias ! Logical switch for bias correction of SST 131 150 LOGICAL :: ln_ignmis ! Logical switch for ignoring missing files 132 151 LOGICAL :: ln_s_at_t ! Logical switch to compute model S at T obs 152 LOGICAL :: ln_bound_reject ! Logical switch for rejecting obs near the boundary 133 153 LOGICAL :: llvar1 ! Logical for profile variable 1 134 154 LOGICAL :: llvar2 ! Logical for profile variable 1 … … 148 168 149 169 NAMELIST/namobs/ln_diaobs, ln_t3d, ln_s3d, ln_sla, & 150 & ln_sst, ln_sic, ln_vel3d, & 151 & ln_altbias, ln_nea, ln_grid_global, & 152 & ln_grid_search_lookup, & 153 & ln_ignmis, ln_s_at_t, ln_sstnight, & 170 & ln_sst, ln_sic, ln_sss, ln_vel3d, & 171 & ln_logchl, ln_spm, ln_fco2, ln_pco2, & 172 & ln_altbias, ln_sstbias, ln_nea, & 173 & ln_grid_global, ln_grid_search_lookup, & 174 & ln_ignmis, ln_s_at_t, ln_bound_reject, & 175 176 ln_sstnight, & 154 177 & cn_profbfiles, cn_slafbfiles, & 155 178 & cn_sstfbfiles, cn_sicfbfiles, & 156 & cn_velfbfiles, cn_altbiasfile, & 179 & cn_velfbfiles, cn_sssfbfiles, & 180 & cn_logchlfbfiles, cn_spmfbfiles, & 181 & cn_fco2fbfiles, cn_pco2fbfiles, & 182 & cn_sstbiasfiles, cn_altbiasfile, & 157 183 & cn_gridsearchfile, rn_gridsearchres, & 158 184 & rn_dobsini, rn_dobsend, nn_1dint, nn_2dint, & … … 172 198 173 199 ! Some namelist arrays need initialising 174 cn_profbfiles(:) = '' 175 cn_slafbfiles(:) = '' 176 cn_sstfbfiles(:) = '' 177 cn_sicfbfiles(:) = '' 178 cn_velfbfiles(:) = '' 179 nn_profdavtypes(:) = -1 200 cn_profbfiles(:) = '' 201 cn_slafbfiles(:) = '' 202 cn_sstfbfiles(:) = '' 203 cn_sicfbfiles(:) = '' 204 cn_velfbfiles(:) = '' 205 cn_sssfbfiles(:) = '' 206 cn_logchlfbfiles(:) = '' 207 cn_spmfbfiles(:) = '' 208 cn_fco2fbfiles(:) = '' 209 cn_pco2fbfiles(:) = '' 210 cn_sstbiasfiles(:) = '' 211 nn_profdavtypes(:) = -1 180 212 181 213 CALL ini_date( rn_dobsini ) … … 204 236 205 237 nproftypes = COUNT( (/ln_t3d .OR. ln_s3d, ln_vel3d /) ) 206 nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic /) ) 238 nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_sss, & 239 & ln_logchl, ln_spm, ln_fco2, ln_pco2 /) ) 207 240 208 241 IF ( nproftypes == 0 .AND. nsurftypes == 0 ) THEN … … 285 318 ENDIF 286 319 #endif 320 IF (ln_sss) THEN 321 jtype = jtype + 1 322 clsurffiles(jtype,:) = cn_sssfbfiles(:) 323 cobstypessurf(jtype) = 'sss ' 324 ifilessurf(jtype) = 0 325 DO jfile = 1, jpmaxnfiles 326 IF ( trim(clsurffiles(jtype,jfile)) /= '' ) & 327 ifilessurf(jtype) = ifilessurf(jtype) + 1 328 END DO 329 ENDIF 330 331 IF (ln_logchl) THEN 332 jtype = jtype + 1 333 clsurffiles(jtype,:) = cn_logchlfbfiles(:) 334 cobstypessurf(jtype) = 'logchl' 335 ifilessurf(jtype) = 0 336 DO jfile = 1, jpmaxnfiles 337 IF ( trim(clsurffiles(jtype,jfile)) /= '' ) & 338 ifilessurf(jtype) = ifilessurf(jtype) + 1 339 END DO 340 ENDIF 341 342 IF (ln_spm) THEN 343 jtype = jtype + 1 344 clsurffiles(jtype,:) = cn_spmfbfiles(:) 345 cobstypessurf(jtype) = 'spm ' 346 ifilessurf(jtype) = 0 347 DO jfile = 1, jpmaxnfiles 348 IF ( trim(clsurffiles(jtype,jfile)) /= '' ) & 349 ifilessurf(jtype) = ifilessurf(jtype) + 1 350 END DO 351 ENDIF 352 353 IF (ln_fco2) THEN 354 jtype = jtype + 1 355 clsurffiles(jtype,:) = cn_fco2fbfiles(:) 356 cobstypessurf(jtype) = 'fco2 ' 357 ifilessurf(jtype) = 0 358 DO jfile = 1, jpmaxnfiles 359 IF ( trim(clsurffiles(jtype,jfile)) /= '' ) & 360 ifilessurf(jtype) = ifilessurf(jtype) + 1 361 END DO 362 ENDIF 363 364 IF (ln_pco2) THEN 365 jtype = jtype + 1 366 clsurffiles(jtype,:) = cn_pco2fbfiles(:) 367 cobstypessurf(jtype) = 'pco2 ' 368 ifilessurf(jtype) = 0 369 DO jfile = 1, jpmaxnfiles 370 IF ( trim(clsurffiles(jtype,jfile)) /= '' ) & 371 ifilessurf(jtype) = ifilessurf(jtype) + 1 372 END DO 373 ENDIF 287 374 288 375 ENDIF … … 300 387 WRITE(numout,*) ' Logical switch for Sea Ice observations ln_sic = ', ln_sic 301 388 WRITE(numout,*) ' Logical switch for velocity observations ln_vel3d = ', ln_vel3d 389 WRITE(numout,*) ' Logical switch for SSS observations ln_sss = ', ln_sss 390 WRITE(numout,*) ' Logical switch for log(Chl) observations ln_logchl = ', ln_logchl 391 WRITE(numout,*) ' Logical switch for SPM observations ln_spm = ', ln_spm 392 WRITE(numout,*) ' Logical switch for FCO2 observations ln_fco2 = ', ln_fco2 393 WRITE(numout,*) ' Logical switch for PCO2 observations ln_pco2 = ', ln_pco2 302 394 WRITE(numout,*) ' Global distribution of observations ln_grid_global = ',ln_grid_global 303 395 WRITE(numout,*) ' Logical switch for obs grid search lookup ln_grid_search_lookup = ',ln_grid_search_lookup … … 309 401 WRITE(numout,*) ' Type of horizontal interpolation method nn_2dint = ', nn_2dint 310 402 WRITE(numout,*) ' Rejection of observations near land switch ln_nea = ', ln_nea 403 WRITE(numout,*) ' Rejection of obs near open bdys ln_bound_reject = ', ln_bound_reject 311 404 WRITE(numout,*) ' MSSH correction scheme nn_msshc = ', nn_msshc 312 405 WRITE(numout,*) ' MDT correction rn_mdtcorr = ', rn_mdtcorr 313 406 WRITE(numout,*) ' MDT cutoff for computed correction rn_mdtcutoff = ', rn_mdtcutoff 314 407 WRITE(numout,*) ' Logical switch for alt bias ln_altbias = ', ln_altbias 408 WRITE(numout,*) ' Logical switch for sst bias ln_sstbias = ', ln_sstbias 315 409 WRITE(numout,*) ' Logical switch for ignoring missing files ln_ignmis = ', ln_ignmis 316 410 WRITE(numout,*) ' Daily average types nn_profdavtypes = ', nn_profdavtypes … … 418 512 & jpi, jpj, jpk, & 419 513 & zmask1, zglam1, zgphi1, zmask2, zglam2, zgphi2, & 420 & ln_nea, kdailyavtypes = nn_profdavtypes ) 514 & ln_nea, ln_bound_reject, & 515 & kdailyavtypes = nn_profdavtypes ) 421 516 422 517 END DO … … 447 542 & rn_dobsini, rn_dobsend, ln_ignmis, .FALSE., llnightav ) 448 543 449 CALL obs_pre_surf( surfdata(jtype), surfdataqc(jtype), ln_nea )544 CALL obs_pre_surf( surfdata(jtype), surfdataqc(jtype), ln_nea, ln_bound_reject ) 450 545 451 546 IF ( TRIM(cobstypessurf(jtype)) == 'sla' ) THEN … … 453 548 IF ( ln_altbias ) CALL obs_rea_altbias ( surfdataqc(jtype), nn_2dint, cn_altbiasfile ) 454 549 ENDIF 550 551 IF ( TRIM(cobstypessurf(jtype)) == 'sst' .AND. ln_sstbias ) THEN 552 jnumsstbias = 0 553 DO jfile = 1, jpmaxnfiles 554 IF ( TRIM(cn_sstbiasfiles(jfile)) /= '' ) & 555 jnumsstbias = jnumsstbias + 1 556 END DO 557 IF ( jnumsstbias == 0 ) THEN 558 CALL ctl_stop("ln_sstbias set,"// & 559 & " but no bias files to read in") 560 ENDIF 561 562 CALL obs_app_sstbias( surfdataqc(jtype), nn_2dint, & 563 & jnumsstbias, cn_sstbiasfiles(1:jnumsstbias) ) 455 564 456 565 END DO … … 507 616 & frld 508 617 #endif 618 #if defined key_hadocc 619 USE trc, ONLY : & ! HadOCC chlorophyll, fCO2 and pCO2 620 & HADOCC_CHL, & 621 & HADOCC_FCO2, & 622 & HADOCC_PCO2, & 623 & HADOCC_FILL_FLT 624 #elif defined key_medusa && defined key_foam_medusa 625 USE trc, ONLY : & ! MEDUSA chlorophyll, fCO2 and pCO2 626 & MEDUSA_CHL, & 627 & MEDUSA_FCO2, & 628 & MEDUSA_PCO2, & 629 & MEDUSA_FILL_FLT 630 #elif defined key_fabm 631 USE fabm 632 USE par_fabm 633 #endif 634 #if defined key_spm 635 USE par_spm, ONLY: & ! ERSEM/SPM sediments 636 & jp_spm 637 USE trc, ONLY : & 638 & trn 639 #endif 640 509 641 IMPLICIT NONE 510 642 … … 523 655 & zprofmask2 ! Mask associated with zprofvar2 524 656 REAL(wp), POINTER, DIMENSION(:,:) :: & 525 & zsurfvar ! Model values equivalent to surface ob. 657 & zsurfvar, & ! Model values equivalent to surface ob. 658 & zsurfmask ! Mask associated with surface variable 526 659 REAL(wp), POINTER, DIMENSION(:,:) :: & 527 660 & zglam1, & ! Model longitudes for prof variable 1 … … 540 673 CALL wrk_alloc( jpi, jpj, jpk, zprofmask2 ) 541 674 CALL wrk_alloc( jpi, jpj, zsurfvar ) 675 CALL wrk_alloc( jpi, jpj, zsurfmask ) 542 676 CALL wrk_alloc( jpi, jpj, zglam1 ) 543 677 CALL wrk_alloc( jpi, jpj, zglam2 ) … … 608 742 DO jtype = 1, nsurftypes 609 743 744 !Defaults which might be changed 745 zsurfmask(:,:) = tmask(:,:,1) 746 llnightav = .FALSE. 747 610 748 SELECT CASE ( TRIM(cobstypessurf(jtype)) ) 611 749 CASE('sst') … … 614 752 CASE('sla') 615 753 zsurfvar(:,:) = sshn(:,:) 616 llnightav = .FALSE. 754 CASE('sss') 755 zsurfvar(:,:) = tsn(:,:,1,jp_sal) 617 756 #if defined key_lim2 || defined key_lim3 618 757 CASE('sic') … … 630 769 zsurfvar(:,:) = 1._wp - frld(:,:) 631 770 ENDIF 632 771 #endif 772 CASE('logchl') 773 #if defined key_hadocc 774 zsurfvar(:,:) = HADOCC_CHL(:,:,1) ! (not log) chlorophyll from HadOCC 775 #elif defined key_medusa && defined key_foam_medusa 776 zsurfvar(:,:) = MEDUSA_CHL(:,:,1) ! (not log) chlorophyll from HadOCC 777 #elif defined key_fabm 778 chl_3d(:,:,:) = fabm_get_bulk_diagnostic_data(model, jp_fabmdia_chltot) 779 zsurfvar(:,:) = chl_3d(:,:,1) 780 #else 781 CALL ctl_stop( ' Trying to run logchl observation operator', & 782 & ' but no biogeochemical model appears to have been defined' ) 783 #endif 633 784 llnightav = .FALSE. 634 #endif 785 zsurfmask(:,:) = tmask(:,:,1) ! create a special mask to exclude certain things 786 ! Take the log10 where we can, otherwise exclude 787 tiny = 1.0e-20 788 WHERE(zsurfvar(:,:) > tiny .AND. zsurfvar(:,:) /= obfillflt ) 789 zsurfvar(:,:) = LOG10(zsurfvar(:,:)) 790 ELSEWHERE 791 zsurfvar(:,:) = obfillflt 792 zsurfmask(:,:) = 0 793 END WHERE 794 CASE('spm') 795 #if defined key_spm 796 zsurfvar(:,:) = 0.0 797 DO jn = 1, jp_spm 798 zsurfvar(:,:) = zsurfvar(:,:) + trn(:,:,1,jn) ! sum SPM sizes 799 END DO 800 #else 801 CALL ctl_stop( ' Trying to run spm observation operator', & 802 & ' but no spm model appears to have been defined' ) 803 #endif 804 CASE('fco2') 805 #if defined key_hadocc 806 zsurfvar(:,:) = HADOCC_FCO2(:,:) ! fCO2 from HadOCC 807 IF ( ( MINVAL( HADOCC_FCO2 ) == HADOCC_FILL_FLT ) .AND. & 808 & ( MAXVAL( HADOCC_FCO2 ) == HADOCC_FILL_FLT ) ) THEN 809 zsurfvar(:,:) = obfillflt 810 zsurfmask(:,:) = 0 811 CALL ctl_warn( ' HadOCC fCO2 values masked out for observation operator', & 812 & ' on timestep ' // TRIM(STR(kstp)), & 813 & ' as HADOCC_FCO2(:,:) == HADOCC_FILL_FLT' ) 814 ENDIF 815 #elif defined key_medusa && defined key_foam_medusa 816 zsurfmask(:,:) = MEDUSA_FCO2(:,:) ! fCO2 from MEDUSA 817 IF ( ( MINVAL( MEDUSA_FCO2 ) == MEDUSA_FILL_FLT ) .AND. & 818 & ( MAXVAL( MEDUSA_FCO2 ) == MEDUSA_FILL_FLT ) ) THEN 819 zsurfvar(:,:) = obfillflt 820 zsurfmask(:,:) = 0 821 CALL ctl_warn( ' MEDUSA fCO2 values masked out for observation operator', & 822 & ' on timestep ' // TRIM(STR(kstp)), & 823 & ' as MEDUSA_FCO2(:,:) == MEDUSA_FILL_FLT' ) 824 ENDIF 825 #elif defined key_fabm 826 ! First, get pCO2 from FABM 827 pco2_3d(:,:,:) = fabm_get_bulk_diagnostic_data(model, jp_fabm_o3pc) 828 zsurfvar(:,:) = pco2_3d(:,:,1) 829 ! Now, convert pCO2 to fCO2, based on SST in K. This follows the standard methodology of: 830 ! Pierrot et al. (2009), Recommendations for autonomous underway pCO2 measuring systems 831 ! and data reduction routines, Deep-Sea Research II, 56: 512-522. 832 ! and 833 ! Weiss (1974), Carbon dioxide in water and seawater: the solubility of a non-ideal gas, 834 ! Marine Chemistry, 2: 203-215. 835 ! In the implementation below, atmospheric pressure has been assumed to be 1 atm and so 836 ! not explicitly included - atmospheric pressure is not necessarily available so this is 837 ! the best assumption. 838 ! Further, the (1-xCO2)^2 term has been neglected. This is common practice 839 ! (see e.g. Zeebe and Wolf-Gladrow (2001), CO2 in Seawater: Equilibrium, Kinetics, Isotopes) 840 ! because xCO2 in atm is ~0, and so this term will only affect the result to the 3rd decimal 841 ! place for typical values, and xCO2 would need to be approximated from pCO2 anyway. 842 zsurfvar(:,:) = zsurfvar(:,:) * EXP((-1636.75 + & 843 & 12.0408 * (tsn(:,:,1,jp_tem)+rt0) - & 844 & 0.0327957 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + & 845 & 0.0000316528 * (tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0)*(tsn(:,:,1,jp_tem)+rt0) + & 846 & 2.0 * (57.7 - 0.118 * (tsn(:,:,1,jp_tem)+rt0))) / & 847 & (82.0578 * (tsn(:,:,1,jp_tem)+rt0))) 848 #else 849 CALL ctl_stop( ' Trying to run fco2 observation operator', & 850 & ' but no biogeochemical model appears to have been defined' ) 851 #endif 852 CASE('pco2') 853 #if defined key_hadocc 854 zsurfvar(:,:) = HADOCC_PCO2(:,:) ! pCO2 from HadOCC 855 IF ( ( MINVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ) .AND. & 856 & ( MAXVAL( HADOCC_PCO2 ) == HADOCC_FILL_FLT ) ) THEN 857 zsurfvar(:,:) = obfillflt 858 zsurfmask(:,:) = 0 859 CALL ctl_warn( ' HadOCC pCO2 values masked out for observation operator', & 860 & ' on timestep ' // TRIM(STR(kstp)), & 861 & ' as HADOCC_PCO2(:,:) == HADOCC_FILL_FLT' ) 862 ENDIF 863 #elif defined key_medusa && defined key_foam_medusa 864 zsurfvar(:,:) = MEDUSA_PCO2(:,:) ! pCO2 from MEDUSA 865 IF ( ( MINVAL( MEDUSA_PCO2 ) == MEDUSA_FILL_FLT ) .AND. & 866 & ( MAXVAL( MEDUSA_PCO2 ) == MEDUSA_FILL_FLT ) ) THEN 867 zsurfvar(:,:) = obfillflt 868 zsurfmask(:,:) = 0 869 CALL ctl_warn( ' MEDUSA pCO2 values masked out for observation operator', & 870 & ' on timestep ' // TRIM(STR(kstp)), & 871 & ' as MEDUSA_PCO2(:,:) == MEDUSA_FILL_FLT' ) 872 ENDIF 873 #elif defined key_fabm 874 pco2_3d(:,:,:) = fabm_get_bulk_diagnostic_data(model, jp_fabm_o3pc) 875 zsurfvar(:,:) = pco2_3d(:,:,1) 876 #else 877 CALL ctl_stop( ' Trying to run pCO2 observation operator', & 878 & ' but no biogeochemical model appears to have been defined' ) 879 #endif 880 635 881 END SELECT 636 882 637 883 CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj, & 638 & nit000, idaystp, zsurfvar, tmask(:,:,1),&884 & nit000, idaystp, zsurfvar, zsurfmask, & 639 885 & nn_2dint, llnightav ) 640 886 … … 648 894 CALL wrk_dealloc( jpi, jpj, jpk, zprofmask2 ) 649 895 CALL wrk_dealloc( jpi, jpj, zsurfvar ) 896 CALL wrk_dealloc( jpi, jpj, zsurfmask ) 650 897 CALL wrk_dealloc( jpi, jpj, zglam1 ) 651 898 CALL wrk_dealloc( jpi, jpj, zglam2 ) -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/find_obs_proc.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/greg2jul.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/grt_cir_dis.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/grt_cir_dis_saa.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/jul2greg.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/julian.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/linquad.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/maxdist.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/mpp_map.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_const.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_conv.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_conv_functions.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_fbm.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_grd_bruteforce.h90
r2358 r7773 325 325 CALL obs_mpp_max_integer( kobsj, kobs ) 326 326 ELSE 327 CALL obs_mpp_find_obs_proc( kproc, kobsi, kobsj,kobs )327 CALL obs_mpp_find_obs_proc( kproc,kobs ) 328 328 ENDIF 329 329 -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_grid.F90
- Property svn:keywords deleted
r5682 r7773 87 87 !!---------------------------------------------------------------------- 88 88 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 89 !! $Id $89 !! $Id: obs_grid.F90 5682 2015-08-12 15:46:45Z mattmartin $ 90 90 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 91 91 !!---------------------------------------------------------------------- … … 613 613 CALL obs_mpp_max_integer( kobsj, kobs ) 614 614 ELSE 615 CALL obs_mpp_find_obs_proc( kproc, kobs i, kobsj, kobs)615 CALL obs_mpp_find_obs_proc( kproc, kobs ) 616 616 ENDIF 617 617 -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_inter_h2d.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_inter_sup.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_inter_z1d.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_level_search.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_mpp.F90
- Property svn:keywords deleted
r5682 r7773 7 7 !! - ! 2006-05 (K. Mogensen) Reformatted 8 8 !! - ! 2008-01 (K. Mogensen) add mpp_global_max 9 !! 3.6 ! 2015-01 (J. Waters) obs_mpp_find_obs_proc 10 !! rewritten to avoid global arrays 9 11 !!---------------------------------------------------------------------- 10 12 # define mpivar mpi_double_precision … … 12 14 !! obs_mpp_bcast_integer : Broadcast an integer array from a processor to all processors 13 15 !! obs_mpp_max_integer : Find maximum on all processors of each value in an integer on all processors 14 !! obs_mpp_find_obs_proc : Find processors which should hold the observations 16 !! obs_mpp_find_obs_proc : Find processors which should hold the observations, avoiding global arrays 15 17 !! obs_mpp_sum_integers : Sum an integer array from all processors 16 18 !! obs_mpp_sum_integer : Sum an integer from all processors … … 37 39 !!---------------------------------------------------------------------- 38 40 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 39 !! $Id $41 !! $Id: obs_mpp.F90 5682 2015-08-12 15:46:45Z mattmartin $ 40 42 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 41 43 !!---------------------------------------------------------------------- … … 96 98 ! 97 99 INTEGER :: ierr 98 INTEGER, DIMENSION(kno) :: ivals 99 ! 100 INCLUDE 'mpif.h' 101 !!---------------------------------------------------------------------- 100 INTEGER, DIMENSION(:), ALLOCATABLE :: ivals 101 ! 102 INCLUDE 'mpif.h' 103 !!---------------------------------------------------------------------- 104 105 ALLOCATE( ivals(kno) ) 102 106 103 107 ! Call the MPI library to find the maximum across processors … … 105 109 & mpi_max, mpi_comm_opa, ierr ) 106 110 kvals(:) = ivals(:) 111 112 DEALLOCATE( ivals ) 107 113 #else 108 114 ! no MPI: empty routine … … 111 117 112 118 113 SUBROUTINE obs_mpp_find_obs_proc( kobsp, kobsi, kobsj,kno )114 !!---------------------------------------------------------------------- 115 !! *** ROUTINE obs_mpp_find_obs_proc ***116 !! 119 SUBROUTINE obs_mpp_find_obs_proc( kobsp,kno ) 120 !!---------------------------------------------------------------------- 121 !! *** ROUTINE obs_mpp_find_obs_proc *** 122 !! 117 123 !! ** Purpose : From the array kobsp containing the results of the 118 124 !! grid search on each processor the processor return a 119 125 !! decision of which processors should hold the observation. 120 126 !! 121 !! ** Method : A temporary 2D array holding all the decisions is122 !! constructed using mpi_allgather on each processor.123 !! If more than one processor has found the observation124 !! with the observation in the inner domain gets it125 !! 126 !! ** Action : This does only work for MPI. 127 !! ** Method : Synchronize the processor number for each obs using 128 !! obs_mpp_max_integer. If an observation exists on two 129 !! processors it will be allocated to the lower numbered 130 !! processor. 131 !! 132 !! ** Action : This does only work for MPI. 127 133 !! It does not work for SHMEM. 128 134 !! … … 130 136 !!---------------------------------------------------------------------- 131 137 INTEGER , INTENT(in ) :: kno 132 INTEGER, DIMENSION(kno), INTENT(in ) :: kobsi, kobsj133 138 INTEGER, DIMENSION(kno), INTENT(inout) :: kobsp 134 139 ! 135 140 #if defined key_mpp_mpi 136 141 ! 137 INTEGER :: ji 138 INTEGER :: jj 139 INTEGER :: size 140 INTEGER :: ierr 141 INTEGER :: iobsip 142 INTEGER :: iobsjp 143 INTEGER :: num_sus_obs 144 INTEGER, DIMENSION(kno) :: iobsig, iobsjg 145 INTEGER, ALLOCATABLE, DIMENSION(:,:) :: iobsp, iobsi, iobsj 146 !! 147 INCLUDE 'mpif.h' 148 !!---------------------------------------------------------------------- 149 150 !----------------------------------------------------------------------- 151 ! Call the MPI library to find the maximum accross processors 152 !----------------------------------------------------------------------- 153 CALL mpi_comm_size( mpi_comm_opa, size, ierr ) 154 !----------------------------------------------------------------------- 155 ! Convert local grids points to global grid points 156 !----------------------------------------------------------------------- 142 ! 143 INTEGER :: ji, isum 144 INTEGER, DIMENSION(:), ALLOCATABLE :: iobsp 145 !! 146 !! 147 148 ALLOCATE( iobsp(kno) ) 149 150 iobsp(:)=kobsp(:) 151 152 WHERE( iobsp(:) == -1 ) 153 iobsp(:) = 9999999 154 END WHERE 155 156 iobsp(:)=-1*iobsp(:) 157 158 CALL obs_mpp_max_integer( iobsp, kno ) 159 160 kobsp(:)=-1*iobsp(:) 161 162 isum=0 157 163 DO ji = 1, kno 158 IF ( ( kobsi(ji) >= 1 ) .AND. ( kobsi(ji) <= jpi ) .AND. & 159 & ( kobsj(ji) >= 1 ) .AND. ( kobsj(ji) <= jpj ) ) THEN 160 iobsig(ji) = mig( kobsi(ji) ) 161 iobsjg(ji) = mjg( kobsj(ji) ) 162 ELSE 163 iobsig(ji) = -1 164 iobsjg(ji) = -1 164 IF ( kobsp(ji) == 9999999 ) THEN 165 isum=isum+1 166 kobsp(ji)=-1 165 167 ENDIF 166 END DO 167 !----------------------------------------------------------------------- 168 ! Get the decisions from all processors 169 !----------------------------------------------------------------------- 170 ALLOCATE( iobsp(kno,size) ) 171 ALLOCATE( iobsi(kno,size) ) 172 ALLOCATE( iobsj(kno,size) ) 173 CALL mpi_allgather( kobsp, kno, mpi_integer, & 174 & iobsp, kno, mpi_integer, & 175 & mpi_comm_opa, ierr ) 176 CALL mpi_allgather( iobsig, kno, mpi_integer, & 177 & iobsi, kno, mpi_integer, & 178 & mpi_comm_opa, ierr ) 179 CALL mpi_allgather( iobsjg, kno, mpi_integer, & 180 & iobsj, kno, mpi_integer, & 181 & mpi_comm_opa, ierr ) 182 183 !----------------------------------------------------------------------- 184 ! Find the processor with observations from the lowest processor 185 ! number among processors holding the observation. 186 !----------------------------------------------------------------------- 187 kobsp(:) = -1 188 num_sus_obs = 0 189 DO ji = 1, kno 190 DO jj = 1, size 191 IF ( ( kobsp(ji) == -1 ) .AND. ( iobsp(ji,jj) /= -1 ) ) THEN 192 kobsp(ji) = iobsp(ji,jj) 193 iobsip = iobsi(ji,jj) 194 iobsjp = iobsj(ji,jj) 195 ENDIF 196 IF ( ( kobsp(ji) /= -1 ) .AND. ( iobsp(ji,jj) /= -1 ) ) THEN 197 IF ( ( iobsip /= iobsi(ji,jj) ) .OR. & 198 & ( iobsjp /= iobsj(ji,jj) ) ) THEN 199 IF ( ( kobsp(ji) < 1000000 ) .AND. & 200 & ( iobsp(ji,jj) < 1000000 ) ) THEN 201 num_sus_obs=num_sus_obs+1 202 ENDIF 203 ENDIF 204 IF ( mppmap(iobsip,iobsjp) /= ( kobsp(ji)+1 ) ) THEN 205 IF ( ( iobsi(ji,jj) /= -1 ) .AND. & 206 & ( iobsj(ji,jj) /= -1 ) ) THEN 207 IF ((mppmap(iobsi(ji,jj),iobsj(ji,jj)) == (iobsp(ji,jj)+1))& 208 & .OR. ( iobsp(ji,jj) < kobsp(ji) ) ) THEN 209 kobsp(ji) = iobsp(ji,jj) 210 iobsip = iobsi(ji,jj) 211 iobsjp = iobsj(ji,jj) 212 ENDIF 213 ENDIF 214 ENDIF 215 ENDIF 216 END DO 217 END DO 218 IF (lwp) WRITE(numout,*) 'Number of suspicious observations: ',num_sus_obs 219 220 DEALLOCATE( iobsj ) 221 DEALLOCATE( iobsi ) 168 ENDDO 169 170 171 IF ( isum > 0 ) THEN 172 IF (lwp) WRITE(numout,*) isum, ' observations failed the grid search.' 173 IF (lwp) WRITE(numout,*)'If ln_grid_search_lookup=.TRUE., try reducing grid_search_res' 174 ENDIF 175 222 176 DEALLOCATE( iobsp ) 177 223 178 #else 224 179 ! no MPI: empty routine 225 #endif 226 !180 #endif 181 227 182 END SUBROUTINE obs_mpp_find_obs_proc 228 183 -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_oper.F90
- Property svn:keywords deleted
r5704 r7773 49 49 !!---------------------------------------------------------------------- 50 50 51 !! * Substitutions 52 # include "domzgr_substitute.h90" 51 53 CONTAINS 52 54 53 55 SUBROUTINE obs_prof_opt( prodatqc, kt, kpi, kpj, kpk, & 54 56 & kit000, kdaystp, & 55 & pvar1, pvar2, pgdept, pmask1, pmask2, & 57 & pvar1, pvar2, pgdept, pgdepw, 58 & pmask1, pmask2, & 56 59 & plam1, plam2, pphi1, pphi2, & 57 60 & k1dint, k2dint, kdailyavtypes ) … … 104 107 !! ! 07-03 (K. Mogensen) General handling of profiles 105 108 !! ! 15-02 (M. Martin) Combined routine for all profile types 109 !! ! 17-02 (M. Martin) Include generalised vertical coordinate changes 106 110 !!----------------------------------------------------------------------- 107 111 … … 133 137 & pphi1, & ! Model latitudes for variable 1 134 138 & pphi2 ! Model latitudes for variable 2 135 REAL(KIND=wp), INTENT(IN), DIMENSION(kpk) :: & 136 & pgdept ! Model array of depth levels 139 REAL(KIND=wp), INTENT(IN), DIMENSION(kpi,kpj,kpk) :: & 140 & pgdept, & ! Model array of depth T levels 141 & pgdepw ! Model array of depth W levels 137 142 INTEGER, DIMENSION(imaxavtypes), OPTIONAL :: & 138 143 & kdailyavtypes ! Types for daily averages … … 164 169 & zobsk, & 165 170 & zobs2k 166 REAL(KIND=wp), DIMENSION(2,2, kpk) :: &171 REAL(KIND=wp), DIMENSION(2,2,1) :: & 167 172 & zweig1, & 168 & zweig2 173 & zweig2, & 174 & zweig 169 175 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: & 170 176 & zmask1, & 171 177 & zmask2, & 172 & zint1, & 173 & zint2, & 174 & zinm1, & 175 & zinm2 178 & zint1, & 179 & zint2, & 180 & zinm1, & 181 & zinm2, & 182 & zgdept, & 183 & zgdepw 176 184 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: & 177 185 & zglam1, & … … 179 187 & zgphi1, & 180 188 & zgphi2 189 REAL(KIND=wp), DIMENSION(1) :: zmsk_1, zmsk_2 190 REAL(KIND=wp), DIMENSION(:,:,:), ALLOCATABLE :: interp_corner 191 181 192 LOGICAL :: ld_dailyav 182 193 … … 259 270 & zmask1(2,2,kpk,ipro), & 260 271 & zmask2(2,2,kpk,ipro), & 261 & zint1(2,2,kpk,ipro), & 262 & zint2(2,2,kpk,ipro) & 272 & zint1(2,2,kpk,ipro), & 273 & zint2(2,2,kpk,ipro), & 274 & zgdept(2,2,kpk,ipro), & 275 & zgdepw(2,2,kpk,ipro) & 263 276 & ) 264 277 … … 283 296 END DO 284 297 298 ! Initialise depth arrays 299 zgdept(:,:,:,:) = 0.0 300 zgdepw(:,:,:,:) = 0.0 301 285 302 CALL obs_int_comm_2d( 2, 2, ipro, kpi, kpj, igrdi1, igrdj1, plam1, zglam1 ) 286 303 CALL obs_int_comm_2d( 2, 2, ipro, kpi, kpj, igrdi1, igrdj1, pphi1, zgphi1 ) … … 293 310 CALL obs_int_comm_3d( 2, 2, ipro, kpi, kpj, kpk, igrdi2, igrdj2, pvar2, zint2 ) 294 311 312 CALL obs_int_comm_3d( 2, 2, ipro, kpi, kpj, kpk, igrdi1, igrdj1, pgdept, zgdept ) 313 CALL obs_int_comm_3d( 2, 2, ipro, kpi, kpj, kpk, igrdi1, igrdj1, pgdepw, zgdepw ) 314 295 315 ! At the end of the day also get interpolated means 296 316 IF ( ld_dailyav .AND. idayend == 0 ) THEN … … 307 327 308 328 ENDIF 329 330 ! Return if no observations to process 331 ! Has to be done after comm commands to ensure processors 332 ! stay in sync 333 IF ( ipro == 0 ) RETURN 309 334 310 335 DO jobs = prodatqc%nprofup + 1, prodatqc%nprofup + ipro … … 332 357 zphi = prodatqc%rphi(jobs) 333 358 334 ! Horizontal weights and vertical mask335 359 ! Horizontal weights 360 ! Masked values are calculated later. 336 361 IF ( prodatqc%npvend(jobs,1) > 0 ) THEN 337 362 338 CALL obs_int_h2d_init( kpk, kpk, k2dint, zlam, zphi, &363 CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi, & 339 364 & zglam1(:,:,iobs), zgphi1(:,:,iobs), & 340 & zmask1(:,:, :,iobs), zweig1, zobsmask1 )365 & zmask1(:,:,1,iobs), zweig1, zmsk_1 ) 341 366 342 367 ENDIF … … 344 369 IF ( prodatqc%npvend(jobs,2) > 0 ) THEN 345 370 346 CALL obs_int_h2d_init( kpk, kpk, k2dint, zlam, zphi, &371 CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi, & 347 372 & zglam2(:,:,iobs), zgphi2(:,:,iobs), & 348 & zmask2(:,:, :,iobs), zweig2, zobsmask2 )373 & zmask2(:,:,1,iobs), zweig2, zmsk_2 ) 349 374 350 375 ENDIF … … 358 383 IF ( idayend == 0 ) THEN 359 384 ! Daily averaged data 360 CALL obs_int_h2d( kpk, kpk, & 361 & zweig1, zinm1(:,:,:,iobs), zobsk ) 362 363 ENDIF 364 365 ELSE 366 367 ! Point data 368 CALL obs_int_h2d( kpk, kpk, & 369 & zweig1, zint1(:,:,:,iobs), zobsk ) 370 371 ENDIF 372 373 !------------------------------------------------------------- 374 ! Compute vertical second-derivative of the interpolating 375 ! polynomial at obs points 376 !------------------------------------------------------------- 377 378 IF ( k1dint == 1 ) THEN 379 CALL obs_int_z1d_spl( kpk, zobsk, zobs2k, & 380 & pgdept, zobsmask1 ) 381 ENDIF 382 383 !----------------------------------------------------------------- 384 ! Vertical interpolation to the observation point 385 !----------------------------------------------------------------- 386 ista = prodatqc%npvsta(jobs,1) 387 iend = prodatqc%npvend(jobs,1) 388 CALL obs_int_z1d( kpk, & 389 & prodatqc%var(1)%mvk(ista:iend), & 390 & k1dint, iend - ista + 1, & 391 & prodatqc%var(1)%vdep(ista:iend), & 392 & zobsk, zobs2k, & 393 & prodatqc%var(1)%vmod(ista:iend), & 394 & pgdept, zobsmask1 ) 395 396 ENDIF 397 385 386 ! vertically interpolate all 4 corners 387 ista = prodatqc%npvsta(jobs,1) 388 iend = prodatqc%npvend(jobs,1) 389 inum_obs = iend - ista + 1 390 ALLOCATE(interp_corner(2,2,inum_obs),iv_indic(inum_obs)) 391 392 DO iin=1,2 393 DO ijn=1,2 394 395 IF ( k1dint == 1 ) THEN 396 CALL obs_int_z1d_spl( kpk, & 397 & zinm1(iin,ijn,:,iobs), & 398 & zobs2k, zgdept(iin,ijn,:,iobs), & 399 & zmask1(iin,ijn,:,iobs)) 400 ENDIF 401 402 CALL obs_level_search(kpk, & 403 & zgdept(iin,ijn,:,iobs), & 404 & inum_obs, prodatqc%var(1)%vdep(ista:iend), & 405 & iv_indic) 406 407 CALL obs_int_z1d(kpk, iv_indic, k1dint, inum_obs, & 408 & prodatqc%var(1)%vdep(ista:iend), & 409 & zinm1(iin,ijn,:,iobs), & 410 & zobs2k, interp_corner(iin,ijn,:), & 411 & zgdept(iin,ijn,:,iobs), & 412 & zmask1(iin,ijn,:,iobs)) 413 414 ENDDO 415 ENDDO 416 417 ENDIF !idayend 418 419 ELSE 420 421 ! Point data 422 423 ! vertically interpolate all 4 corners 424 ista = prodatqc%npvsta(jobs,1) 425 iend = prodatqc%npvend(jobs,1) 426 inum_obs = iend - ista + 1 427 ALLOCATE(interp_corner(2,2,inum_obs), iv_indic(inum_obs)) 428 DO iin=1,2 429 DO ijn=1,2 430 431 IF ( k1dint == 1 ) THEN 432 CALL obs_int_z1d_spl( kpk, & 433 & zint1(iin,ijn,:,iobs),& 434 & zobs2k, zgdept(iin,ijn,:,iobs), & 435 & zmask1(iin,ijn,:,iobs)) 436 437 ENDIF 438 439 CALL obs_level_search(kpk, & 440 & zgdept(iin,ijn,:,iobs),& 441 & inum_obs, prodatqc%var(1)%vdep(ista:iend), & 442 & iv_indic) 443 444 CALL obs_int_z1d(kpk, iv_indic, k1dint, inum_obs, & 445 & prodatqc%var(1)%vdep(ista:iend), & 446 & zint1(iin,ijn,:,iobs), & 447 & zobs2k,interp_corner(iin,ijn,:), & 448 & zgdept(iin,ijn,:,iobs), & 449 & zmask1(iin,ijn,:,iobs) ) 450 451 ENDDO 452 ENDDO 453 454 ENDIF 455 456 !------------------------------------------------------------- 457 ! Compute the horizontal interpolation for every profile level 458 !------------------------------------------------------------- 459 460 DO ikn=1,inum_obs 461 iend=ista+ikn-1 462 463 zweig(:,:,1) = 0._wp 464 465 ! This code forces the horizontal weights to be 466 ! zero IF the observation is below the bottom of the 467 ! corners of the interpolation nodes, Or if it is in 468 ! the mask. This is important for observations near 469 ! steep bathymetry 470 DO iin=1,2 471 DO ijn=1,2 472 473 depth_loop1: DO ik=kpk,2,-1 474 IF(zmask1(iin,ijn,ik-1,iobs ) > 0.9 )THEN 475 476 zweig(iin,ijn,1) = & 477 & zweig1(iin,ijn,1) * & 478 & MAX( SIGN(1._wp,(zgdepw(iin,ijn,ik,iobs) ) & 479 & - prodatqc%var(1)%vdep(iend)),0._wp) 480 481 EXIT depth_loop1 482 483 ENDIF 484 485 ENDDO depth_loop1 486 487 ENDDO 488 ENDDO 489 490 CALL obs_int_h2d( 1, 1, zweig, interp_corner(:,:,ikn), & 491 & prodatqc%var(1)%vmod(iend:iend) ) 492 493 ! Set QC flag for any observations found below the bottom 494 ! needed as the check here is more strict than that in obs_prep 495 IF (sum(zweig) == 0.0_wp) prodatqc%var(1)%nvqc(iend:iend)=4 496 497 ENDDO 498 499 DEALLOCATE(interp_corner,iv_indic) 500 501 ENDIF 502 503 ! For the second variable 398 504 IF ( prodatqc%npvend(jobs,2) > 0 ) THEN 399 505 … … 403 509 404 510 IF ( idayend == 0 ) THEN 405 406 511 ! Daily averaged data 407 CALL obs_int_h2d( kpk, kpk, & 408 & zweig2, zinm2(:,:,:,iobs), zobsk ) 409 410 ENDIF 411 412 ELSE 413 414 ! Point data 415 CALL obs_int_h2d( kpk, kpk, & 416 & zweig2, zint2(:,:,:,iobs), zobsk ) 417 418 ENDIF 419 420 421 !------------------------------------------------------------- 422 ! Compute vertical second-derivative of the interpolating 423 ! polynomial at obs points 424 !------------------------------------------------------------- 425 426 IF ( k1dint == 1 ) THEN 427 CALL obs_int_z1d_spl( kpk, zobsk, zobs2k, & 428 & pgdept, zobsmask2 ) 429 ENDIF 430 431 !---------------------------------------------------------------- 432 ! Vertical interpolation to the observation point 433 !---------------------------------------------------------------- 434 ista = prodatqc%npvsta(jobs,2) 435 iend = prodatqc%npvend(jobs,2) 436 CALL obs_int_z1d( kpk, & 437 & prodatqc%var(2)%mvk(ista:iend),& 438 & k1dint, iend - ista + 1, & 439 & prodatqc%var(2)%vdep(ista:iend),& 440 & zobsk, zobs2k, & 441 & prodatqc%var(2)%vmod(ista:iend),& 442 & pgdept, zobsmask2 ) 443 444 ENDIF 445 446 END DO 512 513 ! vertically interpolate all 4 corners 514 ista = prodatqc%npvsta(jobs,2) 515 iend = prodatqc%npvend(jobs,2) 516 inum_obs = iend - ista + 1 517 ALLOCATE(interp_corner(2,2,inum_obs),iv_indic(inum_obs)) 518 519 DO iin=1,2 520 DO ijn=1,2 521 522 IF ( k1dint == 1 ) THEN 523 CALL obs_int_z1d_spl( kpk, & 524 & zinm2(iin,ijn,:,iobs), & 525 & zobs2k, zgdept(iin,ijn,:,iobs), & 526 & zmask2(iin,ijn,:,iobs)) 527 ENDIF 528 529 CALL obs_level_search(kpk, & 530 & zgdept(iin,ijn,:,iobs), & 531 & inum_obs, prodatqc%var(2)%vdep(ista:iend), & 532 & iv_indic) 533 534 CALL obs_int_z1d(kpk, iv_indic, k1dint, inum_obs, & 535 & prodatqc%var(2)%vdep(ista:iend), & 536 & zinm2(iin,ijn,:,iobs), & 537 & zobs2k, interp_corner(iin,ijn,:), & 538 & zgdept(iin,ijn,:,iobs), & 539 & zmask2(iin,ijn,:,iobs)) 540 541 ENDDO 542 ENDDO 543 544 ENDIF !idayend 545 546 ELSE 547 548 ! Point data 549 550 ! vertically interpolate all 4 corners 551 ista = prodatqc%npvsta(jobs,2) 552 iend = prodatqc%npvend(jobs,2) 553 inum_obs = iend - ista + 1 554 ALLOCATE(interp_corner(2,2,inum_obs), iv_indic(inum_obs)) 555 DO iin=1,2 556 DO ijn=1,2 557 558 IF ( k1dint == 1 ) THEN 559 CALL obs_int_z1d_spl( kpk, & 560 & zint2(iin,ijn,:,iobs),& 561 & zobs2k, zgdept(iin,ijn,:,iobs), & 562 & zmask2(iin,ijn,:,iobs)) 563 564 ENDIF 565 566 CALL obs_level_search(kpk, & 567 & zgdept(iin,ijn,:,iobs),& 568 & inum_obs, prodatqc%var(2)%vdep(ista:iend), & 569 & iv_indic) 570 571 CALL obs_int_z1d(kpk, iv_indic, k1dint, inum_obs, & 572 & prodatqc%var(2)%vdep(ista:iend), & 573 & zint2(iin,ijn,:,iobs), & 574 & zobs2k,interp_corner(iin,ijn,:), & 575 & zgdept(iin,ijn,:,iobs), & 576 & zmask2(iin,ijn,:,iobs) ) 577 578 ENDDO 579 ENDDO 580 581 ENDIF 582 583 !------------------------------------------------------------- 584 ! Compute the horizontal interpolation for every profile level 585 !------------------------------------------------------------- 586 587 DO ikn=1,inum_obs 588 iend=ista+ikn-1 589 590 zweig(:,:,1) = 0._wp 591 592 ! This code forces the horizontal weights to be 593 ! zero IF the observation is below the bottom of the 594 ! corners of the interpolation nodes, Or if it is in 595 ! the mask. This is important for observations near 596 ! steep bathymetry 597 DO iin=1,2 598 DO ijn=1,2 599 600 depth_loop2: DO ik=kpk,2,-1 601 IF(zmask2(iin,ijn,ik-1,iobs ) > 0.9 )THEN 602 603 zweig(iin,ijn,1) = & 604 & zweig2(iin,ijn,1) * & 605 & MAX( SIGN(1._wp,(zgdepw(iin,ijn,ik,iobs) ) & 606 & - prodatqc%var(2)%vdep(iend)),0._wp) 607 608 EXIT depth_loop2 609 610 ENDIF 611 612 ENDDO depth_loop2 613 614 ENDDO 615 ENDDO 616 617 CALL obs_int_h2d( 1, 1, zweig, interp_corner(:,:,ikn), & 618 & prodatqc%var(2)%vmod(iend:iend) ) 619 620 ! Set QC flag for any observations found below the bottom 621 ! needed as the check here is more strict than that in obs_prep 622 IF (sum(zweig) == 0.0_wp) prodatqc%var(2)%nvqc(iend:iend)=4 623 624 ENDDO 625 626 DEALLOCATE(interp_corner,iv_indic) 627 628 ENDIF 447 629 448 630 ! Deallocate the data for interpolation … … 459 641 & zmask2, & 460 642 & zint1, & 461 & zint2 & 643 & zint2, & 644 & zgdept, & 645 & zgdepw & 462 646 & ) 463 647 -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_prep.F90
- Property svn:keywords deleted
r5785 r7773 24 24 USE obs_inter_sup ! Interpolation support 25 25 USE obs_oper ! Observation operators 26 #if defined key_bdy 27 USE bdy_oce, ONLY : & ! Boundary information 28 idx_bdy, nb_bdy 29 #endif 26 30 USE lib_mpp, ONLY : & 27 31 & ctl_warn, ctl_stop … … 45 49 CONTAINS 46 50 47 SUBROUTINE obs_pre_surf( surfdata, surfdataqc, ld_nea )51 SUBROUTINE obs_pre_surf( surfdata, surfdataqc, ld_nea, ld_bound_reject ) 48 52 !!---------------------------------------------------------------------- 49 53 !! *** ROUTINE obs_pre_sla *** … … 72 76 !! * Arguments 73 77 TYPE(obs_surf), INTENT(INOUT) :: surfdata ! Full set of surface data 74 TYPE(obs_surf), INTENT(INOUT) :: surfdataqc ! Subset of surface data not failing screening 75 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 78 TYPE(obs_surf), INTENT(INOUT) :: surfdataqc ! Subset of surface data not failing screening 79 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 80 LOGICAL, INTENT(IN) :: ld_bound_reject ! Switch for rejecting obs near the boundary 76 81 !! * Local declarations 77 82 INTEGER :: iyea0 ! Initial date … … 87 92 INTEGER :: inlasobs ! - close to land 88 93 INTEGER :: igrdobs ! - fail the grid search 94 INTEGER :: ibdysobs ! - close to open boundary 89 95 ! Global counters for observations that 90 96 INTEGER :: iotdobsmpp ! - outside time domain … … 93 99 INTEGER :: inlasobsmpp ! - close to land 94 100 INTEGER :: igrdobsmpp ! - fail the grid search 101 INTEGER :: ibdysobsmpp ! - close to open boundary 95 102 LOGICAL, DIMENSION(:), ALLOCATABLE :: & 96 103 & llvalid ! SLA data selection … … 118 125 ilansobs = 0 119 126 inlasobs = 0 127 ibdysobs = 0 120 128 121 129 ! ----------------------------------------------------------------------- … … 151 159 & tmask(:,:,1), surfdata%nqc, & 152 160 & iosdsobs, ilansobs, & 153 & inlasobs, ld_nea ) 161 & inlasobs, ld_nea, & 162 & ibdysobs, ld_bound_reject ) 154 163 155 164 CALL obs_mpp_sum_integer( iosdsobs, iosdsobsmpp ) 156 165 CALL obs_mpp_sum_integer( ilansobs, ilansobsmpp ) 157 166 CALL obs_mpp_sum_integer( inlasobs, inlasobsmpp ) 167 CALL obs_mpp_sum_integer( ibdysobs, ibdysobsmpp ) 158 168 159 169 ! ----------------------------------------------------------------------- … … 201 211 & inlasobsmpp 202 212 ENDIF 213 WRITE(numout,*) ' Remaining '//surfdataqc%cvars(1)//' data near open boundary (removed) = ', & 214 & ibdysobsmpp 203 215 WRITE(numout,*) ' '//surfdataqc%cvars(1)//' data accepted = ', & 204 216 & surfdataqc%nsurfmpp … … 236 248 & kpi, kpj, kpk, & 237 249 & zmask1, pglam1, pgphi1, zmask2, pglam2, pgphi2, & 238 & ld_nea, kdailyavtypes )250 & ld_nea, ld_bound_reject, kdailyavtypes ) 239 251 240 252 !!---------------------------------------------------------------------- … … 265 277 LOGICAL, INTENT(IN) :: ld_var2 266 278 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 279 LOGICAL, INTENT(IN) :: ld_bound_reject ! Switch for rejecting observations near the boundary 267 280 INTEGER, INTENT(IN) :: kpi, kpj, kpk ! Local domain sizes 268 281 INTEGER, DIMENSION(imaxavtypes), OPTIONAL :: & … … 292 305 INTEGER :: inlav1obs ! - close to land (variable 1) 293 306 INTEGER :: inlav2obs ! - close to land (variable 2) 307 INTEGER :: ibdyv1obs ! - boundary (variable 1) 308 INTEGER :: ibdyv2obs ! - boundary (variable 2) 294 309 INTEGER :: igrdobs ! - fail the grid search 295 310 INTEGER :: iuvchku ! - reject u if v rejected and vice versa … … 303 318 INTEGER :: inlav1obsmpp ! - close to land (variable 1) 304 319 INTEGER :: inlav2obsmpp ! - close to land (variable 2) 320 INTEGER :: ibdyv1obsmpp ! - boundary (variable 1) 321 INTEGER :: ibdyv2obsmpp ! - boundary (variable 2) 305 322 INTEGER :: igrdobsmpp ! - fail the grid search 306 323 INTEGER :: iuvchkumpp ! - reject var1 if var2 rejected and vice versa … … 328 345 ! Diagnotics counters for various failures. 329 346 330 iotdobs = 0331 igrdobs = 0347 iotdobs = 0 348 igrdobs = 0 332 349 iosdv1obs = 0 333 350 iosdv2obs = 0 … … 336 353 inlav1obs = 0 337 354 inlav2obs = 0 338 iuvchku = 0 339 iuvchkv = 0 355 ibdyv1obs = 0 356 ibdyv2obs = 0 357 iuvchku = 0 358 iuvchkv = 0 340 359 341 360 ! ----------------------------------------------------------------------- … … 395 414 & gdept_1d, zmask1, & 396 415 & profdata%nqc, profdata%var(1)%nvqc, & 397 & iosdv1obs, ilanv1obs, & 398 & inlav1obs, ld_nea ) 416 & iosdv1obs, ilanv1obs, & 417 & inlav1obs, ld_nea, & 418 & ibdyv1obs, ld_bound_reject ) 399 419 400 420 CALL obs_mpp_sum_integer( iosdv1obs, iosdv1obsmpp ) 401 421 CALL obs_mpp_sum_integer( ilanv1obs, ilanv1obsmpp ) 402 422 CALL obs_mpp_sum_integer( inlav1obs, inlav1obsmpp ) 423 CALL obs_mpp_sum_integer( ibdyv1obs, ibdyv1obsmpp ) 403 424 404 425 ! Variable 2 … … 414 435 & gdept_1d, zmask2, & 415 436 & profdata%nqc, profdata%var(2)%nvqc, & 416 & iosdv2obs, ilanv2obs, & 417 & inlav2obs, ld_nea ) 437 & iosdv2obs, ilanv2obs, & 438 & inlav2obs, ld_nea, & 439 & ibdyv2obs, ld_bound_reject ) 418 440 419 441 CALL obs_mpp_sum_integer( iosdv2obs, iosdv2obsmpp ) 420 442 CALL obs_mpp_sum_integer( ilanv2obs, ilanv2obsmpp ) 421 443 CALL obs_mpp_sum_integer( inlav2obs, inlav2obsmpp ) 444 CALL obs_mpp_sum_integer( ibdyv2obs, ibdyv2obsmpp ) 422 445 423 446 ! ----------------------------------------------------------------------- … … 489 512 & iuvchku 490 513 ENDIF 514 WRITE(numout,*) ' Remaining '//prodatqc%cvars(1)//' data near open boundary (removed) = ',& 515 & ibdyv1obsmpp 491 516 WRITE(numout,*) ' '//prodatqc%cvars(1)//' data accepted = ', & 492 517 & prodatqc%nvprotmpp(1) … … 506 531 & iuvchkv 507 532 ENDIF 533 WRITE(numout,*) ' Remaining '//prodatqc%cvars(2)//' data near open boundary (removed) = ',& 534 & ibdyv2obsmpp 508 535 WRITE(numout,*) ' '//prodatqc%cvars(2)//' data accepted = ', & 509 536 & prodatqc%nvprotmpp(2) … … 875 902 & plam, pphi, pmask, & 876 903 & kobsqc, kosdobs, klanobs, & 877 & knlaobs,ld_nea ) 904 & knlaobs,ld_nea, & 905 & kbdyobs,ld_bound_reject ) 878 906 !!---------------------------------------------------------------------- 879 907 !! *** ROUTINE obs_coo_spc_2d *** … … 908 936 INTEGER, DIMENSION(kobsno), INTENT(INOUT) :: & 909 937 & kobsqc ! Observation quality control 910 INTEGER, INTENT(INOUT) :: kosdobs ! Observations outside space domain 911 INTEGER, INTENT(INOUT) :: klanobs ! Observations within a model land cell 912 INTEGER, INTENT(INOUT) :: knlaobs ! Observations near land 913 LOGICAL, INTENT(IN) :: ld_nea ! Flag observations near land 938 INTEGER, INTENT(INOUT) :: kosdobs ! Observations outside space domain 939 INTEGER, INTENT(INOUT) :: klanobs ! Observations within a model land cell 940 INTEGER, INTENT(INOUT) :: knlaobs ! Observations near land 941 INTEGER, INTENT(INOUT) :: kbdyobs ! Observations near boundary 942 LOGICAL, INTENT(IN) :: ld_nea ! Flag observations near land 943 LOGICAL, INTENT(IN) :: ld_bound_reject ! Flag observations near open boundary 914 944 !! * Local declarations 915 945 REAL(KIND=wp), DIMENSION(2,2,kobsno) :: & 916 946 & zgmsk ! Grid mask 947 #if defined key_bdy 948 REAL(KIND=wp), DIMENSION(2,2,kobsno) :: & 949 & zbmsk ! Boundary mask 950 REAL(KIND=wp), DIMENSION(jpi,jpj) :: zbdymask 951 #endif 917 952 REAL(KIND=wp), DIMENSION(2,2,kobsno) :: & 918 953 & zglam, & ! Model longitude at grid points … … 956 991 957 992 END DO 993 994 #if defined key_bdy 995 ! Create a mask grid points in boundary rim 996 IF (ld_bound_reject) THEN 997 zbdymask(:,:) = 1.0_wp 998 DO ji = 1, nb_bdy 999 DO jj = 1, idx_bdy(ji)%nblen(1) 1000 zbdymask(idx_bdy(ji)%nbi(jj,1),idx_bdy(ji)%nbj(jj,1)) = 0.0_wp 1001 ENDDO 1002 ENDDO 1003 1004 CALL obs_int_comm_2d( 2, 2, kobsno, igrdi, igrdj, zbdymask, zbmsk ) 1005 ENDIF 1006 #endif 958 1007 959 1008 CALL obs_int_comm_2d( 2, 2, kobsno, kpi, kpj, igrdi, igrdj, pmask, zgmsk ) … … 1000 1049 END DO 1001 1050 END DO 1002 1003 ! For observations on the grid reject them if their are at 1004 ! a masked point 1005 1051 1006 1052 IF (lgridobs) THEN 1007 1053 IF (zgmsk(iig,ijg,jobs) == 0.0_wp ) THEN … … 1011 1057 ENDIF 1012 1058 ENDIF 1013 1059 1060 1014 1061 ! Flag if the observation falls is close to land 1015 1062 IF ( MINVAL( zgmsk(1:2,1:2,jobs) ) == 0.0_wp) THEN 1016 IF (ld_nea) kobsqc(jobs) = kobsqc(jobs) + 141017 1063 knlaobs = knlaobs + 1 1018 CYCLE 1019 ENDIF 1064 IF (ld_nea) THEN 1065 kobsqc(jobs) = kobsqc(jobs) + 14 1066 CYCLE 1067 ENDIF 1068 ENDIF 1069 1070 #if defined key_bdy 1071 ! Flag if the observation falls close to the boundary rim 1072 IF (ld_bound_reject) THEN 1073 IF ( MINVAL( zbmsk(1:2,1:2,jobs) ) == 0.0_wp ) THEN 1074 kobsqc(jobs) = kobsqc(jobs) + 15 1075 kbdyobs = kbdyobs + 1 1076 CYCLE 1077 ENDIF 1078 ! for observations on the grid... 1079 IF (lgridobs) THEN 1080 IF (zbmsk(iig,ijg,jobs) == 0.0_wp ) THEN 1081 kobsqc(jobs) = kobsqc(jobs) + 15 1082 kbdyobs = kbdyobs + 1 1083 CYCLE 1084 ENDIF 1085 ENDIF 1086 ENDIF 1087 #endif 1020 1088 1021 1089 END DO … … 1029 1097 & plam, pphi, pdep, pmask, & 1030 1098 & kpobsqc, kobsqc, kosdobs, & 1031 & klanobs, knlaobs, ld_nea ) 1099 & klanobs, knlaobs, ld_nea, & 1100 & kbdyobs, ld_bound_reject ) 1032 1101 !!---------------------------------------------------------------------- 1033 1102 !! *** ROUTINE obs_coo_spc_3d *** … … 1052 1121 !! * Modules used 1053 1122 USE dom_oce, ONLY : & ! Geographical information 1054 & gdepw_1d 1123 & gdepw_1d, & 1124 & gdepw_0, & 1125 #if defined key_vvl 1126 & gdepw_n, & 1127 & gdept_n, & 1128 #endif 1129 & ln_zco, & 1130 & ln_zps, & 1131 & lk_vvl 1055 1132 1056 1133 !! * Arguments … … 1086 1163 INTEGER, INTENT(INOUT) :: klanobs ! Observations within a model land cell 1087 1164 INTEGER, INTENT(INOUT) :: knlaobs ! Observations near land 1165 INTEGER, INTENT(INOUT) :: kbdyobs ! Observations near boundary 1088 1166 LOGICAL, INTENT(IN) :: ld_nea ! Flag observations near land 1167 LOGICAL, INTENT(IN) :: ld_bound_reject ! Flag observations near open boundary 1089 1168 !! * Local declarations 1090 1169 REAL(KIND=wp), DIMENSION(2,2,kpk,kprofno) :: & 1091 1170 & zgmsk ! Grid mask 1171 #if defined key_bdy 1172 REAL(KIND=wp), DIMENSION(2,2,kprofno) :: & 1173 & zbmsk ! Boundary mask 1174 REAL(KIND=wp), DIMENSION(jpi,jpj) :: zbdymask 1175 #endif 1176 REAL(KIND=wp), DIMENSION(2,2,kpk,kprofno) :: & 1177 & zgdepw 1092 1178 REAL(KIND=wp), DIMENSION(2,2,kprofno) :: & 1093 1179 & zglam, & ! Model longitude at grid points … … 1097 1183 & igrdj 1098 1184 LOGICAL :: lgridobs ! Is observation on a model grid point. 1185 LOGICAL :: ll_next_to_land ! Is a profile next to land 1099 1186 INTEGER :: iig, ijg ! i,j of observation on model grid point. 1100 1187 INTEGER :: jobs, jobsp, jk, ji, jj … … 1131 1218 1132 1219 END DO 1220 1221 #if defined key_bdy 1222 ! Create a mask grid points in boundary rim 1223 IF (ld_bound_reject) THEN 1224 zbdymask(:,:) = 1.0_wp 1225 DO ji = 1, nb_bdy 1226 DO jj = 1, idx_bdy(ji)%nblen(1) 1227 zbdymask(idx_bdy(ji)%nbi(jj,1),idx_bdy(ji)%nbj(jj,1)) = 0.0_wp 1228 ENDDO 1229 ENDDO 1230 ENDIF 1231 1232 CALL obs_int_comm_2d( 2, 2, kprofno, igrdi, igrdj, zbdymask, zbmsk ) 1233 #endif 1133 1234 1134 1235 CALL obs_int_comm_3d( 2, 2, kprofno, kpi, kpj, kpk, igrdi, igrdj, pmask, zgmsk ) … … 1159 1260 END DO 1160 1261 1262 ! Check if next to land 1263 IF ( ANY( zgmsk(1:2,1:2,1,jobs) == 0.0_wp ) ) THEN 1264 ll_next_to_land=.TRUE. 1265 ELSE 1266 ll_next_to_land=.FALSE. 1267 ENDIF 1268 1161 1269 ! Reject observations 1162 1270 … … 1175 1283 ENDIF 1176 1284 1177 ! Flag if the observation falls with a model land cell 1178 IF ( SUM( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) & 1179 & == 0.0_wp ) THEN 1180 kobsqc(jobsp) = kobsqc(jobsp) + 12 1181 klanobs = klanobs + 1 1182 CYCLE 1285 ! To check if an observations falls within land there are two cases: 1286 ! 1: z-coordibnates, where the check uses the mask 1287 ! 2: terrain following (eg s-coordinates), 1288 ! where we use the depth of the bottom cell to mask observations 1289 1290 IF( (.NOT. lk_vvl) .AND. ( ln_zps .OR. ln_zco ) ) THEN !(CASE 1) 1291 1292 ! Flag if the observation falls with a model land cell 1293 IF ( SUM( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) & 1294 & == 0.0_wp ) THEN 1295 kobsqc(jobsp) = kobsqc(jobsp) + 12 1296 klanobs = klanobs + 1 1297 CYCLE 1298 ENDIF 1299 1300 ! Flag if the observation is close to land 1301 IF ( MINVAL( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) == & 1302 & 0.0_wp) THEN 1303 knlaobs = knlaobs + 1 1304 IF (ld_nea) THEN 1305 kobsqc(jobsp) = kobsqc(jobsp) + 14 1306 ENDIF 1307 ENDIF 1308 1309 ELSE ! Case 2 1310 ! Flag if the observation is deeper than the bathymetry 1311 ! Or if it is within the mask 1312 IF ( ANY( zgdepw(1:2,1:2,kpk,jobs) < pobsdep(jobsp) ) & 1313 & .OR. & 1314 & ( SUM( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) & 1315 & == 0.0_wp) ) THEN 1316 kobsqc(jobsp) = kobsqc(jobsp) + 12 1317 klanobs = klanobs + 1 1318 CYCLE 1319 ENDIF 1320 1321 ! Flag if the observation is close to land 1322 IF ( ll_next_to_land ) THEN 1323 knlaobs = knlaobs + 1 1324 IF (ld_nea) THEN 1325 kobsqc(jobsp) = kobsqc(jobsp) + 14 1326 ENDIF 1327 ENDIF 1328 1183 1329 ENDIF 1184 1330 … … 1194 1340 ENDIF 1195 1341 1196 ! Flag if the observation falls is close to land1197 IF ( MINVAL( zgmsk(1:2,1:2,kobsk(jobsp)-1:kobsk(jobsp),jobs) ) == &1198 & 0.0_wp) THEN1199 IF (ld_nea) kobsqc(jobsp) = kobsqc(jobsp) + 141200 knlaobs = knlaobs + 11201 ENDIF1202 1203 1342 ! Set observation depth equal to that of the first model depth 1204 1343 IF ( pobsdep(jobsp) <= pdep(1) ) THEN 1205 1344 pobsdep(jobsp) = pdep(1) 1206 1345 ENDIF 1346 1347 #if defined key_bdy 1348 ! Flag if the observation falls close to the boundary rim 1349 IF (ld_bound_reject) THEN 1350 IF ( MINVAL( zbmsk(1:2,1:2,jobs) ) == 0.0_wp ) THEN 1351 kobsqc(jobsp) = kobsqc(jobsp) + 15 1352 kbdyobs = kbdyobs + 1 1353 CYCLE 1354 ENDIF 1355 ! for observations on the grid... 1356 IF (lgridobs) THEN 1357 IF (zbmsk(iig,ijg,jobs) == 0.0_wp ) THEN 1358 kobsqc(jobsp) = kobsqc(jobsp) + 15 1359 kbdyobs = kbdyobs + 1 1360 CYCLE 1361 ENDIF 1362 ENDIF 1363 ENDIF 1364 #endif 1207 1365 1208 1366 END DO -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_profiles.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_profiles_def.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_altbias.F90
- Property svn:keywords deleted
r5704 r7773 44 44 !!---------------------------------------------------------------------- 45 45 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 46 !! $Id $46 !! $Id: obs_read_altbias.F90 5704 2015-08-21 13:00:38Z mattmartin $ 47 47 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 48 48 !!---------------------------------------------------------------------- … … 128 128 ! Get the Alt bias data 129 129 130 CALL iom_get( numaltbias, jpdom_ data, 'altbias', z_altbias(:,:), 1 )130 CALL iom_get( numaltbias, jpdom_autoglo, 'altbias', z_altbias(:,:), 1 ) 131 131 132 132 ! Close the file -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_prof.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_readmdt.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_rot_vel.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_sort.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_sstbias.F90
r7740 r7773 1 1 MODULE obs_sstbias 2 2 !!====================================================================== 3 !! *** MODULE obs_ readsstbias ***4 !! Observation diagnostics: Read the bias for S LAdata3 !! *** MODULE obs_sstbias *** 4 !! Observation diagnostics: Read the bias for SST data 5 5 !!====================================================================== 6 6 !!---------------------------------------------------------------------- 7 !! obs_ rea_sstbias : Driver for reading altimeterbias7 !! obs_app_sstbias : Driver for reading and applying the SST bias 8 8 !!---------------------------------------------------------------------- 9 9 !! * Modules used … … 22 22 USE dom_oce, ONLY : & ! Domain variables 23 23 & tmask, & 24 & tmask_i, &25 & e1t, &26 & e2t, &27 24 & gphit, & 28 25 & glamt 29 USE oce, ONLY : & ! Model variables30 & sshn31 26 USE obs_inter_h2d 32 27 USE obs_utils ! Various observation tools … … 37 32 PUBLIC obs_app_sstbias ! Read the altimeter bias 38 33 CONTAINS 39 SUBROUTINE obs_app_sstbias( ksstno,sstdata, k2dint, knumtypes, &34 SUBROUTINE obs_app_sstbias( sstdata, k2dint, knumtypes, & 40 35 cl_bias_files ) 41 36 !!--------------------------------------------------------------------- 42 37 !! 43 !! *** ROUTINE obs_ rea_sstbias ***38 !! *** ROUTINE obs_app_sstbias *** 44 39 !! 45 40 !! ** Purpose : Read SST bias data from files and apply correction to … … 59 54 USE iom 60 55 USE netcdf 56 61 57 !! * Arguments 62 INTEGER, INTENT(IN) :: ksstno ! Number of SST obs sets 63 TYPE(obs_surf), DIMENSION(ksstno), INTENT(INOUT) :: & 64 & sstdata ! SST data 58 TYPE(obs_surf), INTENT(INOUT) :: & 59 & sstdata ! SST data 65 60 INTEGER, INTENT(IN) :: k2dint 66 INTEGER, INTENT(IN) :: knumtypes !number of bias types to read in 61 INTEGER, INTENT(IN) :: & 62 & knumtypes ! Number of bias types to read in 67 63 CHARACTER(LEN=128), DIMENSION(knumtypes), INTENT(IN) :: & 68 cl_bias_files !List of files to read 64 & cl_bias_files ! List of files to read 65 69 66 !! * Local declarations 70 67 INTEGER :: jslano ! Data set loop variable … … 80 77 INTEGER :: i_var_id 81 78 INTEGER, DIMENSION(knumtypes) :: & 82 & ibiastypes 79 & ibiastypes ! Array of the bias types in each file 83 80 REAL(wp), DIMENSION(jpi,jpj,knumtypes) :: & 84 & z_sstbias 81 & z_sstbias ! Array to store the SST bias values 85 82 REAL(wp), DIMENSION(jpi,jpj) :: & 86 & z_sstbias_2d 83 & z_sstbias_2d ! Array to store the SST bias values 87 84 REAL(wp), DIMENSION(1) :: & 88 85 & zext, & … … 114 111 INTEGER :: iret 115 112 INTEGER :: inumtype 116 IF(lwp)WRITE(numout,*) 117 IF(lwp)WRITE(numout,*) 'obs_rea_sstbias : ' 118 IF(lwp)WRITE(numout,*) '----------------- ' 119 IF(lwp)WRITE(numout,*) 'Read SST bias ' 120 ! Open and read the files 121 z_sstbias(:,:,:)=0.0_wp 113 114 IF ( lwp ) THEN 115 WRITE(numout,*) 116 WRITE(numout,*) 'obs_app_sstbias : ' 117 WRITE(numout,*) '----------------- ' 118 WRITE(numout,*) 'Read SST bias ' 119 ENDIF 120 121 ! Open and read the SST bias files for each bias type 122 z_sstbias(:,:,:) = 0.0_wp 123 122 124 DO jtype = 1, knumtypes 123 125 124 126 numsstbias=0 125 IF(lwp)WRITE(numout,*) 'Opening ',cl_bias_files(jtype) 126 CALL iom_open( cl_bias_files(jtype), numsstbias, ldstop=.FALSE. ) 127 128 IF ( lwp ) WRITE(numout,*) 'Opening ',cl_bias_files(jtype) 129 CALL iom_open( cl_bias_files(jtype), numsstbias, ldstop=.FALSE. ) 130 127 131 IF (numsstbias .GT. 0) THEN 128 132 … … 137 141 iret=NF90_CLOSE(incfile) 138 142 139 IF ( iret /= 0 ) CALL ctl_stop( & 140 'obs_rea_sstbias : Cannot read bias type from file '// & 141 cl_bias_files(jtype) ) 143 IF ( iret /= 0 ) THEN 144 CALL ctl_stop( 'obs_app_sstbias : Cannot read bias type from file '// & 145 & TRIM( cl_bias_files(jtype) ) ) 146 ENDIF 147 142 148 ! Get the SST bias data 143 149 CALL iom_get( numsstbias, jpdom_data, 'tn', z_sstbias_2d(:,:), 1 ) 144 150 z_sstbias(:,:,jtype) = z_sstbias_2d(:,:) 145 151 ! Close the file 146 CALL iom_close(numsstbias) 152 CALL iom_close(numsstbias) 153 147 154 ELSE 148 155 CALL ctl_stop('obs_read_sstbias: File '// & 149 156 & TRIM( cl_bias_files(jtype) )//' Not found') 150 157 ENDIF 158 151 159 END DO 152 160 153 ! Interpolate the bias already on the model grid at the observation point 154 DO jslano = 1, ksstno 161 ! Interpolate the bias from the model grid to the observation points 162 ALLOCATE( & 163 & igrdi(2,2,sstdata%nsurf), & 164 & igrdj(2,2,sstdata%nsurf), & 165 & zglam(2,2,sstdata%nsurf), & 166 & zgphi(2,2,sstdata%nsurf), & 167 & zmask(2,2,sstdata%nsurf) ) 168 169 DO jobs = 1, sstdata%nsurf 170 igrdi(1,1,jobs) = sstdata%mi(jobs)-1 171 igrdj(1,1,jobs) = sstdata%mj(jobs)-1 172 igrdi(1,2,jobs) = sstdata%mi(jobs)-1 173 igrdj(1,2,jobs) = sstdata%mj(jobs) 174 igrdi(2,1,jobs) = sstdata%mi(jobs) 175 igrdj(2,1,jobs) = sstdata%mj(jobs)-1 176 igrdi(2,2,jobs) = sstdata%mi(jobs) 177 igrdj(2,2,jobs) = sstdata%mj(jobs) 178 END DO 179 180 CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, & 181 & igrdi, igrdj, glamt, zglam ) 182 CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, & 183 & igrdi, igrdj, gphit, zgphi ) 184 CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, & 185 & igrdi, igrdj, tmask(:,:,1), zmask ) 186 187 DO jtype = 1, knumtypes 188 189 !Find the number observations of type 190 !and alllocate tempory arrays 191 inumtype = COUNT( sstdata%ntyp(:) == ibiastypes(jtype) ) 192 155 193 ALLOCATE( & 156 & igrdi(2,2,sstdata(jslano)%nsurf), &157 & igrdj(2,2,sstdata(jslano)%nsurf), &158 & zglam(2,2,sstdata(jslano)%nsurf), &159 & zgphi(2,2,sstdata(jslano)%nsurf), &160 & zmask(2,2,sstdata(jslano)%nsurf) )161 162 DO jobs = 1, sstdata(jslano)%nsurf163 igrdi(1,1,jobs) = sstdata(jslano)%mi(jobs)-1164 igrdj(1,1,jobs) = sstdata(jslano)%mj(jobs)-1165 igrdi(1,2,jobs) = sstdata(jslano)%mi(jobs)-1166 igrdj(1,2,jobs) = sstdata(jslano)%mj(jobs)167 igrdi(2,1,jobs) = sstdata(jslano)%mi(jobs)168 igrdj(2,1,jobs) = sstdata(jslano)%mj(jobs)-1169 igrdi(2,2,jobs) = sstdata(jslano)%mi(jobs)170 igrdj(2,2,jobs) = sstdata(jslano)%mj(jobs)171 END DO172 CALL obs_int_comm_2d( 2, 2, sstdata(jslano)%nsurf, &173 & igrdi, igrdj, glamt, zglam )174 CALL obs_int_comm_2d( 2, 2, sstdata(jslano)%nsurf, &175 & igrdi, igrdj, gphit, zgphi )176 CALL obs_int_comm_2d( 2, 2, sstdata(jslano)%nsurf, &177 & igrdi, igrdj, tmask(:,:,1), zmask )178 DO jtype = 1, knumtypes179 180 !Find the number observations of type181 !and alllocate tempory arrays182 inumtype = COUNT( sstdata(jslano)%ntyp(:) == ibiastypes(jtype) )183 ALLOCATE( &184 194 & igrdi_tmp(2,2,inumtype), & 185 195 & igrdj_tmp(2,2,inumtype), & … … 188 198 & zmask_tmp(2,2,inumtype), & 189 199 & zbias( 2,2,inumtype ) ) 190 jt=1 191 DO jobs = 1, sstdata(jslano)%nsurf 192 IF ( sstdata(jslano)%ntyp(jobs) == ibiastypes(jtype) ) THEN 193 igrdi_tmp(:,:,jt) = igrdi(:,:,jobs) 194 igrdj_tmp(:,:,jt) = igrdj(:,:,jobs) 195 zglam_tmp(:,:,jt) = zglam(:,:,jobs) 196 zgphi_tmp(:,:,jt) = zgphi(:,:,jobs) 197 zgphi_tmp(:,:,jt) = zgphi(:,:,jobs) 198 zmask_tmp(:,:,jt) = zmask(:,:,jobs) 199 jt = jt +1 200 ENDIF 201 END DO 200 201 jt=1 202 DO jobs = 1, sstdata%nsurf 203 IF ( sstdata%ntyp(jobs) == ibiastypes(jtype) ) THEN 204 205 igrdi_tmp(:,:,jt) = igrdi(:,:,jobs) 206 igrdj_tmp(:,:,jt) = igrdj(:,:,jobs) 207 zglam_tmp(:,:,jt) = zglam(:,:,jobs) 208 zgphi_tmp(:,:,jt) = zgphi(:,:,jobs) 209 zgphi_tmp(:,:,jt) = zgphi(:,:,jobs) 210 zmask_tmp(:,:,jt) = zmask(:,:,jobs) 211 212 jt = jt +1 213 214 ENDIF 215 END DO 202 216 203 CALL obs_int_comm_2d( 2, 2, inumtype, & 204 & igrdi_tmp(:,:,:), igrdj_tmp(:,:,:), & 205 & z_sstbias(:,:,jtype), zbias(:,:,:) ) 206 jt=1 207 DO jobs = 1, sstdata(jslano)%nsurf 208 IF ( sstdata(jslano)%ntyp(jobs) == ibiastypes(jtype) ) THEN 209 zlam = sstdata(jslano)%rlam(jobs) 210 zphi = sstdata(jslano)%rphi(jobs) 211 iico = sstdata(jslano)%mi(jobs) 212 ijco = sstdata(jslano)%mj(jobs) 213 CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi, & 214 & zglam_tmp(:,:,jt), & 215 & zgphi_tmp(:,:,jt), & 216 & zmask_tmp(:,:,jt), zweig, zobsmask ) 217 CALL obs_int_h2d( 1, 1, & 218 & zweig, zbias(:,:,jt), zext ) 219 ! adjust sst with bias field 220 sstdata(jslano)%robs(jobs,1) = & 221 sstdata(jslano)%robs(jobs,1) - zext(1) 222 jt=jt+1 223 ENDIF 224 END DO 217 CALL obs_int_comm_2d( 2, 2, inumtype, & 218 & igrdi_tmp(:,:,:), igrdj_tmp(:,:,:), & 219 & z_sstbias(:,:,jtype), zbias(:,:,:) ) 220 221 jt=1 222 DO jobs = 1, sstdata%nsurf 223 IF ( sstdata%ntyp(jobs) == ibiastypes(jtype) ) THEN 224 225 zlam = sstdata%rlam(jobs) 226 zphi = sstdata%rphi(jobs) 227 iico = sstdata%mi(jobs) 228 ijco = sstdata%mj(jobs) 229 230 CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi, & 231 & zglam_tmp(:,:,jt), & 232 & zgphi_tmp(:,:,jt), & 233 & zmask_tmp(:,:,jt), zweig, zobsmask ) 234 235 CALL obs_int_h2d( 1, 1, zweig, zbias(:,:,jt), zext ) 236 237 ! adjust sst with bias field 238 sstdata%robs(jobs,1) = & 239 & sstdata%robs(jobs,1) - zext(1) 240 241 jt=jt+1 242 243 ENDIF 244 END DO 225 245 226 !Deallocate arrays 227 DEALLOCATE( & 228 & igrdi_tmp, & 229 & igrdj_tmp, & 230 & zglam_tmp, & 231 & zgphi_tmp, & 232 & zmask_tmp, & 233 & zbias ) 234 END DO 246 !Deallocate arrays 235 247 DEALLOCATE( & 236 & igrdi, & 237 & igrdj, & 238 & zglam, & 239 & zgphi, & 240 & zmask ) 241 END DO 248 & igrdi_tmp, & 249 & igrdj_tmp, & 250 & zglam_tmp, & 251 & zgphi_tmp, & 252 & zmask_tmp, & 253 & zbias ) 254 255 END DO !jtype 256 257 DEALLOCATE( & 258 & igrdi, & 259 & igrdj, & 260 & zglam, & 261 & zgphi, & 262 & zmask ) 263 242 264 IF(lwp) THEN 243 265 WRITE(numout,*) " " 244 266 WRITE(numout,*) "SST bias correction applied successfully" 245 267 WRITE(numout,*) "Obs types: ",ibiastypes(:), & 246 " Have all been bias corrected\n"268 " have all been bias corrected\n" 247 269 ENDIF 248 270 END SUBROUTINE obs_app_sstbias -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_surf_def.F90
- Property svn:keywords deleted
r5682 r7773 50 50 INTEGER :: npj 51 51 INTEGER :: nsurfup !: Observation counter used in obs_oper 52 INTEGER :: nrec !: Number of surface observation records in window 52 53 53 54 ! Arrays with size equal to the number of surface observations … … 56 57 & mi, & !: i-th grid coord. for interpolating to surface observation 57 58 & mj, & !: j-th grid coord. for interpolating to surface observation 59 & mt, & !: time record number for gridded data 58 60 & nsidx,& !: Surface observation number 59 61 & nsfil,& !: Surface observation number in file … … 93 95 & nsstpmpp !: Global number of surface observations per time step 94 96 97 ! Arrays with size equal to the number of observation records in the window 98 INTEGER, POINTER, DIMENSION(:) :: & 99 & mrecstp ! Time step of the records 100 95 101 ! Arrays used to store source indices when 96 102 ! compressing obs_surf derived types … … 101 107 & nsind !: Source indices of surface data in compressed data 102 108 109 ! Is this a gridded product? 110 111 LOGICAL :: lgrid 112 103 113 END TYPE obs_surf 104 114 105 115 !!---------------------------------------------------------------------- 106 116 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 107 !! $Id $117 !! $Id: obs_surf_def.F90 5682 2015-08-12 15:46:45Z mattmartin $ 108 118 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 109 119 !!---------------------------------------------------------------------- … … 160 170 & surf%mi(ksurf), & 161 171 & surf%mj(ksurf), & 172 & surf%mt(ksurf), & 162 173 & surf%nsidx(ksurf), & 163 174 & surf%nsfil(ksurf), & … … 176 187 & ) 177 188 189 surf%mt(:) = -1 190 178 191 179 192 ! Allocate arrays of number of surface data size * number of variables … … 190 203 & ) 191 204 205 surf%rext(:,:) = 0.0_wp 206 192 207 ! Allocate arrays of number of time step size 193 208 … … 217 232 218 233 surf%nsurfup = 0 234 235 ! Not gridded by default 236 237 surf%lgrid = .FALSE. 219 238 220 239 END SUBROUTINE obs_surf_alloc … … 242 261 & surf%mi, & 243 262 & surf%mj, & 263 & surf%mt, & 244 264 & surf%nsidx, & 245 265 & surf%nsfil, & … … 370 390 newsurf%mi(insurf) = surf%mi(ji) 371 391 newsurf%mj(insurf) = surf%mj(ji) 392 newsurf%mt(insurf) = surf%mt(ji) 372 393 newsurf%nsidx(insurf) = surf%nsidx(ji) 373 394 newsurf%nsfil(insurf) = surf%nsfil(ji) … … 414 435 newsurf%nstp = surf%nstp 415 436 newsurf%cvars(:) = surf%cvars(:) 437 438 ! Set gridded stuff 439 440 newsurf%mt(insurf) = surf%mt(ji) 416 441 417 442 ! Deallocate temporary data … … 454 479 oldsurf%mi(jj) = surf%mi(ji) 455 480 oldsurf%mj(jj) = surf%mj(ji) 481 oldsurf%mt(jj) = surf%mt(ji) 456 482 oldsurf%nsidx(jj) = surf%nsidx(ji) 457 483 oldsurf%nsfil(jj) = surf%nsfil(ji) -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_types.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_utils.F90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obs_write.F90
- Property svn:keywords deleted
r5704 r7773 8 8 !! obs_wri_prof : Write profile observations in feedback format 9 9 !! obs_wri_surf : Write surface observations in feedback format 10 !! obs_wri_stats : Print basic statistics on the data being written out10 !! obs_wri_stats : Print basic statistics on the data being written out 11 11 !!---------------------------------------------------------------------- 12 12 … … 48 48 !!---------------------------------------------------------------------- 49 49 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 50 !! $Id $50 !! $Id: obs_write.F90 5704 2015-08-21 13:00:38Z mattmartin $ 51 51 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 52 52 !!---------------------------------------------------------------------- … … 411 411 fbdata%caddlong(1,1) = 'Model interpolated ICE' 412 412 fbdata%caddunit(1,1) = 'Fraction' 413 fbdata%cgrid(1) = 'T' 414 DO ja = 1, iadd 415 fbdata%caddname(1+ja) = padd%cdname(ja) 416 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 417 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 418 END DO 419 420 CASE('SSS') 421 422 CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, & 423 & 1 + iadd, iext, .TRUE. ) 424 425 clfiletype = 'sssfb' 426 fbdata%cname(1) = surfdata%cvars(1) 427 fbdata%coblong(1) = 'Sea surface salinity' 428 fbdata%cobunit(1) = 'psu' 429 DO je = 1, iext 430 fbdata%cextname(je) = pext%cdname(je) 431 fbdata%cextlong(je) = pext%cdlong(je,1) 432 fbdata%cextunit(je) = pext%cdunit(je,1) 433 END DO 434 fbdata%caddlong(1,1) = 'Model interpolated SSS' 435 fbdata%caddunit(1,1) = 'psu' 436 fbdata%cgrid(1) = 'T' 437 DO ja = 1, iadd 438 fbdata%caddname(1+ja) = padd%cdname(ja) 439 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 440 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 441 END DO 442 443 CASE('LOGCHL') 444 445 CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, & 446 & 1 + iadd, iext, .TRUE. ) 447 448 clfiletype = 'logchlfb' 449 fbdata%cname(1) = surfdata%cvars(1) 450 fbdata%coblong(1) = 'logchl concentration' 451 fbdata%cobunit(1) = 'mg/m3' 452 DO je = 1, iext 453 fbdata%cextname(je) = pext%cdname(je) 454 fbdata%cextlong(je) = pext%cdlong(je,1) 455 fbdata%cextunit(je) = pext%cdunit(je,1) 456 END DO 457 fbdata%caddlong(1,1) = 'Model interpolated LOGCHL' 458 fbdata%caddunit(1,1) = 'mg/m3' 459 fbdata%cgrid(1) = 'T' 460 DO ja = 1, iadd 461 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 DO 465 466 CASE('SPM') 467 468 CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, & 469 & 1 + iadd, iext, .TRUE. ) 470 471 clfiletype = 'spmfb' 472 fbdata%cname(1) = surfdata%cvars(1) 473 fbdata%coblong(1) = 'spm' 474 fbdata%cobunit(1) = 'g/m3' 475 DO je = 1, iext 476 fbdata%cextname(je) = pext%cdname(je) 477 fbdata%cextlong(je) = pext%cdlong(je,1) 478 fbdata%cextunit(je) = pext%cdunit(je,1) 479 END DO 480 fbdata%caddlong(1,1) = 'Model interpolated spm' 481 fbdata%caddunit(1,1) = 'g/m3' 482 fbdata%cgrid(1) = 'T' 483 DO ja = 1, iadd 484 fbdata%caddname(1+ja) = padd%cdname(ja) 485 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 486 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 487 END DO 488 489 CASE('FCO2') 490 491 CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, & 492 & 1 + iadd, iext, .TRUE. ) 493 494 clfiletype = 'fco2fb' 495 fbdata%cname(1) = surfdata%cvars(1) 496 fbdata%coblong(1) = 'fco2' 497 fbdata%cobunit(1) = 'uatm' 498 DO je = 1, iext 499 fbdata%cextname(je) = pext%cdname(je) 500 fbdata%cextlong(je) = pext%cdlong(je,1) 501 fbdata%cextunit(je) = pext%cdunit(je,1) 502 END DO 503 fbdata%caddlong(1,1) = 'Model interpolated fco2' 504 fbdata%caddunit(1,1) = 'uatm' 505 fbdata%cgrid(1) = 'T' 506 DO ja = 1, iadd 507 fbdata%caddname(1+ja) = padd%cdname(ja) 508 fbdata%caddlong(1+ja,1) = padd%cdlong(ja,1) 509 fbdata%caddunit(1+ja,1) = padd%cdunit(ja,1) 510 END DO 511 512 CASE('PCO2') 513 514 CALL alloc_obfbdata( fbdata, 1, surfdata%nsurf, 1, & 515 & 1 + iadd, iext, .TRUE. ) 516 517 clfiletype = 'pco2fb' 518 fbdata%cname(1) = surfdata%cvars(1) 519 fbdata%coblong(1) = 'pco2' 520 fbdata%cobunit(1) = 'uatm' 521 DO je = 1, iext 522 fbdata%cextname(je) = pext%cdname(je) 523 fbdata%cextlong(je) = pext%cdlong(je,1) 524 fbdata%cextunit(je) = pext%cdunit(je,1) 525 END DO 526 fbdata%caddlong(1,1) = 'Model interpolated pco2' 527 fbdata%caddunit(1,1) = 'uatm' 413 528 fbdata%cgrid(1) = 'T' 414 529 DO ja = 1, iadd -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obsinter_h2d.h90
- Property svn:keywords deleted
r2474 r7773 1 1 !!---------------------------------------------------------------------- 2 2 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 3 !! $Id $3 !! $Id: obsinter_h2d.h90 2474 2010-12-16 15:32:33Z djlea $ 4 4 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 5 5 !!---------------------------------------------------------------------- … … 1240 1240 & zdum, & 1241 1241 & zaamax 1242 1242 1243 imax = -1 1243 1244 ! Main computation 1244 1245 pflt = 1.0_wp -
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/obsinter_z1d.h90
- Property svn:keywords deleted
-
branches/UKMO/dev_r5785_SSS_obsoper/NEMOGCM/NEMO/OPA_SRC/OBS/str_c_to_for.h90
- Property svn:keywords deleted
Note: See TracChangeset
for help on using the changeset viewer.