- Timestamp:
- 2020-03-26T12:30:42+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5518_GO6_package_FOAMv14/NEMOGCM/NEMO/OPA_SRC/ASM/asminc.F90
r10302 r12613 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 … … 41 42 #if defined key_cice && defined key_asminc 42 43 USE sbc_ice, ONLY : & ! CICE Ice model variables 43 & ndaice_da, n fresh_da, nfsalt_da44 & ndaice_da, ndsit_da, nfresh_da, nfsalt_da 44 45 #endif 45 46 USE sbc_oce ! Surface boundary condition variables. … … 54 55 PUBLIC dyn_asm_inc !: Apply the dynamic (u and v) increments 55 56 PUBLIC ssh_asm_inc !: Apply the SSH increment 56 PUBLIC seaice_asm_inc !: Apply the seaice increment 57 PUBLIC seaice_asm_inc !: Apply the seaice concentration increment 58 PUBLIC sit_asm_inc !: Apply the seaice thickness increment 57 59 PUBLIC bgc_asm_inc !: Apply the biogeochemistry increments 58 60 … … 63 65 #endif 64 66 LOGICAL, PUBLIC :: ln_bkgwri = .FALSE. !: No output of the background state fields 67 LOGICAL, PUBLIC :: ln_avgbkg = .FALSE. !: No output of the mean background state fields 65 68 LOGICAL, PUBLIC :: ln_asmiau = .FALSE. !: No applying forcing with an assimilation increment 66 69 LOGICAL, PUBLIC :: ln_asmdin = .FALSE. !: No direct initialization … … 68 71 LOGICAL, PUBLIC :: ln_dyninc = .FALSE. !: No dynamics (u and v) assimilation increments 69 72 LOGICAL, PUBLIC :: ln_sshinc = .FALSE. !: No sea surface height assimilation increment 70 LOGICAL, PUBLIC :: ln_seaiceinc !: No sea ice concentration increment 73 LOGICAL, PUBLIC :: ln_seaiceinc = .FALSE. !: No sea ice concentration increment 74 LOGICAL, PUBLIC :: ln_sitinc = .FALSE. !: No sea ice thickness increment 71 75 LOGICAL, PUBLIC :: lk_bgcinc = .FALSE. !: No biogeochemistry increments 72 76 LOGICAL, PUBLIC :: ln_salfix = .FALSE. !: Apply minimum salinity check … … 94 98 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: ssh_bkg, ssh_bkginc ! Background sea surface height and its increment 95 99 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: seaice_bkginc ! Increment to the background sea ice conc 100 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: sit_bkginc ! Increment to the background sea ice thickness 96 101 97 102 !! * Substitutions … … 136 141 REAL(wp), POINTER, DIMENSION(:,:) :: hdiv ! 2D workspace 137 142 !! 138 NAMELIST/nam_asminc/ ln_bkgwri, ln_ balwri,&143 NAMELIST/nam_asminc/ ln_bkgwri, ln_avgbkg, ln_balwri, & 139 144 & ln_trainc, ln_dyninc, ln_sshinc, & 140 145 & ln_phytobal, ln_slchltotinc, ln_slchldiainc, & … … 147 152 & nitbkg, nitdin, nitiaustr, nitiaufin, niaufn, & 148 153 & ln_salfix, salfixmin, nn_divdmp, & 149 & ln_seaiceinc, ln_ temnofreeze,&154 & ln_seaiceinc, ln_sitinc, ln_temnofreeze, & 150 155 & mld_choice_bgc, rn_maxchlinc 151 156 !!---------------------------------------------------------------------- … … 155 160 !----------------------------------------------------------------------- 156 161 ln_seaiceinc = .FALSE. 162 ln_sitinc = .FALSE. 157 163 ln_temnofreeze = .FALSE. 158 164 … … 173 179 WRITE(numout,*) ' Namelist nam_asminc : set assimilation increment parameters' 174 180 WRITE(numout,*) ' Logical switch for writing out background state ln_bkgwri = ', ln_bkgwri 181 WRITE(numout,*) ' Logical switch for writing mean background state ln_avgbkg = ', ln_avgbkg 175 182 WRITE(numout,*) ' Logical switch for writing out balancing increments ln_balwri = ', ln_balwri 176 183 WRITE(numout,*) ' Logical switch for applying tracer increments ln_trainc = ', ln_trainc 177 184 WRITE(numout,*) ' Logical switch for applying velocity increments ln_dyninc = ', ln_dyninc 178 185 WRITE(numout,*) ' Logical switch for applying SSH increments ln_sshinc = ', ln_sshinc 186 WRITE(numout,*) ' Logical switch for applying SIC increments ln_seaiceinc = ', ln_seaiceinc 187 WRITE(numout,*) ' Logical switch for applying SIT increments ln_sitinc = ', ln_sitinc 179 188 WRITE(numout,*) ' Logical switch for Direct Initialization (DI) ln_asmdin = ', ln_asmdin 180 WRITE(numout,*) ' Logical switch for applying sea ice increments ln_seaiceinc = ', ln_seaiceinc 189 WRITE(numout,*) ' Logical switch for Incremental Analysis Updating (IAU) ln_asmiau = ', ln_asmiau 190 WRITE(numout,*) ' Timestep of background in [0,nitend-nit000-1] nitbkg = ', nitbkg 191 WRITE(numout,*) ' Timestep of background for DI in [0,nitend-nit000-1] nitdin = ', nitdin 192 WRITE(numout,*) ' Timestep of start of IAU interval in [0,nitend-nit000-1] nitiaustr = ', nitiaustr 193 WRITE(numout,*) ' Timestep of end of IAU interval in [0,nitend-nit000-1] nitiaufin = ', nitiaufin 194 WRITE(numout,*) ' Type of IAU weighting function niaufn = ', niaufn 195 WRITE(numout,*) ' Logical switch for ensuring that the sa > salfixmin ln_salfix = ', ln_salfix 196 WRITE(numout,*) ' Minimum salinity after applying the increments salfixmin = ', salfixmin 181 197 WRITE(numout,*) ' Logical switch for phytoplankton balancing ln_phytobal = ', ln_phytobal 182 198 WRITE(numout,*) ' Logical switch for applying slchltot increments ln_slchltotinc = ', ln_slchltotinc … … 197 213 WRITE(numout,*) ' Logical switch for applying pph increments ln_pphinc = ', ln_pphinc 198 214 WRITE(numout,*) ' Logical switch for applying po2 increments ln_po2inc = ', ln_po2inc 199 WRITE(numout,*) ' Logical switch for Incremental Analysis Updating (IAU) ln_asmiau = ', ln_asmiau200 WRITE(numout,*) ' Timestep of background in [0,nitend-nit000-1] nitbkg = ', nitbkg201 WRITE(numout,*) ' Timestep of background for DI in [0,nitend-nit000-1] nitdin = ', nitdin202 WRITE(numout,*) ' Timestep of start of IAU interval in [0,nitend-nit000-1] nitiaustr = ', nitiaustr203 WRITE(numout,*) ' Timestep of end of IAU interval in [0,nitend-nit000-1] nitiaufin = ', nitiaufin204 WRITE(numout,*) ' Type of IAU weighting function niaufn = ', niaufn205 WRITE(numout,*) ' Logical switch for ensuring that the sa > salfixmin ln_salfix = ', ln_salfix206 WRITE(numout,*) ' Minimum salinity after applying the increments salfixmin = ', salfixmin207 215 WRITE(numout,*) ' Choice of MLD for BGC assimilation mld_choice_bgc = ', mld_choice_bgc 208 216 WRITE(numout,*) ' Maximum absolute chlorophyll increment (<=0 = off) rn_maxchlinc = ', rn_maxchlinc … … 264 272 IF ( ( ( .NOT. ln_asmdin ).AND.( .NOT. ln_asmiau ) ) & 265 273 & .AND.( ( ln_trainc ).OR.( ln_dyninc ).OR.( ln_sshinc ).OR.( ln_seaiceinc ).OR. & 266 & ( l k_bgcinc ) )) &274 & ( ln_sitinc ).OR.( lk_bgcinc ) )) & 267 275 & CALL ctl_stop( ' One or more of ln_trainc, ln_dyninc, ln_sshinc, ln_seaiceinc,', & 268 & ' ln_ (bgc-variable)inc is set to .true.', &276 & ' ln_sitinc and ln_(bgc-variable)inc is set to .true.', & 269 277 & ' but ln_asmdin and ln_asmiau are both set to .false. :', & 270 278 & ' Inconsistent options') … … 275 283 276 284 IF ( ( .NOT. ln_trainc ).AND.( .NOT. ln_dyninc ).AND.( .NOT. ln_sshinc ).AND.( .NOT. ln_seaiceinc ) & 277 & .AND.( .NOT. l k_bgcinc ) ) &285 & .AND.( .NOT. ln_sitinc ).AND.( .NOT. lk_bgcinc ) ) & 278 286 & CALL ctl_warn( ' ln_trainc, ln_dyninc, ln_sshinc, ln_seaiceinc,', & 279 & ' ln_ (bgc-variable)inc are set to .false. :', &287 & ' ln_sitinc and ln_(bgc-variable)inc are set to .false. :', & 280 288 & ' The assimilation increments are not applied') 281 289 … … 377 385 !-------------------------------------------------------------------- 378 386 379 ALLOCATE( t_bkginc(jpi,jpj,jpk) ) 380 ALLOCATE( s_bkginc(jpi,jpj,jpk) ) 381 ALLOCATE( u_bkginc(jpi,jpj,jpk) ) 382 ALLOCATE( v_bkginc(jpi,jpj,jpk) ) 383 ALLOCATE( ssh_bkginc(jpi,jpj) ) 384 ALLOCATE( seaice_bkginc(jpi,jpj)) 387 IF ( ln_trainc ) THEN 388 ALLOCATE( t_bkginc(jpi,jpj,jpk) ) 389 ALLOCATE( s_bkginc(jpi,jpj,jpk) ) 390 t_bkginc(:,:,:) = 0.0 391 s_bkginc(:,:,:) = 0.0 392 ENDIF 393 IF ( ln_dyninc ) THEN 394 ALLOCATE( u_bkginc(jpi,jpj,jpk) ) 395 ALLOCATE( v_bkginc(jpi,jpj,jpk) ) 396 u_bkginc(:,:,:) = 0.0 397 v_bkginc(:,:,:) = 0.0 398 ENDIF 399 IF ( ln_sshinc ) THEN 400 ALLOCATE( ssh_bkginc(jpi,jpj) ) 401 ssh_bkginc(:,:) = 0.0 402 ENDIF 403 IF ( ln_seaiceinc ) THEN 404 ALLOCATE( seaice_bkginc(jpi,jpj)) 405 seaice_bkginc(:,:) = 0.0 406 ENDIF 407 IF ( ln_sitinc ) THEN 408 ALLOCATE( sit_bkginc(jpi,jpj)) 409 sit_bkginc(:,:) = 0.0 410 ENDIF 385 411 #if defined key_asminc 386 412 ALLOCATE( ssh_iau(jpi,jpj) ) 387 #endif388 t_bkginc(:,:,:) = 0.0389 s_bkginc(:,:,:) = 0.0390 u_bkginc(:,:,:) = 0.0391 v_bkginc(:,:,:) = 0.0392 ssh_bkginc(:,:) = 0.0393 seaice_bkginc(:,:) = 0.0394 #if defined key_asminc395 413 ssh_iau(:,:) = 0.0 396 414 #endif 397 415 IF ( ( ln_trainc ).OR.( ln_dyninc ).OR.( ln_sshinc ).OR.( ln_seaiceinc ) & 398 & .OR.( l k_bgcinc ) ) THEN416 & .OR.( ln_sitinc ).OR.( lk_bgcinc ) ) THEN 399 417 400 418 !-------------------------------------------------------------------- … … 459 477 ! to allow for differences in masks 460 478 WHERE( ABS( ssh_bkginc(:,:) ) > 1.0e+10 ) ssh_bkginc(:,:) = 0.0 479 ENDIF 480 481 IF ( ln_sitinc ) THEN 482 CALL iom_get( inum, jpdom_autoglo, 'bckinsit', sit_bkginc, 1 ) 483 ! Apply the masks 484 sit_bkginc(:,:) = sit_bkginc(:,:) * tmask(:,:,1) 485 ! Set missing increments to 0.0 rather than 1e+20 486 ! to allow for differences in masks 487 WHERE( ABS( sit_bkginc(:,:) ) > 1.0e+10 ) sit_bkginc(:,:) = 0.0 461 488 ENDIF 462 489 … … 827 854 ! Perhaps the following call should be in step 828 855 IF ( ln_seaiceinc ) CALL seaice_asm_inc ( kt ) ! apply sea ice concentration increment 856 IF ( ln_sitinc ) CALL sit_asm_inc ( kt ) ! apply sea ice thickness increment 829 857 ! 830 858 END SUBROUTINE tra_asm_inc … … 988 1016 END SUBROUTINE ssh_asm_inc 989 1017 1018 SUBROUTINE sit_asm_inc( kt, kindic ) 1019 !!---------------------------------------------------------------------- 1020 !! *** ROUTINE sit_asm_inc *** 1021 !! 1022 !! ** Purpose : Apply the sea ice thickness assimilation increment. 1023 !! 1024 !! ** Method : Direct initialization or Incremental Analysis Updating. 1025 !! 1026 !! ** Action : 1027 !! 1028 !!---------------------------------------------------------------------- 1029 IMPLICIT NONE 1030 ! 1031 INTEGER, INTENT(in) :: kt ! Current time step 1032 INTEGER, INTENT(in), OPTIONAL :: kindic ! flag for disabling the deallocation 1033 ! 1034 INTEGER :: it 1035 REAL(wp) :: zincwgt ! IAU weight for current time step 1036 !!---------------------------------------------------------------------- 1037 1038 IF ( ln_asmiau ) THEN 1039 1040 !-------------------------------------------------------------------- 1041 ! Incremental Analysis Updating 1042 !-------------------------------------------------------------------- 1043 1044 IF ( ( kt >= nitiaustr_r ).AND.( kt <= nitiaufin_r ) ) THEN 1045 1046 it = kt - nit000 + 1 1047 zincwgt = wgtiau(it) ! IAU weight for the current time step 1048 ! note this is not a tendency so should not be divided by rdt (as with the tracer and other increments) 1049 ! EF: Actually CICE is expecting a tendency so is divided by rdt below 1050 1051 IF(lwp) THEN 1052 WRITE(numout,*) 1053 WRITE(numout,*) 'sit_asm_inc : sea ice thick IAU at time step = ', & 1054 & kt,' with IAU weight = ', wgtiau(it) 1055 WRITE(numout,*) '~~~~~~~~~~~~' 1056 ENDIF 1057 1058 #if defined key_cice && defined key_asminc 1059 ! Sea-ice thickness : CICE case. Pass ice thickness increment tendency into CICE 1060 ndsit_da(:,:) = sit_bkginc(:,:) * zincwgt / rdt 1061 #endif 1062 1063 IF ( kt == nitiaufin_r ) THEN 1064 DEALLOCATE( sit_bkginc ) 1065 ENDIF 1066 1067 ELSE 1068 1069 #if defined key_cice && defined key_asminc 1070 ! Sea-ice thickness : CICE case. Zero ice increment tendency into CICE 1071 ndsit_da(:,:) = 0.0_wp 1072 #endif 1073 1074 ENDIF 1075 1076 ELSEIF ( ln_asmdin ) THEN 1077 1078 !-------------------------------------------------------------------- 1079 ! Direct Initialization 1080 !-------------------------------------------------------------------- 1081 1082 IF ( kt == nitdin_r ) THEN 1083 1084 neuler = 0 ! Force Euler forward step 1085 1086 #if defined key_cice && defined key_asminc 1087 ! Sea-ice thickness : CICE case. Pass ice thickness increment tendency into CICE 1088 ndsit_da(:,:) = sit_bkginc(:,:) / rdt 1089 #endif 1090 IF ( .NOT. PRESENT(kindic) ) THEN 1091 DEALLOCATE( sit_bkginc ) 1092 END IF 1093 1094 ELSE 1095 1096 #if defined key_cice && defined key_asminc 1097 ! Sea-ice thicnkness : CICE case. Zero ice thickness increment tendency into CICE 1098 ndsit_da(:,:) = 0.0_wp 1099 #endif 1100 1101 ENDIF 1102 1103 ENDIF 1104 1105 END SUBROUTINE sit_asm_inc 990 1106 991 1107 SUBROUTINE seaice_asm_inc( kt, kindic ) … … 993 1109 !! *** ROUTINE seaice_asm_inc *** 994 1110 !! 995 !! ** Purpose : Apply the sea ice assimilation increment.1111 !! ** Purpose : Apply the sea ice concentration assimilation increment. 996 1112 !! 997 1113 !! ** Method : Direct initialization or Incremental Analysis Updating.
Note: See TracChangeset
for help on using the changeset viewer.