Changeset 12610
- Timestamp:
- 2020-03-26T11:57:02+01:00 (5 years ago)
- Location:
- branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM
- Files:
-
- 7 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM/CONFIG/SHARED/namelist_ref
r12140 r12610 1198 1198 ln_sla = .false. ! Logical switch for SLA observations 1199 1199 ln_sst = .false. ! Logical switch for SST observations 1200 ln_sic = .false. ! Logical switch for Sea Ice observations 1200 ln_sic = .false. ! Logical switch for Sea Ice Concentration observations 1201 ln_sit = .false. ! Logical switch for Sea Ice Thickness observations 1201 1202 ln_vel3d = .false. ! Logical switch for velocity observations 1202 1203 ln_sss = .false. ! Logical swithc for SSS observations … … 1240 1241 ln_sss_fp_indegs = .true. 1241 1242 ln_sic_fp_indegs = .true. 1243 ln_sit_fp_indegs = .true. 1242 1244 ! All of the *files* variables below are arrays. Use namelist_cfg to add more files 1243 1245 cn_profbfiles = 'profiles_01.nc' ! Profile feedback input observation file names … … 1245 1247 cn_sstfbfiles = 'sst_01.nc' ! SST feedback input observation file names 1246 1248 cn_sicfbfiles = 'sic_01.nc' ! SIC feedback input observation file names 1249 cn_sitfbfiles = 'sit_01.nc' ! SIT feedback input observation file names 1247 1250 cn_velfbfiles = 'vel_01.nc' ! Velocity feedback input observation file names 1248 1251 cn_sssfbfiles = 'sss_01.nc' ! SSS feedback input observation file names … … 1285 1288 rn_sic_avglamscl = 0. ! E/W diameter of SIC observation footprint (metres/degrees) 1286 1289 rn_sic_avgphiscl = 0. ! N/S diameter of SIC observation footprint (metres/degrees) 1290 rn_sit_avglamscl = 0. ! E/W diameter of SIT observation footprint (metres/degrees) 1291 rn_sit_avgphiscl = 0. ! N/S diameter of SIT observation footprint (metres/degrees) 1287 1292 nn_1dint = 0 ! Type of vertical interpolation method 1288 1293 nn_2dint_default = 0 ! Default horizontal interpolation method … … 1291 1296 nn_2dint_sss = -1 ! Horizontal interpolation method for SSS 1292 1297 nn_2dint_sic = -1 ! Horizontal interpolation method for SIC 1298 nn_2dint_sit = -1 ! Horizontal interpolation method for SIT 1293 1299 nn_msshc = 0 ! MSSH correction scheme 1294 1300 rn_mdtcorr = 1.61 ! MDT correction -
branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM/NEMO/OPA_SRC/ASM/asminc.F90
r9486 r12610 21 21 !! dyn_asm_inc : Apply the dynamic (u and v) increments 22 22 !! ssh_asm_inc : Apply the SSH increment 23 !! seaice_asm_inc : Apply the seaice increment 23 !! seaice_asm_inc : Apply the sea ice concentration increment 24 !! sit_asm_inc : Apply the sea ice thickness increment 24 25 !!---------------------------------------------------------------------- 25 26 USE wrk_nemo ! Memory Allocation … … 49 50 PUBLIC dyn_asm_inc !: Apply the dynamic (u and v) increments 50 51 PUBLIC ssh_asm_inc !: Apply the SSH increment 51 PUBLIC seaice_asm_inc !: Apply the seaice increment 52 PUBLIC seaice_asm_inc !: Apply the seaice concentration increment 53 PUBLIC sit_asm_inc !: Apply the seaice thickness increment 54 PUBLIC bgc_asm_inc !: Apply the biogeochemistry increments 52 55 53 56 #if defined key_asminc … … 57 60 #endif 58 61 LOGICAL, PUBLIC :: ln_bkgwri = .FALSE. !: No output of the background state fields 62 LOGICAL, PUBLIC :: ln_avgbkg = .FALSE. !: No output of the mean background state fields 59 63 LOGICAL, PUBLIC :: ln_asmiau = .FALSE. !: No applying forcing with an assimilation increment 60 64 LOGICAL, PUBLIC :: ln_asmdin = .FALSE. !: No direct initialization … … 62 66 LOGICAL, PUBLIC :: ln_dyninc = .FALSE. !: No dynamics (u and v) assimilation increments 63 67 LOGICAL, PUBLIC :: ln_sshinc = .FALSE. !: No sea surface height assimilation increment 64 LOGICAL, PUBLIC :: ln_seaiceinc !: No sea ice concentration increment 68 LOGICAL, PUBLIC :: ln_seaiceinc = .FALSE. !: No sea ice concentration increment 69 LOGICAL, PUBLIC :: ln_sitinc = .FALSE. !: No sea ice thickness increment 70 LOGICAL, PUBLIC :: lk_bgcinc = .FALSE. !: No biogeochemistry increments 65 71 LOGICAL, PUBLIC :: ln_salfix = .FALSE. !: Apply minimum salinity check 66 72 LOGICAL, PUBLIC :: ln_temnofreeze = .FALSE. !: Don't allow the temperature to drop below freezing … … 85 91 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ssh_bkg, ssh_bkginc ! Background sea surface height and its increment 86 92 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: seaice_bkginc ! Increment to the background sea ice conc 93 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sit_bkginc ! Increment to the background sea ice thickness 87 94 88 95 !! * Substitutions … … 127 134 REAL(wp), POINTER, DIMENSION(:,:) :: hdiv ! 2D workspace 128 135 !! 129 NAMELIST/nam_asminc/ ln_bkgwri, 136 NAMELIST/nam_asminc/ ln_bkgwri, ln_avgbkg, ln_balwri, & 130 137 & ln_trainc, ln_dyninc, ln_sshinc, & 131 138 & ln_asmdin, ln_asmiau, & … … 138 145 !----------------------------------------------------------------------- 139 146 ln_seaiceinc = .FALSE. 147 ln_sitinc = .FALSE. 140 148 ln_temnofreeze = .FALSE. 141 149 … … 154 162 WRITE(numout,*) 'asm_inc_init : Assimilation increment initialization :' 155 163 WRITE(numout,*) '~~~~~~~~~~~~' 156 WRITE(numout,*) ' Namelist nam asm: set assimilation increment parameters'164 WRITE(numout,*) ' Namelist nam_asminc : set assimilation increment parameters' 157 165 WRITE(numout,*) ' Logical switch for writing out background state ln_bkgwri = ', ln_bkgwri 166 WRITE(numout,*) ' Logical switch for writing mean background state ln_avgbkg = ', ln_avgbkg 167 WRITE(numout,*) ' Logical switch for writing out balancing increments ln_balwri = ', ln_balwri 158 168 WRITE(numout,*) ' Logical switch for applying tracer increments ln_trainc = ', ln_trainc 159 169 WRITE(numout,*) ' Logical switch for applying velocity increments ln_dyninc = ', ln_dyninc 160 170 WRITE(numout,*) ' Logical switch for applying SSH increments ln_sshinc = ', ln_sshinc 171 WRITE(numout,*) ' Logical switch for applying SIC increments ln_seaiceinc = ', ln_seaiceinc 172 WRITE(numout,*) ' Logical switch for applying SIT increments ln_sitinc = ', ln_sitinc 161 173 WRITE(numout,*) ' Logical switch for Direct Initialization (DI) ln_asmdin = ', ln_asmdin 162 WRITE(numout,*) ' Logical switch for applying sea ice increments ln_seaiceinc = ', ln_seaiceinc163 174 WRITE(numout,*) ' Logical switch for Incremental Analysis Updating (IAU) ln_asmiau = ', ln_asmiau 164 175 WRITE(numout,*) ' Timestep of background in [0,nitend-nit000-1] nitbkg = ', nitbkg … … 216 227 217 228 IF ( ( ( .NOT. ln_asmdin ).AND.( .NOT. ln_asmiau ) ) & 218 .AND.( ( ln_trainc ).OR.( ln_dyninc ).OR.( ln_sshinc ) .OR. ( ln_seaiceinc) )) & 219 & CALL ctl_stop( ' One or more of ln_trainc, ln_dyninc, ln_sshinc and ln_seaiceinc is set to .true.', & 229 & .AND.( ( ln_trainc ).OR.( ln_dyninc ).OR.( ln_sshinc ).OR.( ln_seaiceinc ).OR. & 230 & ( ln_sitinc ).OR.( lk_bgcinc ) )) & 231 & CALL ctl_stop( ' One or more of ln_trainc, ln_dyninc, ln_sshinc, ln_seaiceinc,', & 232 & ' ln_sitinc and ln_(bgc-variable)inc is set to .true.', & 220 233 & ' but ln_asmdin and ln_asmiau are both set to .false. :', & 221 234 & ' Inconsistent options') … … 226 239 227 240 IF ( ( .NOT. ln_trainc ).AND.( .NOT. ln_dyninc ).AND.( .NOT. ln_sshinc ).AND.( .NOT. ln_seaiceinc ) & 228 & ) & 229 & CALL ctl_warn( ' ln_trainc, ln_dyninc, ln_sshinc and ln_seaiceinc are set to .false. :', & 241 & .AND.( .NOT. ln_sitinc ).AND.( .NOT. lk_bgcinc ) ) & 242 & CALL ctl_warn( ' ln_trainc, ln_dyninc, ln_sshinc, ln_seaiceinc,', & 243 & ' ln_sitinc and ln_(bgc-variable)inc are set to .false. :', & 230 244 & ' The assimilation increments are not applied') 231 245 … … 325 339 !-------------------------------------------------------------------- 326 340 327 ALLOCATE( t_bkginc(jpi,jpj,jpk) ) 328 ALLOCATE( s_bkginc(jpi,jpj,jpk) ) 329 ALLOCATE( u_bkginc(jpi,jpj,jpk) ) 330 ALLOCATE( v_bkginc(jpi,jpj,jpk) ) 331 ALLOCATE( ssh_bkginc(jpi,jpj) ) 332 ALLOCATE( seaice_bkginc(jpi,jpj)) 341 IF ( ln_trainc ) THEN 342 ALLOCATE( t_bkginc(jpi,jpj,jpk) ) 343 ALLOCATE( s_bkginc(jpi,jpj,jpk) ) 344 t_bkginc(:,:,:) = 0.0 345 s_bkginc(:,:,:) = 0.0 346 ENDIF 347 IF ( ln_dyninc ) THEN 348 ALLOCATE( u_bkginc(jpi,jpj,jpk) ) 349 ALLOCATE( v_bkginc(jpi,jpj,jpk) ) 350 u_bkginc(:,:,:) = 0.0 351 v_bkginc(:,:,:) = 0.0 352 ENDIF 353 IF ( ln_sshinc ) THEN 354 ALLOCATE( ssh_bkginc(jpi,jpj) ) 355 ssh_bkginc(:,:) = 0.0 356 ENDIF 357 IF ( ln_seaiceinc ) THEN 358 ALLOCATE( seaice_bkginc(jpi,jpj)) 359 seaice_bkginc(:,:) = 0.0 360 ENDIF 361 IF ( ln_sitinc ) THEN 362 ALLOCATE( sit_bkginc(jpi,jpj)) 363 sit_bkginc(:,:) = 0.0 364 ENDIF 333 365 #if defined key_asminc 334 366 ALLOCATE( ssh_iau(jpi,jpj) ) 335 #endif336 t_bkginc(:,:,:) = 0.0337 s_bkginc(:,:,:) = 0.0338 u_bkginc(:,:,:) = 0.0339 v_bkginc(:,:,:) = 0.0340 ssh_bkginc(:,:) = 0.0341 seaice_bkginc(:,:) = 0.0342 #if defined key_asminc343 367 ssh_iau(:,:) = 0.0 344 368 #endif 345 IF ( ( ln_trainc ).OR.( ln_dyninc ).OR.( ln_sshinc ).OR.( ln_seaiceinc ) ) THEN 369 IF ( ( ln_trainc ).OR.( ln_dyninc ).OR.( ln_sshinc ).OR.( ln_seaiceinc ) & 370 & .OR.( ln_sitinc ).OR.( lk_bgcinc ) ) THEN 346 371 347 372 !-------------------------------------------------------------------- … … 406 431 ! to allow for differences in masks 407 432 WHERE( ABS( ssh_bkginc(:,:) ) > 1.0e+10 ) ssh_bkginc(:,:) = 0.0 433 ENDIF 434 435 IF ( ln_sitinc ) THEN 436 CALL iom_get( inum, jpdom_autoglo, 'bckinsit', sit_bkginc, 1 ) 437 ! Apply the masks 438 sit_bkginc(:,:) = sit_bkginc(:,:) * tmask(:,:,1) 439 ! Set missing increments to 0.0 rather than 1e+20 440 ! to allow for differences in masks 441 WHERE( ABS( sit_bkginc(:,:) ) > 1.0e+10 ) sit_bkginc(:,:) = 0.0 408 442 ENDIF 409 443 … … 766 800 ! Perhaps the following call should be in step 767 801 IF ( ln_seaiceinc ) CALL seaice_asm_inc ( kt ) ! apply sea ice concentration increment 802 IF ( ln_sitinc ) CALL sit_asm_inc ( kt ) ! apply sea ice thickness increment 768 803 ! 769 804 END SUBROUTINE tra_asm_inc … … 923 958 END SUBROUTINE ssh_asm_inc 924 959 960 SUBROUTINE sit_asm_inc( kt, kindic ) 961 !!---------------------------------------------------------------------- 962 !! *** ROUTINE sit_asm_inc *** 963 !! 964 !! ** Purpose : Apply the sea ice thickness assimilation increment. 965 !! 966 !! ** Method : Direct initialization or Incremental Analysis Updating. 967 !! 968 !! ** Action : 969 !! 970 !!---------------------------------------------------------------------- 971 IMPLICIT NONE 972 ! 973 INTEGER, INTENT(in) :: kt ! Current time step 974 INTEGER, INTENT(in), OPTIONAL :: kindic ! flag for disabling the deallocation 975 ! 976 INTEGER :: it 977 REAL(wp) :: zincwgt ! IAU weight for current time step 978 !!---------------------------------------------------------------------- 979 980 IF ( ln_asmiau ) THEN 981 982 !-------------------------------------------------------------------- 983 ! Incremental Analysis Updating 984 !-------------------------------------------------------------------- 985 986 IF ( ( kt >= nitiaustr_r ).AND.( kt <= nitiaufin_r ) ) THEN 987 988 it = kt - nit000 + 1 989 zincwgt = wgtiau(it) ! IAU weight for the current time step 990 ! note this is not a tendency so should not be divided by rdt (as with the tracer and other increments) 991 ! EF: Actually CICE is expecting a tendency so is divided by rdt below 992 993 IF(lwp) THEN 994 WRITE(numout,*) 995 WRITE(numout,*) 'sit_asm_inc : sea ice thick IAU at time step = ', & 996 & kt,' with IAU weight = ', wgtiau(it) 997 WRITE(numout,*) '~~~~~~~~~~~~' 998 ENDIF 999 1000 #if defined key_cice && defined key_asminc 1001 ! Sea-ice thickness : CICE case. Pass ice thickness increment tendency into CICE 1002 ndsit_da(:,:) = sit_bkginc(:,:) * zincwgt / rdt 1003 #endif 1004 1005 IF ( kt == nitiaufin_r ) THEN 1006 DEALLOCATE( sit_bkginc ) 1007 ENDIF 1008 1009 ELSE 1010 1011 #if defined key_cice && defined key_asminc 1012 ! Sea-ice thickness : CICE case. Zero ice increment tendency into CICE 1013 ndsit_da(:,:) = 0.0_wp 1014 #endif 1015 1016 ENDIF 1017 1018 ELSEIF ( ln_asmdin ) THEN 1019 1020 !-------------------------------------------------------------------- 1021 ! Direct Initialization 1022 !-------------------------------------------------------------------- 1023 1024 IF ( kt == nitdin_r ) THEN 1025 1026 neuler = 0 ! Force Euler forward step 1027 1028 #if defined key_cice && defined key_asminc 1029 ! Sea-ice thickness : CICE case. Pass ice thickness increment tendency into CICE 1030 ndsit_da(:,:) = sit_bkginc(:,:) / rdt 1031 #endif 1032 IF ( .NOT. PRESENT(kindic) ) THEN 1033 DEALLOCATE( sit_bkginc ) 1034 END IF 1035 1036 ELSE 1037 1038 #if defined key_cice && defined key_asminc 1039 ! Sea-ice thicnkness : CICE case. Zero ice thickness increment tendency into CICE 1040 ndsit_da(:,:) = 0.0_wp 1041 #endif 1042 1043 ENDIF 1044 1045 ENDIF 1046 1047 END SUBROUTINE sit_asm_inc 925 1048 926 1049 SUBROUTINE seaice_asm_inc( kt, kindic ) … … 928 1051 !! *** ROUTINE seaice_asm_inc *** 929 1052 !! 930 !! ** Purpose : Apply the sea ice assimilation increment.1053 !! ** Purpose : Apply the sea ice concentration assimilation increment. 931 1054 !! 932 1055 !! ** Method : Direct initialization or Incremental Analysis Updating. -
branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM/NEMO/OPA_SRC/OBS/diaobs.F90
r12140 r12610 22 22 USE obs_read_surf ! Reading and allocation of surface obs 23 23 USE obs_readmdt ! Reading and allocation of MDT for SLA. 24 USE obs_readsnowdepth ! Get model snow depth for conversion of freeboard to ice thickness 24 25 USE obs_prep ! Preparation of obs. (grid search etc). 25 26 USE obs_oper ! Observation operators … … 53 54 LOGICAL :: ln_sst_fp_indegs !: T=> SST obs footprint size specified in degrees, F=> in metres 54 55 LOGICAL :: ln_sss_fp_indegs !: T=> SSS obs footprint size specified in degrees, F=> in metres 55 LOGICAL :: ln_sic_fp_indegs !: T=> sea-ice obs footprint size specified in degrees, F=> in metres 56 LOGICAL :: ln_sic_fp_indegs !: T=> SIC obs footprint size specified in degrees, F=> in metres 57 LOGICAL :: ln_sit_fp_indegs !: T=> SIT obs footprint size specified in degrees, F=> in metres 56 58 LOGICAL :: ln_output_clim !: Logical switch for interpolating and writing T/S climatology 57 59 LOGICAL :: ln_time_mean_sla_bkg !: Logical switch for applying time mean of SLA background to remove tidal signal … … 65 67 REAL(wp) :: rn_sss_avglamscl !: E/W diameter of SSS observation footprint 66 68 REAL(wp) :: rn_sss_avgphiscl !: N/S diameter of SSS observation footprint 67 REAL(wp) :: rn_sic_avglamscl !: E/W diameter of sea-ice observation footprint 68 REAL(wp) :: rn_sic_avgphiscl !: N/S diameter of sea-ice observation footprint 69 REAL(wp) :: rn_sic_avglamscl !: E/W diameter of SIC observation footprint 70 REAL(wp) :: rn_sic_avgphiscl !: N/S diameter of SIC observation footprint 71 REAL(wp) :: rn_sit_avglamscl !: E/W diameter of SIT observation footprint 72 REAL(wp) :: rn_sit_avgphiscl !: N/S diameter of SIT observation footprint 69 73 REAL(wp), PUBLIC :: & 70 74 & MeanPeriodHours = 24. + (5./6.) !: Meaning period for surface data. … … 76 80 INTEGER :: nn_2dint_sst !: SST horizontal interpolation method (-1 = default) 77 81 INTEGER :: nn_2dint_sss !: SSS horizontal interpolation method (-1 = default) 78 INTEGER :: nn_2dint_sic !: Seaice horizontal interpolation method (-1 = default) 82 INTEGER :: nn_2dint_sic !: SIC horizontal interpolation method (-1 = default) 83 INTEGER :: nn_2dint_sit !: SIT horizontal interpolation method (-1 = default) 79 84 80 85 INTEGER, DIMENSION(imaxavtypes) :: & … … 136 141 !! ! 15-02 (M. Martin) Simplification of namelist and code 137 142 !!---------------------------------------------------------------------- 143 #if defined key_cice 144 USE sbc_oce, ONLY : & ! CICE variables 145 & thick_s ! snow depth for freeboard conversion 146 #endif 138 147 139 148 IMPLICIT NONE … … 157 166 & cn_slafbfiles, & ! Sea level anomaly input filenames 158 167 & cn_sicfbfiles, & ! Seaice concentration input filenames 168 & cn_sitfbfiles, & ! Seaice thickness input filenames 159 169 & cn_velfbfiles, & ! Velocity profile input filenames 160 170 & cn_sssfbfiles, & ! Sea surface salinity input filenames … … 189 199 190 200 201 LOGICAL :: ln_seaicetypes = .FALSE. ! Logical switch indicating data type is sea ice 191 202 LOGICAL :: ln_t3d ! Logical switch for temperature profiles 192 203 LOGICAL :: ln_s3d ! Logical switch for salinity profiles … … 194 205 LOGICAL :: ln_sst ! Logical switch for sea surface temperature 195 206 LOGICAL :: ln_sic ! Logical switch for sea ice concentration 207 LOGICAL :: ln_sit ! Logical switch for sea ice thickness 196 208 LOGICAL :: ln_sss ! Logical switch for sea surface salinity obs 197 209 LOGICAL :: ln_vel3d ! Logical switch for velocity (u,v) obs … … 252 264 253 265 NAMELIST/namobs/ln_diaobs, ln_t3d, ln_s3d, ln_sla, & 254 & ln_sst, ln_sic, ln_s ss, ln_vel3d, &266 & ln_sst, ln_sic, ln_sit, ln_sss, ln_vel3d, & 255 267 & ln_slchltot, ln_slchldia, ln_slchlnon, & 256 268 & ln_slchldin, ln_slchlmic, ln_slchlnan, & … … 269 281 & ln_sla_fp_indegs, ln_sst_fp_indegs, & 270 282 & ln_sss_fp_indegs, ln_sic_fp_indegs, & 283 & ln_sit_fp_indegs, & 271 284 & cn_profbfiles, cn_slafbfiles, & 272 285 & cn_sstfbfiles, cn_sicfbfiles, & 286 & cn_sitfbfiles, & 273 287 & cn_velfbfiles, cn_sssfbfiles, & 274 288 & cn_slchltotfbfiles, cn_slchldiafbfiles, & … … 292 306 & rn_sss_avglamscl, rn_sss_avgphiscl, & 293 307 & rn_sic_avglamscl, rn_sic_avgphiscl, & 308 & rn_sit_avglamscl, rn_sit_avgphiscl, & 294 309 & nn_1dint, nn_2dint_default, & 295 310 & nn_2dint_sla, nn_2dint_sst, & 296 & nn_2dint_sss, nn_2dint_sic, 311 & nn_2dint_sss, nn_2dint_sic, nn_2dint_sit, & 297 312 & nn_msshc, rn_mdtcorr, rn_mdtcutoff, & 298 313 & nn_profdavtypes … … 307 322 cn_sstfbfiles(:) = '' 308 323 cn_sicfbfiles(:) = '' 324 cn_sitfbfiles(:) = '' 309 325 cn_velfbfiles(:) = '' 310 326 cn_sssfbfiles(:) = '' … … 369 385 WRITE(numout,*) ' Logical switch for SLA observations ln_sla = ', ln_sla 370 386 WRITE(numout,*) ' Logical switch for SST observations ln_sst = ', ln_sst 371 WRITE(numout,*) ' Logical switch for Sea Ice observations ln_sic = ', ln_sic 387 WRITE(numout,*) ' Logical switch for SIC observations ln_sic = ', ln_sic 388 WRITE(numout,*) ' Logical switch for SIT observations ln_sit = ', ln_sit 372 389 WRITE(numout,*) ' Logical switch for velocity observations ln_vel3d = ', ln_vel3d 373 390 WRITE(numout,*) ' Logical switch for SSS observations ln_sss = ', ln_sss … … 408 425 WRITE(numout,*) ' Type of horizontal interpolation method for SSS nn_2dint_sss = ', nn_2dint_sss 409 426 WRITE(numout,*) ' Type of horizontal interpolation method for SIC nn_2dint_sic = ', nn_2dint_sic 427 WRITE(numout,*) ' Type of horizontal interpolation method for SIT nn_2dint_sit = ', nn_2dint_sit 410 428 WRITE(numout,*) ' Default E/W diameter of obs footprint rn_default_avglamscl = ', rn_default_avglamscl 411 429 WRITE(numout,*) ' Default N/S diameter of obs footprint rn_default_avgphiscl = ', rn_default_avgphiscl … … 420 438 WRITE(numout,*) ' SIC N/S diameter of obs footprint rn_sic_avgphiscl = ', rn_sic_avgphiscl 421 439 WRITE(numout,*) ' SIC obs footprint in deg [T] or m [F] ln_sic_fp_indegs = ', ln_sic_fp_indegs 440 WRITE(numout,*) ' SIT E/W diameter of obs footprint rn_sit_avglamscl = ', rn_sit_avglamscl 441 WRITE(numout,*) ' SIT N/S diameter of obs footprint rn_sit_avgphiscl = ', rn_sit_avgphiscl 442 WRITE(numout,*) ' SIT obs footprint in deg [T] or m [F] ln_sit_fp_indegs = ', ln_sit_fp_indegs 422 443 WRITE(numout,*) ' Rejection of observations near land switch ln_nea = ', ln_nea 423 444 WRITE(numout,*) ' Rejection of obs near open bdys ln_bound_reject = ', ln_bound_reject … … 441 462 & ln_pchltot, ln_pno3, ln_psi4, ln_ppo4, & 442 463 & ln_pdic, ln_palk, ln_pph, ln_po2 /) ) 443 nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_s ss,&464 nsurftypes = COUNT( (/ln_sla, ln_sst, ln_sic, ln_sit, ln_sss, & 444 465 & ln_slchltot, ln_slchldia, ln_slchlnon, ln_slchldin, & 445 466 & ln_slchlmic, ln_slchlnan, ln_slchlpic, ln_schltot, & … … 560 581 cobstypessurf(jtype) = 'sic' 561 582 clsurffiles(jtype,:) = cn_sicfbfiles 583 ENDIF 584 IF (ln_sit) THEN 585 jtype = jtype + 1 586 cobstypessurf(jtype) = 'sit' 587 clsurffiles(jtype,:) = cn_sitfbfiles 562 588 ENDIF 563 589 IF (ln_sss) THEN … … 675 701 ztype_avgphiscl = rn_sic_avgphiscl 676 702 ltype_fp_indegs = ln_sic_fp_indegs 703 ltype_night = .FALSE. 704 ELSE IF ( TRIM(cobstypessurf(jtype)) == 'sit' ) THEN 705 IF ( nn_2dint_sit == -1 ) THEN 706 n2dint_type = nn_2dint_default 707 ELSE 708 n2dint_type = nn_2dint_sit 709 ENDIF 710 ztype_avglamscl = rn_sit_avglamscl 711 ztype_avgphiscl = rn_sit_avgphiscl 712 ltype_fp_indegs = ln_sit_fp_indegs 677 713 ltype_night = .FALSE. 678 714 ELSE IF ( TRIM(cobstypessurf(jtype)) == 'sss' ) THEN … … 863 899 & ltype_clim = .TRUE. 864 900 865 IF ( TRIM(cobstypessurf(jtype)) == 'sla' ) THEN 901 IF ( (TRIM(cobstypessurf(jtype)) == 'sla') .OR. & 902 & (TRIM(cobstypessurf(jtype)) == 'sit') ) THEN 866 903 nvarssurf(jtype) = 1 867 904 nextrsurf(jtype) = 2 … … 879 916 ELSE IF ( TRIM(cobstypessurf(jtype)) == 'sic' ) THEN 880 917 clvars(1) = 'ICECONC' 918 ELSE IF ( TRIM(cobstypessurf(jtype)) == 'sit' ) THEN 919 clvars(1) = 'FBD' 920 ln_seaicetypes = .TRUE. 881 921 ELSE IF ( TRIM(cobstypessurf(jtype)) == 'sss' ) THEN 882 922 clvars(1) = 'SSS' … … 920 960 & llnightav(jtype), ltype_clim, ln_time_mean_sla_bkg, clvars ) 921 961 922 CALL obs_pre_surf( surfdata(jtype), surfdataqc(jtype), ln_nea, ln_bound_reject )962 CALL obs_pre_surf( surfdata(jtype), surfdataqc(jtype), ln_nea, ln_bound_reject, ln_seaicetypes ) 923 963 924 964 IF ( TRIM(cobstypessurf(jtype)) == 'sla' ) THEN … … 927 967 & CALL obs_rea_altbias ( surfdataqc(jtype), n2dintsurf(jtype), cn_altbiasfile ) 928 968 ENDIF 969 970 #if defined key_cice 971 IF ( TRIM(cobstypessurf(jtype)) == 'sit' ) THEN 972 CALL obs_rea_snowdepth( surfdataqc(jtype), n2dintsurf(jtype), thick_s(:,:) ) 973 ENDIF 974 #endif 929 975 930 976 IF ( TRIM(cobstypessurf(jtype)) == 'sst' .AND. ln_sstbias ) THEN … … 995 1041 #endif 996 1042 #if defined key_cice 997 USE sbc_oce, ONLY : fr_i ! ice fraction 1043 USE sbc_oce, ONLY : & ! CICE variables 1044 & fr_i, & ! ice fraction 1045 & thick_i ! ice thickness 998 1046 #endif 999 1047 #if defined key_top … … 1329 1377 & 'time-step but some obs are valid then.' ) 1330 1378 WRITE(numout,*)surfdataqc(jtype)%nsstpmpp(1), & 1331 & ' sea-ice obs will be missed'1379 & ' sea-ice concentration obs will be missed' 1332 1380 ENDIF 1333 surfdataqc(jtype)%nsurfup = surfdataqc(jtype)%nsurfup + &1334 & surfdataqc(jtype)%nsstp(1)1335 CYCLE1336 1381 ELSE 1337 1382 #if defined key_cice … … 1340 1385 zsurfvar(:,:) = 1._wp - frld(:,:) 1341 1386 #else 1342 CALL ctl_stop( ' Trying to run sea-ice observation operator', &1387 CALL ctl_stop( ' Trying to run sea-ice concentration observation operator', & 1343 1388 & ' but no sea-ice model appears to have been defined' ) 1389 #endif 1390 ENDIF 1391 1392 CASE('sit') 1393 IF ( kstp == 0 ) THEN 1394 IF ( lwp .AND. surfdataqc(jtype)%nsstpmpp(1) > 0 ) THEN 1395 CALL ctl_warn( 'Sea-ice not initialised on zeroth '// & 1396 & 'time-step but some obs are valid then.' ) 1397 WRITE(numout,*)surfdataqc(jtype)%nsstpmpp(1), & 1398 & ' sea-ice thickness obs will be missed and QC flag set to 4' 1399 ENDIF 1400 ELSE 1401 #if defined key_cice 1402 zsurfvar(:,:) = thick_i(:,:) 1403 #elif defined key_lim2 || defined key_lim3 1404 CALL ctl_stop( ' No sea-ice thickness observation operator defined for LIM model' ) 1405 #else 1406 CALL ctl_stop( ' Trying to run sea-ice thickness observation operator', & 1407 & ' but no sea-ice model appears to have been defined' ) 1344 1408 #endif 1345 1409 ENDIF … … 1641 1705 & lfpindegs(jtype), kmeanstp = imeanstp ) 1642 1706 1707 1643 1708 ELSE 1644 1709 CALL obs_surf_opt( surfdataqc(jtype), kstp, jpi, jpj, & … … 1648 1713 & ravglamscl(jtype), ravgphiscl(jtype), & 1649 1714 & lfpindegs(jtype) ) 1715 ENDIF 1716 1717 ! Change label of data from FBD ("freeboard") to SIT ("Sea Ice 1718 ! Thickness") 1719 IF ( TRIM(surfdataqc(jtype)%cvars(1)) == 'FBD' ) THEN 1720 surfdata(jtype)%cvars(1) = 'SIT' 1650 1721 ENDIF 1651 1722 -
branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM/NEMO/OPA_SRC/OBS/obs_oper.F90
r12140 r12610 37 37 USE obs_grid, ONLY : & 38 38 & obs_level_search 39 #if defined key_cice 40 USE ice_constants, ONLY : & ! For conversion from sea ice freeboard to thickness 41 & rhos, rhoi, rhow 42 #endif 39 43 40 44 IMPLICIT NONE … … 943 947 ENDIF 944 948 ENDIF 945 949 950 IF ( surfdataqc%lclim ) surfdataqc%rclm(jobs,1) = zclm(1) 951 952 #if defined key_cice 953 IF ( TRIM(surfdataqc%cvars(1)) == 'FBD' ) THEN 954 ! Convert radar freeboard to true freeboard (add 1/4 snow depth; 1/4 based on ratio of speed of light in vacuum compared to snow (3.0e8 vs 2.4e8 m/s)) 955 surfdataqc%rext(jobs,1) = surfdataqc%robs(jobs,1) 956 surfdataqc%robs(jobs,1) = surfdataqc%rext(jobs,1) + 0.25*surfdataqc%rext(jobs,2) 957 ! If the corrected freeboard observation is outside -0.3 to 3.0 m (CPOM) then set the QC flag to bad 958 IF ((surfdataqc%robs(jobs,1) < -0.3) .OR. (surfdataqc%robs(jobs,1) > 3.0)) THEN 959 surfdataqc%nqc(jobs) = 4 960 ENDIF 961 ! Convert corrected freeboard to ice thickness following Tilling et al. (2016) 962 surfdataqc%robs(jobs,1) = (surfdataqc%robs(jobs,1)*rhow + surfdataqc%rext(jobs,2)*rhos)/ & 963 (rhow - rhoi) 964 ! Flag any negative ice thickness values as bad 965 IF (surfdataqc%robs(jobs,1) < 0.0) THEN 966 surfdataqc%nqc(jobs) = 4 967 ENDIF 968 ENDIF 969 970 IF ( zext(1) == obfillflt ) THEN 971 ! If the observation value is a fill value, set QC flag to bad 972 surfdataqc%nqc(jobs) = 4 973 ENDIF 974 #endif defined key_cice 975 946 976 END DO 947 977 -
branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM/NEMO/OPA_SRC/OBS/obs_prep.F90
r12506 r12610 54 54 55 55 SUBROUTINE obs_pre_surf( surfdata, surfdataqc, ld_nea, ld_bound_reject, & 56 kqc_cutoff )56 ld_seaicetypes, kqc_cutoff ) 57 57 !!---------------------------------------------------------------------- 58 58 !! *** ROUTINE obs_pre_sla *** … … 84 84 LOGICAL, INTENT(IN) :: ld_nea ! Switch for rejecting observation near land 85 85 LOGICAL, INTENT(IN) :: ld_bound_reject ! Switch for rejecting obs near the boundary 86 INTEGER, INTENT(IN), OPTIONAL :: kqc_cutoff ! cut off for QC value 86 LOGICAL, INTENT(IN) :: ld_seaicetypes ! Switch to indicate sea ice data 87 INTEGER, INTENT(IN), OPTIONAL :: kqc_cutoff ! cut off for QC value 87 88 !! * Local declarations 88 89 INTEGER :: iqc_cutoff = 255 ! cut off for QC value … … 141 142 ! ----------------------------------------------------------------------- 142 143 143 CALL obs_coo_tim( icycle, & 144 & iyea0, imon0, iday0, ihou0, imin0, & 145 & surfdata%nsurf, surfdata%nyea, surfdata%nmon, & 146 & surfdata%nday, surfdata%nhou, surfdata%nmin, & 147 & surfdata%nqc, surfdata%mstp, iotdobs ) 144 IF ( ld_seaicetypes ) THEN 145 CALL obs_coo_tim( icycle, & 146 & iyea0, imon0, iday0, ihou0, imin0, & 147 & surfdata%nsurf, surfdata%nyea, surfdata%nmon, & 148 & surfdata%nday, surfdata%nhou, surfdata%nmin, & 149 & surfdata%nqc, surfdata%mstp, iotdobs, & 150 & ld_seaicetypes = ld_seaicetypes ) 151 ELSE 152 CALL obs_coo_tim( icycle, & 153 & iyea0, imon0, iday0, ihou0, imin0, & 154 & surfdata%nsurf, surfdata%nyea, surfdata%nmon, & 155 & surfdata%nday, surfdata%nhou, surfdata%nmin, & 156 & surfdata%nqc, surfdata%mstp, iotdobs ) 157 ENDIF 148 158 149 159 CALL obs_mpp_sum_integer( iotdobs, iotdobsmpp ) … … 559 569 & kobsno, & 560 570 & kobsyea, kobsmon, kobsday, kobshou, kobsmin, & 561 & kobsqc, kobsstp, kotdobs 571 & kobsqc, kobsstp, kotdobs, ld_seaicetypes ) 562 572 !!---------------------------------------------------------------------- 563 573 !! *** ROUTINE obs_coo_tim *** … … 607 617 & kobsstp ! Number of time steps up to the 608 618 ! observation time 619 LOGICAL, OPTIONAL, INTENT(IN) :: ld_seaicetypes 609 620 610 621 !! * Local declarations … … 621 632 INTEGER :: iskip 622 633 INTEGER :: idaystp 634 INTEGER :: icecount 623 635 REAL(KIND=wp) :: zminstp 624 636 REAL(KIND=wp) :: zhoustp … … 715 727 CYCLE 716 728 ENDIF 729 730 ! Flag sea ice observations falling on initial timestep 731 IF ( PRESENT(ld_seaicetypes) ) THEN 732 733 IF ( ( kobsstp(jobs) == (nit000 - 1) ) ) THEN 734 IF (lwp) WRITE(numout,*)( 'Sea-ice not initialised on zeroth '// & 735 & 'time-step but SIT observation valid then, flagging '// & 736 'in time check subroutine obs_coo_tim.' ) 737 kobsqc(jobs) = IBSET(kobsqc(jobs),13) 738 kotdobs = kotdobs + 1 739 CYCLE 740 ENDIF 741 ENDIF 717 742 718 743 END DO -
branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM/NEMO/OPA_SRC/OBS/obs_read_surf.F90
r12140 r12610 396 396 surfdata%cext(2) = 'MDT' 397 397 ENDIF 398 IF ( ldmod .AND. ( TRIM( surfdata%cvars(1) ) == 'FBD' ) ) THEN 399 surfdata%cext(1) = 'freeboard' 400 surfdata%cext(2) = 'thick_s' 401 ENDIF 398 402 IF ( iextr > kextr ) surfdata%cext(iextr) = 'STD' 399 403 … … 477 481 ! Observed value 478 482 surfdata%robs(iobs,1) = inpfiles(jj)%pob(1,ji,1) 483 IF ( TRIM(surfdata%cvars(1)) == 'FBD' ) THEN 484 surfdata%rext(iobs,1) = inpfiles(jj)%pob(1,ji,1) 485 surfdata%rext(iobs,2) = fbrmdi 486 ENDIF 479 487 480 488 ! Model and MDT is set to fbrmdi unless read from file -
branches/UKMO/dev_r5518_obs_oper_update/NEMOGCM/NEMO/OPA_SRC/OBS/obs_write.F90
r11546 r12610 530 530 531 531 clfiletype = 'sicfb' 532 cllongname = 'Sea ice '532 cllongname = 'Sea ice concentration' 533 533 clunits = 'Fraction' 534 clgrid = 'T' 535 536 CASE('SIT') 537 538 clfiletype = 'sitfb' 539 cllongname = 'Sea ice thickness' 540 clunits = 'm' 534 541 clgrid = 'T' 535 542
Note: See TracChangeset
for help on using the changeset viewer.